[C#] ให้ Log4net เขียน Log แยกตาม Process Id ของ Application

Ref https://pixabay.com/th/การวิเคราะห์-ข้อมูล-นวัตกรรม-3088958/

จาก Blog ตอนก่อนของ Site ได้ Deploy ตัว .Net App ไว้ที่ Windows Server ไว้ที่ Drive C: แล้วให้ User Remote เข้ามาใช้งานครับ แต่พอเวลามีปัญหามันดัน Write Log ไม่ได้ครับ เพราะ Application ทุกตัวที่ที่รันขึ้นมา ดันเขียน Log ลงไปที่ Path และไฟล์ชื่อเดียวกันครับ ทำให้ User สามารถเปิดโปรแกรมใช้งานได้แค่ 1 Instance เท่านั้นครับ เมื่อทาง Dev ต้องการหาสาเหตุของ Defect บางข้อครับ แต่เรื่องนี้มันก็ขัดใจสำหรับ User มากๆ ที่ไม่สามารทำงานได้ครับ

สำหรับทางแก้ – ใช้ Log4Net มันเขียน Log File ตาม Process Id ของ exe ที่เปิดอยู่ครับ โดยสามารถไปแก้ที่ตัว Appender ได้ ดังนี้

  • ของเดิม – ที่ RollingLogFileAppender เขียน Log โดยระบุชื่อไฟ์ไปตรงๆเลยครับ
  • ของใหม่ – มีการปรับที่ RollingLogFileAppender ให้ Log มันเข่ียนแยกตามไฟล์ โดยใช้ Log4Net Pattern String ครับ ซึ่งมีการกำหนด Pattern จาก Process Id ของ exe ที่ เปิดอยู่ในหน้าจอ Task Manager ครับ โดยดึง Process Id จาก Config [%processid] ส่วนวันที่อันนี้ผมเพิ่มเองครับ จะได้ดู Log ง่ายๆ โดยกำหนด Config ดังนี้ %utcdate{yyyy-MM-dd}

สำหรับตัว Appender เต็มๆครับ

โดยการเดิม  [%processid]  ลงไปใน value ที่กำหนด Path และชื่อไฟล์ ในส่วนของ PatternString

ตัวอย่างชื่อของ Log File ที่ได้มาครับ

  • EXTENSION_LOG-2018-04-16-[4588] โดยเป็น Log ของ Application Extension ณ วันที่ 2018-04-16 และมี Process Id = 4588

[C#] ทำให้การ Debug เป็นเรื่องง่าย โดยการใช้ toString()

เคยสังเกตุบ้างไหม ว่าเวลาที่ต้องการดู Data ที่เก็บอยู่ใน Object มันข่างยากลำบากเหลือเกิน ถ้าเป็น List แล้วเนี่ย ถึงกับตายได้เลย จากรูปด้านล่าง ถ้ามีใน List มี 18 ตัว ถ้าอยากหา Object ที่สนใจต้องกดไล่ดูมากที่สุดถึง 18 ครั้ง

จะมาน่ั่งไล่กดเปิดดูที่ละอันมันก็ ไม่คุ้มนะ เปลืองแรงไป ดังรูป

แล้วมันมี Trick อะไรช่วยไหม ตอบเลยว่ามีครับ ใช้ toString() สิ โดยเพิ่มเข้าไปที่ Object ของเราเลย อย่างของผม

  • ก่อนแก้ไข
  • หลังแก้ไข – เพิ่ม toString() เพื่อให้มัน Return ค่าที่อยากดูบ่อยๆ ออกมา ยัดเยอะไปก็ไม่ดีนะครับ เอาที่จำเป็นพอ

ลอง Complie แล้ว Debug ดูอีกครั้ง โอ้วมันยอดมากกกครับ สบายขึ้นเยอะเลยย สามารถดูภาพรวมของ Data ที่เก็บใน Object ได้ ไม่ต้องเสียเวลาไปไล่นั่ง Click ดูที่ละอันด้วย ^__^

[C#] มาดูกันว่า User Remote เข้ามาเปิดใช้ Application จากเครื่องไหน

ก่อนอื่นมาดูปัญหากันก่อนครับ ว่าทำไมถึงต้องไปไล่ดูว่า มีการ Remote จากเครื่อง User เพื่อมาใช้งาน Application ที่ติดตั้งบนเครื่อง Server หรือป่าว ? เพราะ IT ของลูกค้า อยากรู้ว่ามีใครใช้งานในระบบบ้าง แล้วใช้งานที่เครื่องไหน แต่บังเอิญว่ารอบนี้ ตัว Application ที่พัฒนาถูกไปติดตั้งบรเครื่อง Windows Server พอ User Remote เข้ามาใช้งาน ปรากฏว่าระบบลง Log และ Active User มาจากเครื่อง Serer ที่เป็น Windows Server ทั้งหมดเลยครับ โดยคำสั่ง C# ที่ใช้ดึงว่าเครื่องที่ Run Application อยู่ ชื่อเครื่องอะไร เป็นคำสั่งที่มีใน .Net Framework API ตามตัวอย่าง Code ด้านล่างเลยครับ

มาที่โจทยฺ์ใหม่บ้าง เพราะ คำสั่ง Environment.MachineName; มันมีข้อจำกัด ถ้าเอา Application ไปดิดตั้งบน Windows Server มันจะไม่รู้ว่า User Remote มาจากเครื่องไหนครับ คำสั่งนี้จะดึงเฉพาะ แต่ชื่อเครื่อง ของ Server แทน โดยโจทย์ที่ทาง IT ของลูกค้าต้องการ ในกรณีที่มีการ Remote เข้ามาใช้งาน Application มีรูปแบบ ดังนี้ครั

ชื่อเครื่องปลายทาง(ชื่อเครื่องต้นทาง)

หลังจากรู้โจทย์แล้ว มาดูดีกว่าครับ ว่า C# ไม่สิต้องบอกว่า .Net Framework ได้เตรียมอะไรมาช่วยไว้บ้างครับ

  • ตัว System.Windows.Forms.SystemInformation.TerminalServerSession เป็นตัวที่บอกว่า Application ที่เขียนขึ่น Run ผ่่าน Remote Desktop หรือป่าวครับ ถ้าใช่ Return True ถ้าไม่ใช่ Return False ครับ
  • ตัว Remote Desktop Services API – เอาไว้ช่วยดึงค่าบางอย่าง มาจาก Protocal RDP ครับ

Code ที่ได้ปรับปรุง

  • Method GetComputerName() อันนี้เป็น Method ที่เราเปิดให้คนภายนอกใช้นะครับ
  • Helper GetTerminalServerClientNameWTSAPI และ WTSQuerySessionInformation เอาไว้ช่วยดึงค่าที่ต้องการจาก RDP Service ครับ

ผลการทดสอบ

  • เมื่อลองเปิด Application ผ่าน Remote Desktop มันแสดงขึ้น ตาม Requirement ที่ตกลงกันไว้ข้างต้น ดังรูป

Reference

[C#] ตั้งชื่อเล่นของ Class (Alias) ให้เรียกใช้งานได้ง่าย

Reference: https://pixabay.com/en/colored-pencils-colour-pencils-star-374771/

เวลาเราพัฒนาระบบที่มันซับซ้อนๆมากๆ ปัญหาที่ปวดหัวที่สุดเลย คือ การตั้งชื่อ บางทีชื่อตัวแปรยาวๆ ถ้าย่อไป อาจจะงงได้ Dev เลยใช้ชื่อเต็มไป พอลองเอาตัวแปรเหล่านี้มาใช้ มันดูเกะกะรกตามากครับ กว่าจะรู้ว่า ตั้งชื่อเล่นของ Class (Alias) ให้เรียกใช้งานได้ง่ายกันดีกว่า โดย C# มันมีวิธีในการการตั้งชื่อเล่น(Alias) กันนะ มาดู Code เดิมกันดีกว่า

ถ้าสังเกตุใน Code พบว่า RebalanceProcessExtensions.Col_OriginalNAV ชื่อ Class RebalanceProcessExtensions มันยาวมากๆ ครับ ถ้าทำไปนานๆ Code ตรึมครับ ดูยาก ที่นี้มาลองใช้ตัวช่วยกันดีกว่า ลองใช้ Class Alias โดยการย่อชื่อ Class ไว้ช่วง using ครับ โดย Code ที่ได้จะเป็นประมาณนี้

จาก Code ใหม่ ย่อจาก RebalanceProcessExtensions ไปเป็น RBExt แล้ว Code ที่เขียนออกมา สั้นลง และดูสบายตาขึ้น ครับ

[Dapper] Query Parent-Child อย่างไร ?

หลังจากลองทำ Framework ที่เอา Dapper เป็น ORM ครับ ตอนนี้ก็ติดปัญหาว่า เราจะดึงข้อมูลที่อยู่ในรูปแบบ Parent-Child กันอย่างไรครับ โดยผมมีรายละเอียด ดังนี้

  • โจทย์ที่ผมต้องการ คือ เวลา Query ข้อมูลจาก Table Corporateaction แล้ว ให้มันดึงข้อมูลของ Table ลูก CorporateDetail ขึ้นมาให้หมด โดยการ Query เพียงคร้งเดียวเท่านั้นครับ
  • POCO Class ของผม มีโครงคร่าวๆ ดังนี้ครับ
    • Parent Class
    • Child Class
  • Query ที่ผมเขียนไว้
  • Code ในส่วนของ Data Access ผมเขียนลักษณะนี้ครับ
  • เดี๋ยวมาอธิบาย Code ของ Data Access กันก่อนครับ สังเกตุว่าจริงๆ มันก็ Query มาทั้งหมดครับ แต่ใช้ Feature Data Mapping กับ Dictionary มาช่วยจัด Data ให้อยุ่ใน Format ที่ต้องการครับ

สำหรับ Blog นี้เกิดจากการไปขุด Unit Test ของ Dapper ครับ จาก Dapper/Dapper.Tests/MultiMapTests.cs ซึ่งนั้นหมายความว่า ถ้า Library มีเป็นลักษณะ Open Source ถึงแม้ว่าเราจะไม่เจอคู่มือ แต่เราสามารถไปดู Unit Test เพื่อมาศึกษา และประยุกต์ใช้ง่ายได้ครับ ^___^

[.NET] การลง Visual Studio Build Tools

สำหรับ Blog ในวันนี้ ผมมาเขียนเกี่ยวกับตัว Microsoft Visual Build Tools หลายๆ อาจจะสงสัยว่า มัน คือ อะไร มาลองทำความรู้จักกันดีกว่าครับ ถ้าเป็นเมื่อก่อน เวลาเราเอา Code ที่เขียนขึ้นไปทำเป็นไฟล์  .exe เพื่อที่จะเอาไปติดตั้ง สิ่งที่เราต้องทำ คือ

  • เปิด Microsoft Visual Studio – กว่าจะเปิดขึ้นมาทีก็นานเหลือเกินนนนนน
  • กำหนด Config ใน Solution / Project ให้เรียบร้อย
  • หลังจากนั้นทำการกด Build – รอสักพักใหญ่ๆครับ

มันดีกว่าไหม ถ้ามีตัวช่วย Build และไม่กิน Resource เหมือน  Microsoft Visual Studio คำตอบ คือ มีครับ และทำมาหลาย Version แล้วด้วยครับ ซึ่งนั้นก็คือ Microsoft Visual Build Tools ครับ มันเกิดมา เพื่อสิ่งเดียว คือ Build และทำ Static Code Analysis ครับ โดยการติดตั้งมีขั้นตอน ดังนี้

  • Download Microsoft Visual Build Tools กันก่อนครับ
  • เลื่อนไปที่ส่วน Other Tools and Frameworks จากนั้นกด Download ตามรูปเลยครับ
  • เมื่อ Download เสร็จแล้ว มีวิธีการติดตั้ง 2 แบบครับ
    • แบบ GUI

      This slideshow requires JavaScript.

    • แบบ Command Line ครับ

[VS2017] มาปรับจูนให้มันเร็วขึ้นดีกว่า

จาก Blog เดิม [.NET] ปรับ Speed ให้ Visual Studio เร็วแรงทะลุนรก ในปี 2015 ตอนนี้ปี 2017 แล้ว ตัว Visual Studio เปลี่ยนเป็น Version 2017 ถึงแม้ว่ามันบอกว่าทำให้เร็วขึ้นแล้วนะ แต่ก็เจอปัญหาเดิมๆครับ โปรแกรมช้า โดยสาเหคุหลักๆ มาจาก

  • Anti-Virus ทำงานดีเกินไป Scan ทั้ง File และ Process โดยสามารถเอา exe ที่สำคัญ ให้ Anti-Virus ไม่สนใจ ดังนี้ครับ

หากสังเกตดีๆ แล้วพบว่า Visual Studio 2017 Patth Install มันเปลี่ยนไปนะ เป็น “C:\Program Files (x86)\Microsoft Visual Studio\2017” ครับ

[MS Cert] The Road to MCSD #04 (Ready for App Builder)

สำหรับ Blog นี้ตอนสุดท้ายของ Series MCSD: App Builder โดยผมมาสรุปว่า แต่ละวิชาที่ส่องๆ ไว้มีการเตรียมตัวอย่างไรบ้างครับ ซึ่งมี ดังนี้

  • ภาษาอังกฤษ
  • 70-480: Programming in HTML5 with JavaScript and CSS3
  • 70-483: Programming in C#
  • 70-486: Developing ASP.NET MVC Web Applications
  • 70-487: Developing Microsoft Azure and Web Services
  • แนวข้อสอบ และการสอบ

ภาษาอังกฤษ

  • ไม่ได้ลงลึกถึงพวก Grammar นะครับ เอาแค่อ่านโจทย์เข้าใจ ฝึกท่องศัพท์มาเยอะๆ
  • อ๋อ และไม่ได้มีภาษาอังกฤษ อย่างเดียวนะครับ หากใครเชี่ยวภาษาจีน เยอรมันกว่า ตอนสมัครสอบ สามารถแจ้งได้ตอนที่สมัครสอบครับ

70-480: Programming in HTML5 with JavaScript and CSS3

70-483: Programming in C#

  • สำหรับวิชานี้ ผมเตรียมตัวไว้นะ แต่ไม่ได้สอบครับ
  • ความรู้ ทักษะที่ต้องใช้ ในวิชานี้เป็นพื้นฐานของ C# ทั้งหมดเลย โดยมีเนื้อหาหลักๆที่ต้องเจอ
    • OOP
    • Control Flow
    • Object Lift Cycle
    • Generic & Collection
    • Data Access
    • Parallel vs Concurrent Programming
    • Thread
    • Exception Handle
    • และอื่นๆ อีกมากมาย
    • สำหรับในวิชานี้ มีข้อสอบแนวๆ ให้หาผลลัพธ์จาก Code ที่ใช้มาด้วย
    • ต้องสอบวิชานี้ผ่าน หรือ 70-480 ผ่าน ถึงจะไปสอบ 70-486 ได้
  • Resource/Referencec ที่ผมใช้

70-486: Developing ASP.NET MVC Web Applications

  • ใช้พื้นฐานจาก 70-480 และ 70-483
  • ความรู้ ทักษะที่ต้องใช้
    • สร้างเว็บได้ รู้จักพื้นฐานของ MVC
    • การ Deploy Website ขึ้น ซึ่งมีทั้งใช้ Tools ก็ตัว Visual Studio รวมถึงการแก้ Config ทั้งบนตัวเว็บของเราเอง (webconfig.config) หรือการ Config ตัว IIS (applicationhost.config)
    • Data Access
    • Best Practics ในการจูน Web ให้มี Performance ที่ดีตาม Case Study ที่ยกมาครับ เช่น การทำ Caching, การทำ Bundle เป็นต้น
    • ออกแบบ Hybrid Application เพื่อให้ Service ของภายในองค์กร ใช้งานร่วมกับ Azure ได้
    • Case Study มาให้อ่านจากนั้น เลือก Technology ที่เหมาะสม หา Solutionที่เหมาะได้
    • ต้องสอบวิชานี้ผ่าน ถึงจะไปสอบ 70-487 ได้
  • Resource/Referencec ที่ผมใช้

70-487: Developing Microsoft Azure and Web Services

แนวข้อสอบและการสอบ

  • แนวข้อสอบมีครับ หาได้ผ่าน Google เลย มีเว็บเ เช่น AIOTestKing, Examref เป็นต้น ที่มีข้อสอบให้ แต่อย่าเชื่อมั่นในเฉลยครับ
  • สิ่งที่สำคัญ คือ พื้นฐานครับ ถ้าเรามีพื้นฐาน ข้อสอบมันช่วยเสริมความเข้าใจ แต่ถ้าไม่มีมันก็ไม่ต่างอะไรกับท่องจำไปสอบครับ
  • การสอบ ผมไปสอบแยกไป ทิ้งช่วงให้ห่างประมาณเกือบ 3 Week ครับ

ท้ายที่สุดแล้ว ใบ Certification ที่ได้รับ มันถูกกองไว้ ถ้าเราเตรียมตัวศึกษามาแล้วใช้แค่สอบ แต่ไม่สามารถนำมาประยุกต์ใช้กับงานที่ทำได้ครับ ขอบคุณที่ท่านที่นั่งอ่านมาจนครบ 4 ตอนครับ

[VS Code] บันทึกหลังจาก Update จาก 32 Bits ไปเป็น 64 Bits

หลังจากที่มีข่าวว่าตัว VS Code มีข่าว Update Version 1.15 ผมได้ลอง Update มาแล้วครับ เลยของบันทึกอะไรไวนิดหน่อยครับ

  • 32 Bits กับ 64 ฺBits อยู่ร่วมกันไม่ได้ ต้องเลือกอย่างใดอย่างหนึ่งครับ
  • Extension ต่างๆ ที่ลงไว้ ไม่หายนะครับ เปิดต่อใช้งานได้เลย
  • รวมถึง Config ต่างๆ ก็ยังอยู่ด้วยครับ
  • เปิดไฟล์ที่มีขนาดใหญ่ได้แล้วครับ ซึ่งผมเข้าใจว่าเป็นผลที่ได้จากการปรับให้มันรองรับ 64 Bits ครับ
  • ใช้ Syntax Markdown และรองรับการ Preview ด้วย
  • สุดท้ายที่ผมชอบ คือ ตัว Terminal switching ครับ

This slideshow requires JavaScript.

ส่วนตัว Ok กับการ Update ของ VS Code มากๆครับ ไม่ค่อยเหมือนกับตัว Visual Studio ที่เวลาจะเอาออกก็ต้องเอาตัว Setup ที่ลงไว้ตอนนั้น เอามา Uninstall ออกครับ

Reference

[C#] Arithmetic Overflow กับคำสั่ง checked และ unchecked

พอดีช่วงนี้ลองทวนสอบ เพื่อเตรียมสอบ Cert MCSD App Builder ของ Microsoft ครับ แล้วบังเอิญไปเจอ keyword อันนึงที่ กูรเขียน Code มาหลายปี ไม่เคยได้ยินเลย checked และ unchecked ครับ โดยก่อนเข้าไปรู้ว่า 2 คำนี้ มันมีความหมายอย่างไรใน C# เรามารู้จักกับ Exception ชนิดหนึ่งกันก่อนดีกว่าครับ

Arithmetic Overflow/Underflow คือ อะไร ?

สำหรับคอมพิวเตอร์เวลามันทดอะไรบางอย่าง เราจะเก็บที่หน่วยความจำ แล้วที่นี่ในการเขียนโปรแกรมตอนที่เราจะทดค่าต่างๆนั้น มันมีภาชนะให้เก็บหลายรูปแบบ ซึ่งพื้นฐานของคอมพิวเตอร์มาจากคณิตศาสตร์ การที่เราจะเก็บอะไรลงภาขนะ แต่ละแบบ มันมีข้อจำกัด นัั่นก็ช่วง หรือขอบเขตที่สามารถรับได้ ถ้าสรุปในภาษา Dev มันบอกว่า Data Type(ภาชนะ) ซึ่งแต่ละแบบ เช่น int, float Decimal หรือ String มันมีข้อจำกัด หรือขอบเขต ที่บอกว่าเราสามารถเก็บอะไรลงไปได้ และได้เท่าไหร่ มี min-max นั้นเองครับ ถ้าลองดูใน C# ค่า min และ max ของ DataType บางชนิดมา มีค่า min/max นะครับ ดังนี้ครับ

แล้ว Overflow กับ Underflow  คือ อะไรหละ ?

  • Overflow คือ การคำนวณต่างๆ แล้วผลลัพธ์ที่ได้มันมีค่ามากกว่าที่ตัวแปรชนิดนั้นๆ จะเก็บค่าได้ครับ (สั้นๆ ค่าเกิน max)
  • Underflow คือ การคำนวณต่างๆ แล้วผลลัพธ์ที่ได้มันมีค่าน้อยกว่าที่ตัวแปรชนิดนั้นๆ จะเก็บค่าได้ครับ (สั้นๆ ค่าน้อยกว่า min)

OverflowException คือ อะไร ?

Exception ข้อผิดพลาด ที่เราสามารถจัดการได้ สำหรับในกรณีนี้ คือ ข้อมูลที่คำนวณได้ มันล้นเกิน(Overfllow) ออกมาจากจากภาชนะที่เก็บไว้ (ตัวแปร) ถ้าดูโครงสร้าง OverflowException  พบว่ามันเป็น Type หนึ่งของ System.ArithmeticException ครับ

checked & unchecked

หลังจากรู้จักกับ Arithmetic Overflow Exception แล้ว กลับมาที่ตัว C#กันก่อนครับ ว่าตัวภาษามันมีอะไรช่วยเรา หรือป่าว คำตอบ คือ มีครับ แต่ปกติไม่เปิดไว้ (ค่า Default = unchecked) แต่มีคำสั่งเข้ามาจัดการเรื่องนี้ 2 คำสั่งครับ ได้แก่

  • checked – บอกว่า Code ที่อยู่ในส่วนของ คำสั่ง checked มีการตรวจสอบ พวก Overflow/Underflow ครับ ถ้าดูจาก Code เป็น Code ที่ผมใช้คำนวณดอกเบี้ยของพันธบัตร/หุ้นกู้(Bond) ครับ
  • unchecked – บอกว่า Code ที่อยู่ในส่วนของ คำสั่ง unchecked ไม่มีการตรวจสอบ พวก Overflow/Underflow ครับ อ้าวแล้วกรณีไหนที่ต้องไม่ Check หละ การคำนวณด้าน การเงิน คงไม่ใช่แน่ๆ เงินหาย คงไม่มีใครยอมอยู่แล้วครับ แต่มีบางอัลกอริทึมนะ ที่ไม่ได้สนใจค่าของมัน(magnitude) อย่าง เช่น การทำ Hash ครับ

Note:

  • สำหรับตอนนี้ใน C# ยังไม่มี UnderflowException ครับ ถ้าเกิด Exception ในกรณีนี้จริงๆ ระบบจะโยนตัว InvalidOperationException มาแทนครับ
  • คำสั่ง checked / unchecked  มี ขอบเขตแบบ Local ถ้าในขอบเขต ดันไปมีการเรียกใช้ Method อื่น ตัว Method อื่น ไม่เข้าข่ายนะครับ ตามตัวอย่าง พบว่า Method CalcSomethingOverflows ไม่เข้าขอบเขตของคำสั่ง checked ครับ
  • คำสั่ง try-catch มันก็ไม่ได้สนใจพวก Overflow และ Underflow ครับ
    • จากตัวอย่าง Code สังเกตุว่า Method dependsonDefault ปล่อยให้คำตอบเป็นไปตามยถากรรมครับ ซึ่งสามารถทำงานได้ด้วย แต่ถูก หรือป่าวอีกเรื่องนะครับ แต่หากมีคำสั่ง Checked ไว้ ตามใน Method checkedMethod มันจะ throw exception ทันทีครับ
    • ผลลัพธ์การ Run ครับ

โห ถ้าจะต้องการให้มันตรวจสอบทั้ง Project นีไม่ต้องไล่ใส่คำสั่ง Checked ไปจนพรุนทั้ง Solution/Project เลยเหรอ คำตอบ คือ ว่ามีครับ ถ้าให้ในมัน Defaultให้มีค่าเป็น checked ตั้งแต่ต้นให้ไปกำหนดค่าใน Project ดังรูปครับ

ถ้าตรงไหน ไม่เอาใช้คำสั่ง unchecked มากำหนดแทนครับ

Reference