Day: November 27, 2020

  • แสดงเครื่องหมายถูกใน Crystal Report

    นักพัฒนาหลายๆ ท่านที่ออกรายงานด้วย Crystal Report อาจจะมีความต้องการแสดงสัญลักษณ์เครื่องหมายต่างๆ บนตัวรายงาน แต่ไม่มีเครื่องมือที่ออกแบบมาเพื่อการนี้โดยตรง แต่เราสามารถทำได้ด้วยวิธีการดังต่อไปนี้

    1. สร้าง Formula Field และกำหนดชื่อให้เรียบร้อย

    2. ป้อนคำสั่ง Chr(254) จากนั้น Save

    3. เพิ่ม formula field ที่เพิ่งสร้างลงไปในรายงาน และเปลี่ยนฟอนต์ให้เป็น “Windings”

    4. เมื่อทดสอบดูรายงาน ก็จะแสดงเป็นเครื่องหมายถูกภายในกล่องสี่เหลี่ยมดังภาพ

    5. นอกจากนี้เราสามารถกำหนดให้แสดงผลเป็นรูปแบบอื่นๆ ได้ด้วยการแก้ไขโค้ดเป็นอย่างอื่น เช่น

    6. เมื่อเราทราบโค้ดของสัญลักษณ์ที่เราต้องการแล้ว เราก็สามารถควบคุมการแสดงผลด้วยการเพิ่มเงื่อนไขใน Formula Field ดังตัวอย่าง

    If {Table.Gender} = "M" Then
        Chr(254)    //แสดงเครื่องหมายถูกในกล่องสี่เหลี่ยม
    Else
        Chr(168)    //แสดงกล่องเปล่า
    End If

    อ้างอิง

    https://stackoverflow.com/questions/279907/checkbox-in-a-crystal-report

  • แสดงข้อมูล Memory CPU Disk ด้วย C# EP.1

    ในช่วงที่ผ่านมาผู้เขียนได้รับมอบหมายให้พัฒนาเครื่องมือสำหรับมอนิเตอร์การใช้งานทรัพยากรต่างๆ บน Server ที่ให้บริการลูกค้า ทั้งในส่วน Memory CPU และ Disk โดยโจทย์คือพัฒนา Service ขึ้นมาตัวนึงด้วยเครื่องมือที่เราใช้งานกันอยู่แล้วคือ Visual Studio.NET ด้วยภาษ C# สำหรับอ่านทรัพยากรต่างๆ บน Server แล้วจึงเขียนค่าเหล่านั้นลงไฟล์ จากนั้นจะมีเครื่องมืออีกตัวเข้ามาอ่านไฟล์ดังกล่าวแล้วนำไปแสดงผลเป็นกราฟในรูปแบบที่ต้องการต่อไป

    เริ่มต้นเรามาดูวิธีการดึงข้อมูลหน่วยความจำ Available (คงเหลือ) กันก่อน ซึ่งโชคดีที่ .NET มี object ตัวนึงที่ชื่อ PerformanceCounter ที่จะคอยเก็บข้อมูลต่างๆ ของ Server และเราสามารถดึงค่าต่างๆ มาใช้งานได้โดยการระบุ parameter ที่เราต้องการ อย่างเช่นในกรณีของหน่วยความจำ จะต้องระบุ parameter 2 ตัว คือ “Memory”, “Available MBytes” ดังโค้ดตัวอย่าง

    PerformanceCounter availMemory = new PerformanceCounter("Memory", "Available MBytes", null);

    โดยเราจะดึงข้อมูลออกมาผ่านเมทธอด NextValue() อย่างเช่น

    availMemory.NextValue();

    เมื่อทดลองรันโค้ดดังกล่าว โดยผู้เขียนได้ทดลองสร้างโปรเจ็คแบบ Console Application ได้ผลลัพธ์ดังต่อไปนี้

    โดยข้อมูลที่ได้อยู่ในรูปแบบ Megabytes ดังนั้นถ้าต้องการให้อยู่ในรูปแบบ Gigabytes จะต้องนำไปหารด้วย 1,024 เสียก่อน (ในส่วนนี้ผู้เขียนไม่แน่ใจว่า ในทางเทคนิคควรจะหารด้วย 1,024 หรือ 1,000)

    แต่ด้วยข้อจำกัด เราไม่สามารถหาหน่วยความจำทั้งหมดจาก PerformanceCounter โดยจะต้องดึงข้อมูลผ่านวิธีการอื่น นั่นคือการเรียกผ่าน Windows API Function และต้องประกาศ Structure เพิ่มเติมเพื่อให้รองรับข้อมูลที่ Windows API ส่งกลับมา ดังนี้

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    private class MEMORYSTATUSEX
    {
    	public uint dwLength;
    	public uint dwMemoryLoad;
    	public ulong ullTotalPhys;
    	public ulong ullAvailPhys;
    	public ulong ullTotalPageFile;
    	public ulong ullAvailPageFile;
    	public ulong ullTotalVirtual;
    	public ulong ullAvailVirtual;
    	public ulong ullAvailExtendedVirtual;
    	
    	public MEMORYSTATUSEX()
    	{
    		this.dwLength = (uint)Marshal.SizeOf(typeof(MEMORYSTATUSEX));
    	}
    }
    
    [return: MarshalAs(UnmanagedType.Bool)]
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    static extern bool GlobalMemoryStatusEx([In, Out] MEMORYSTATUSEX lpBuffer);

    และตัวอย่างวิธีการเรียกใช้งานฟังก์ชัน

    ulong totalMemory;
    MEMORYSTATUSEX memStatus = new MEMORYSTATUSEX();
    if( GlobalMemoryStatusEx(memStatus))
    { 
       totalMemory = memStatus.ullTotalPhys;
    }

    เมื่อนำโค้ดไปทดสอบ จะได้ผลลัพธ์ดังภาพ

    โดยข้อมูลที่ได้จากฟังก์ชันนี้จะเป็นหน่วย byte ถ้าเราต้องการแปลงให้เป็น gigabyte ก็จะต้องหารด้วย (1024 * 1024 * 1024)

    ซึ่งก็จะได้ผลลัพธ์ประมาณ 4 gigabytes และจากโค้ดในส่วนแรกที่ใช้งานหน่วยความจำคงเหลือ เมื่อนำมาผนวกกัน และมีการคำนวณอีกนิดหน่อย ก็จะได้ผลลัพธ์ดังภาพ

    ตัวอย่างโค้ดทั้งหมด

    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Runtime.InteropServices;
    using System.Text;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
            private class MEMORYSTATUSEX
            {
                public uint dwLength;
                public uint dwMemoryLoad;
                public ulong ullTotalPhys;
                public ulong ullAvailPhys;
                public ulong ullTotalPageFile;
                public ulong ullAvailPageFile;
                public ulong ullTotalVirtual;
                public ulong ullAvailVirtual;
                public ulong ullAvailExtendedVirtual;
                public MEMORYSTATUSEX()
                {
                    this.dwLength = (uint)Marshal.SizeOf(typeof(MEMORYSTATUSEX));
                }
            }
    
            [return: MarshalAs(UnmanagedType.Bool)]
            [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
            static extern bool GlobalMemoryStatusEx([In, Out] MEMORYSTATUSEX lpBuffer);
    
            static void Main(string[] args)
            {
                float totalMemory = 0;
                MEMORYSTATUSEX memStatus = new MEMORYSTATUSEX();
                if (GlobalMemoryStatusEx(memStatus))
                {
                    totalMemory = memStatus.ullTotalPhys;
                    totalMemory = totalMemory / (1024 * 1024 * 1024);
                }
    
                PerformanceCounter pAvailMemory = new PerformanceCounter("Memory", "Available MBytes", null);
                
                Console.WriteLine("Total : " + totalMemory.ToString("0.00"));
                Console.WriteLine("Available : " + (pAvailMemory.NextValue() / 1024).ToString("0.00"));
                Console.WriteLine("Usage : " + (totalMemory - (pAvailMemory.NextValue() / 1024)).ToString("0.00"));
            }
        }
    }

    สำหรับวิธีการดึงหน่วยความจำของเครื่องก็คงจบลงเพียงเท่านี้ ครั้งหน้าเราจะมาดูวิธีการดึงข้อมูลการใช้งาน CPU กัน

    สวัสดีครับ


    อ้างอิง

  • เปลี่ยนมือถือ เป็นเครื่องสแกนเอกสารด้วย Office Lens

    เพียงแค่คุณมีมือถือ ก็สามารถสแกนเอกสารได้โดยไม่ต้องวิ่งหาเครื่องสแกนอีกต่อ!!!

    Office Lens เป็น Free Application จาก Microsoft Corporation สามารถใช้งานบน Mobile Device
    รองรับทั้งระบบ Windows Phone, Android และ iOS

    รูปหน้าจอสำหรับดาวน์โหลด Application Office Lens บน iOS และ Adriod

    การใช้งาน Office Lens
    ข้อดี ของตัวแอปพลิเคชันนี้คือไม่มี โฆษณา หรือ Ad โผล่ขึ้นมา ให้กวนใจเวลาใช้งานและใช้งานไม่ยาก
    สามารถแปลงรูปที่สแกนให้เป็นไฟล์เอกสาร Microsoft Office ได้ ไม่ว่าจะเป็น Word , PowerPoint,ไฟล์รูป .JPG หรือแม้แต่ .PDF ก็สามารถทำได้

    Office Lens มี 4 โหมดในการถ่าย คือ

    • Whiteboard : กระดาน Whiteboard
    • Document : หน้าเอกสาร,โปสเตอร์
    • Business Card : นามบัตร
    • Photo : ถ่ายรูปทั่วไป
      โดยมันจะปรับรูปภาพที่ถ่ายสแกนมาให้เหมาะสมกับชนิดของเอกสารที่สแกนมา

    Office Lens ขั้นตอนการใช้งานบน Mobile Device ดังนี้

    1. เปิด App Office Lens จับภาพ
    2. เลือกโหมดการถ่าย รอกรอบครอบตัดรูปภาพ กด “ถ่าย”
    3. ปรับแต่งภาพ ตามเครื่องมือที่ App จัดเตรียมไว้
    4. บันทึกภาพ สามารถเลือกการบันทึกเป็น OneNote, ไฟล์ JPG หรือบันทึกชุดไฟล์ภาพเป็น PDF
    รูปขั้นตอนการใช้งาน Office Lens บน Mobile Device

    รูปไฟล์ PDF ที่ได้จาก Application Office Lens

    Office Lens สามารถใช้แบบออฟไลน์ (Offline) ได้
    ผู้ใช้งานสามารถใช้ Office Lens ได้แม้ว่าจะไม่ได้เชื่อมต่ออินเทอร์เน็ตได้ โดยบันทึกไฟล์ JPG, PDF ลงเครื่อง โดยไม่ต้อง Login และไม่ต้องเชื่อมต่อกับ Internet
    เมื่อใช้ Office Lens บน iOS และ Android App ถ่ายภาพ แล้วแปลงเป็นเอกสาร สามารถเลือกบันทึกเอกสารที่อยู่ในรูปแบบไฟล์ JPG, PDF เข้าตัวอุปกรณ์โดยตรง ไม่ถูกจำกัดว่าจะต้องบันทึกเข้า OneDrive ที่ผู้ใช้งานต้อง Login Microsoft accont เชื่อมต่อ Internet จัดเก็บไว้ที่ OneDrive

    หวังว่าบทความนี้จะมีช่วยให้ทุกท่านสะดวกในการ จัดการเอกสารที่ต้องการได้ ไม่มากก็น้อยนะคะ

    ขอบคุณ : ครูหนึ่งสอนดี, THAIWERE

  • ทำ functional design อย่างง่ายด้วยโปรแกรม Sandcastle Help File Builder

    เมื่อพัฒนาโปรแกรมเสร็จแล้ว ก็ถึงเวลาทำเอกสารการเขียนอธิบายโค้ดต่อ บางครั้งมันยุ่งยากเสียเวลา วันนี้มีวิธีที่สะดวกและรวดเร็วเพียงแค่เขียนอธิบายใน Class ที่เราต้องการอธิบาย เช่น Constructors, Properties, methods

    ตัวอย่างการเขียนอธิบายโค้ด

    โดยทั่วไปแล้วการเขียน Logic ต่างๆ เพื่อนำไปใช้งานต่อหรืออ้างอิงโค้ดที่เราเขียนมักจะ build code เป็นไฟล์ .dll เพื่อให้ระบบอื่นมาเชื่อมต่อและเรียกใช้งานได้ โดยขั้นตอนแรกเราใช้โปรแกรม Sandcastle Help File Builder สามารถอ่านรายละเอียดเพิ่มเติมตามลิ้งก์ https://github.com/EWSoftware/SHFB/releases และ download และติดตั้งตามลิ้งก์

    SHFBInstaller_v2019.11.17.0.zip 45.1 MB

    เมื่อติดตั้งเสร็จเรียบร้อย หน้าตาก็จะประมาณนี้

    โปรแกรม Sandcastle Help File Builder

    ก่อนอื่นเราต้องไปตั้งค่าการ build code ใน Visual Studio ในส่วนของ XML ตามไฮไลต์สีเหลือง

    การตั้งค่า XML ใน Visual Studio

    จากนั้นก็กด Build ใน Visual Studio

    แสดงการ Build ใน Visual Studio

    เมื่อ build เสร็จ เราจะได้ไฟล์ .dll และ .xml

    ไฟล์ .dll และ .xml

    เมื่อได้ไฟล์ .dll และ .xml เรียบร้อยแล้ว ก็เพิ่มในโปรแกรม Sandcastle Help File Builder โดยไปที่เมนู File > Project Explorer > Documentation Sources > Add Documentation Source

    เมนูการเพิ่ม Add Documentation Source

    เมื่อเลือกไฟล์ .dll และ .xml เรียบร้อยแล้ว ผลลัพธ์ที่ได้แสดงตามภาพ

    แสดงผลลัพธ์เมื่อ Add Documentation Source เสร็จ

    จากนั้นตั้งค่าเมนู Help File ตามตัวอย่างข้างล่าง

    ตั้งค่าเมนู Help File

    จากนั้นตั้งค่าเมนู Visibility ตามตัวอย่างข้างล่าง

    ตั้งค่าเมนู Visibility

    เมื่อตั้งค่าโปรแกรมเสร็จเรียบร้อยแล้ว ไปที่เมนู Documentation > Build Project

    เมนู Documentation > Build Project

    รอโปรแกรมประมวลผลสักครู่ เราก็จะได้ไฟล์ .chm ออกมา

    ไฟล์ .chm

    เมื่อเปิดไฟล์ .chm เราก็จะได้ผลลัพธ์ Help File ตามรูปแบบที่แสดงตามภาพด้านล่าง

    ผลลัพธ์ Help File 1
    ผลลัพธ์ Help File 2
    ผลลัพธ์ Help File 3
    ผลลัพธ์ Help File 4
  • วิธีทำให้ตั้ง password ใน windows server ได้ตามที่ต้องการ

    เมื่อ create user ใหม่ใน windows server เราจะต้องตั้ง password ตามกฏที่ windows server กำหนดมาให้
    ถ้าตั้งไม่ตรงตามกฎ windows server จะไม่ยอมให้สร้าง user
    อย่างเช่นสร้าง user ชื่อ sysadmin แล้วตั้ง password ว่า sysadmin123
    จะไม่สามารถสร้าง user ได้ ซึ่งจะมี error ขึ้นดังรูป

    วิธีแก้ให้สามารถตั้ง password ได้ตามที่ต้องการมีดังนี้

    1. ที่หน้า Desktop ของ windows Server ให้ไปที่ปุ่มค้นหา(รูปแว่นขยาย) ตรง taskbar แล้วพิมพ์  gpedit.msc แล้วกดปุ่ม Enter ที่ keyboard
    • ให้เลือกตามลำดับดังนี้ Computer Configuration -> Windows Settings -> Security Settings -> Account Policies -> Password Policy.
    • Double click ที่ Password must meet complexity requirements
    • ให้เปลี่ยนจาก Enabled เป็น Disabled แล้วกด OK
    • ลองสร้าง user ใหม่อีกที โดยตั้งชื่อเป็น sysadmin แล้วตั้ง password ว่า sysadmin123

    จะเห็นว่าสามารถสร้าง user ได้แล้ว

  • How to ลบไฟล์ใน Downloads อัตโนมัติ บน Win10

    เนื่องด้วยทางผู้เขียนเองในทุกๆ วัน ด้วยงานที่ทำและพฤติกรรมโดยส่วนตัว ส่งผลให้ Folder Downloads ในเครื่องตัวเองมีไฟล์เพิ่มขึ้นทุกวัน (แลดูรกมากๆ) มีทั้งไฟล์งาน ไฟล์เพลง ไฟล์วีดีโอ ไฟล์ภาพ เต็มไปหมด !! และเอาจริงๆ บางทีก็คิดนะว่าควรจะทำความสะอาดโดยการลบออกซักที แต่ก็นะ ด้วยความยุ่งวุ่นวายในหลายๆ อย่าง ก็เลยลืม และยังคงลืมมาโดยตลอดดดดดด 555+

    จนสุดท้ายได้นั่งหาข้อมูลไปเรื่อยๆ จนมาเจอวิธีที่สามารถตั้งค่าการลบไฟล์ใน Folder Downloads ได้แบบอัตโนมัติ ซึ่งเหมาะมาก เหมาะกับคนที่ความจำแย่ ขี้ลืม และขี้เกียจ T T แบบผู้เขียน

    มา เรามาเริ่มกันเลย ไม่ต้องเกริ่นกันให้มากความ ลุยยยยย !!

    ก่อนอื่น Blog นี้จะเป็นการตั้งค่าบน Windows10 นะ (Windows อื่นๆนี่ยังไม่ได้ศึกษา แหะๆ) เริ่มแรกไปที่เมนู Start ก่อนเลย

    • คลิกเลือก Start จากนั้นเลือกเมนู Settings ตามรูปเลยนะ
    • เมื่อเข้ามาในหน้าต่าง settings ให้คลิกเลือกตรงเมนู “System” ได้เลย
    • เมื่อเข้ามาในหน้าจอเมนู System ให้คลิกเลือกเมนูด้านซ้ายที่ชื่อว่า “Storage” (รอเครื่องเราโหลดข้อมูลสักครู่นะ) จากนั้นคลิกเลือกตรงด้านขวาของหน้าจอ เลือกข้อความ “Configure Storage Sense or run it now
    • จากนั้นจะเข้าสู่หน้าจอ Configure Storage Sense or run it now ให้เลือก “Turn on” ในส่วนของ “Storage Sense
    • ขั้นตอนสุดท้ายให้เลือกติ๊กถูกด้านหน้าข้อความ “Delete temporary files that my apps aren’t using” และเลือกระบุตามความพอใจได้เลยว่าต้องการให้ระบบทำการลบไฟล์ในระยะเวลาใด โดยค่าเริ่มต้นจะอยู่ที่ 30days อยู่แล้วนะ

    เพียงเท่านั้นก็ถือเป็นอันเสร็จสิ้นการตั้งค่าบน Windows 10 กันแล้วนะทุกคน มันดีจริงๆ อยากให้ทุกคนที่อยากลอง ก็ลองไปเล่นดูนะ สั้นๆ ง่ายๆ ไม่ยุ่งยากหรอก สำหรับ Blog นี้ก็ขอจบไว้เพียงเท่านี้ หวังว่าจะเป็นประโยชน์กับท่านผู้อ่านทุกๆท่านน๊าาาา

    ขอขอบคุณบทความดีๆจาก : https://www.varietypc.net

  • Canonical Livepatch Service

    Canonical Livepatch Service

    Apply critical kernel patches without rebooting.

    โฆษณา

    • Fixes are applied automatically, without restarting your system
    • Reduces downtime, keeping your Ubuntu LTS systems secure
      and compliant
    • Included as part of all Ubuntu Advantage for Infrastructure
      support packages
    • ใครควรใช้ เครื่อง ubuntu 16.04 ขึ้นไป
    • เริ่มได้
    • เปิดเว็บ https://auth.livepatch.canonical.com/ เลือก Ubuntu user แล้วกดปุ่ม Get your Livepatch token

    ก็จะไปหน้านี้

    • กด Accept all and visit site
    • ก็ให้ log in ให้เรียบร้อย หากยังไม่ได้สมัคร user ของ Ubuntu one ก็ให้เลือก I don’t have an Ubuntu One account เพื่อสร้าง account

    หลังจากกด Create account ให้ไปเช็คเมล์ที่ใช้ลงทะเบียนแล้วกด verify

    • ก็จะได้หน้าที่มี Token สำหรับลงทะเบียน
    • ติดตั้งโปรแกรมชื่อ canonical-livepatch ด้วยคำสั่ง
    sudo snap install canonical-livepatch
    • เมื่อติดตั้งเสร็จได้ผลลัพธ์ว่า

    canonical-livepatch 9.5.5 from Canonical✓ installed

    • แล้วต่อด้วยคำสั่ง copy จากในเว็บได้เลย
    sudo canonical-livepatch enable $TOKEN
    • โดย $TOKEN คือค่าที่ได้จากในหน้าเว็บ
    • ก็จะได้ผลว่าประมาณว่า

    Successfully enabled device. Using machine-token: xxxxxxxxxxx

    • เสร็จ!!! แบบง่ายๆ และงงๆ
    • และสำหรับ 1 email address สามารถใช้ token เดียวกันได้ 3 เครื่อง สำหรับผู้ใช้ฟรี!!
    • ตั้งแต่ใช้มาประมาณ 1 ปีครึ่ง ก็ไม่รู้ว่ามีอัพเดตอะไรบ้างเหมือนกัน กรั่กๆ
    • ตรวจสอบสถานะของ canonical-livepatch ด้วยคำสั่ง
    sudo canonical-livepatch status --verbose
    • ก็จะได้ประมาณว่า
    • จบขอให้สนุก

    อ้างอิง

    https://ubuntu.com/security/livepatch

  • ตรวจสอบการสะกดคำด้วย NHunspell (.Net Framework Library)

    สำหรับแอปพลิเคชันที่มีส่วนค้นหาแล้วนั้น หนีไม่พ้นคำถามจากผู้ใช้ว่า ถ้าสะกดคำผิดจะค้นเจอมั้ย (ก็ไม่เจอซิครับ) พร้อมยกตัวอย่างความสามารถในการแก้คำผิดของ Google, Bing ให้ฟัง สำหรับนักพัฒนาตัวคนเดียว หรือทีมงานเล็กๆ ที่ไม่สามารถใช้แนวทาง API แบบต้องมีค่าใช้จ่าย หรือ Machine Learning ที่ต้องใช้ความรู้เฉพาะด้าน ผมก็มี Library ขนาดเล็กที่อาศัยวิธีการทางสถิติ และไฟล์คลังคำศัพท์ (Dictionary) มาใช้งานไปก่อนครับ โดยได้ทำการทดสอบประสิทธิภาพเปรียบเทียบกับ PyThaiNLP, WeCantSpell.Hunspell มาแล้วทั้งในด้านความเร็ว และความถูกต้อง พบว่าดีที่สุด นั้นคือ NHunspell

    ขั้นตอนการนำมาใช้งาน

    ในตัวอย่าง เป็นการนำมาใช้งานร่วมกับ Console Application

    1.เปิด Nuget Manager ด้วยการ คลิกขวาที่ชื่อโปรเจค เลือก Manage Nuget Packages

    2.ค้นหา NHunspell เลือก Install

    3.สร้างโฟลเดอร์สำหรับเก็บไฟล์ Dictionary โดยสามารถดาวส์โหลดได้จาก https://github.com/LibreOffice/dictionaries นำไปวางไว้ที่ [ProjectPath]/bin/Debug

    4.สร้างโฟลเดอร์สำหรับเก็บไฟล์คำตัวอย่าง sentense_list.txt โดยมีบรรทัดละ 1 คำ เพื่อทำการโหลดข้อมูลเข้ามาให้ Library ประมวลผล และเก็บไฟล์ผลลัพธ์ไว้ที่ suggest_result.txt นำไปวางไว้ที่ [ProjectPath]/bin/Debug

    5. จากนั้นก็เขียนโค้ดในไฟล์ Program.cs ดังนี้

    using System;
    using System.IO;
    using System.Collections.Generic;
    using System.Text.RegularExpressions;
    using NHunspell;
    
    namespace SpellCheckTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                try
                {
                    using (var sr = new StreamReader("example_data/sentense_list.txt"))
                    {
                        //อ่านรายการคำ
                        string searchterm = sr.ReadToEnd();
                        string[] searchtermArray = searchterm.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
    
                        Console.WriteLine("Processing...");
    
                        using (var sw = new StreamWriter("example_data/suggest_result.txt"))
                        {
                            foreach (string sentense in searchtermArray)
                            {
                                string result = string.Empty;
                                var startTime = System.DateTime.Now.Ticks;
    
                                //ส่งคำให้ NHunspell ประมวลผล
                                result = SuggestNHunSpell(sentense);
    
                                var endTime = System.DateTime.Now.Ticks - startTime;
                                TimeSpan elapsedSpan = new TimeSpan(endTime);
    
                                //เขียนผลการตรวจสอบ และเวลาที่ใช้ลงในไฟล์ผลลัพธ์
                                sw.WriteLine(result);
                                sw.WriteLine(string.Format("{0}", elapsedSpan.TotalSeconds));
                                sw.WriteLine();
                                sw.Flush();
                            }
                        }
    
                        Console.WriteLine("Process Complete.");
                        Console.ReadKey();
                    }
                }
                catch (IOException e)
                {
                    Console.WriteLine("The file could not be read:");
                    Console.WriteLine(e.Message);
                    Console.ReadKey();
                }
            }
    
            /// <summary>
            /// NHunSpell
            /// </summary>
            /// <param name="sentence"></param>
            /// <returns></returns>
            private static string SuggestNHunSpell(string sentence)
            {
                //ตรวจสอบว่าเป็นภาษาอังกฤษ หรือภาษาไทย
                bool IsEnglish = Regex.IsMatch(sentence.Replace(" ", string.Empty), "[a-zA-Z]");
    
                string dictPath = IsEnglish ? "dict/en_US.dic" : "dict/th_TH.dic";
                string affixPath = IsEnglish ? "dict/en_US.aff" : "dict/th_TH.aff";
                
                //โหลดไฟล์ Dict และ Affix 
                using (Hunspell hunspell = new Hunspell(affixPath, dictPath))
                {
                    //ตรวจสอบว่าสะกดถูกหรือไม่
                    if (!hunspell.Spell(sentence))
                    {
                        List<string> suggestions = hunspell.Suggest(sentence);
                        if (suggestions.Count > 0)
                        {
                            //คืนค่า รายการคำที่น่าจะเป็นคำสะกดที่ถูกต้อง
                            return sentence + " : " + string.Join(",", suggestions);
                        }
                    }
                }
    
                //หากตรวจสอบว่าสะกดถูกแล้ว บันทึกผลว่า Correct
                return sentence + ": Correct";
            }
        }
    }

    6.จากนั้นทำการ Run แบบ Debug จะปรากฎหน้าจอ Command Line แสดงข้อความ Processing… รอจนเห็นคำว่า Process Complete. แสดงว่าทำการประมวลผลเสร็จแล้ว

    7.ผลลัพธ์จะถูกบันทึกลงในไฟล์ suggest_list.txt ดังรูป

    ในตัวอย่างนี้ เป็นเพียงโปรเจคสำหรับทดสอบการเรียกใช้งาน และดูผลลัพธ์ของ Library เท่านั้น การนำไปใช้งานร่วมกับระบบยังต้องการ การประยุกต์ให้เหมาะสมกับแต่ละระบบ แต่ก็หวังว่าจะเป็นประโยชน์กับคนที่กำลังหาเครื่องมือที่ใช้ตรวจสอบการสะกดคำให้กับระบบของตัวเองอยู่ไม่มาก ก็น้อยครับ

  • สนุกๆ กับการกำหนดรูปแบบให้กับ Column ของ SharePoint List : Choice/Text Column

    Blog นี้เราจะมากำหนดรูปแบบการแสดงผล Column ของ SharePoint List กันนะคะ ซึ่งทำได้ง่าย ๆ สบาย ๆ อีกแล้วค่า โดยการกำหนดรูปแบบให้กับ Column ของ SharePoint List นั้น จะใช้  JSON text format นะคะ

    ไม่รู้จัก JSON มาก่อนจะทำได้หรือป่าว ? ได้สิคะ เพราะมีตัวอย่าง JSON ที่เราสามารถหยิบเอามาใช้และแก้ไขให้ตรงกันกับข้อมูลของเราได้ โดยที่ไม่ต้องเข้าใจ JSON ให้มากมายก็ได้ เหมือนกับผู้เขียน (แฮ่ ๆ) ถึงได้บอกไงละคะว่า ง่าย ๆ สบาย ๆ อีกแล้ว ส่วนใครที่เข้าใจและใช้ JSON อยู่แล้ว ก็ไม่ต้องพูดมากให้เจ็บคอ สบายบรื๋อออ แน่นอน

    Blog นี้ ผู้เขียนขอรวบรวมเอาการกำหนดรูปแบบให้กับ Column ที่มีชนิดฟิลด์ข้อมูลเป็น Choice หรือ Text กันก่อนนะคะ

    Column formatting เป็นการกำหนดรูปแบบของ Column ไม่ได้มีผลกับข้อมูลใน Column นะคะ

    Let’s Play –

    ก่อนอื่นไปที่ Column ของ List ที่เราต้องการจัดรูปแบบ แล้วคลิกหัวของ column นั้น แล้วเลือกเมนู “Column Settings” และเลือก “Formatting this column” ดังรูป อย่างตัวอย่าง ผู้เขียนอยากจัดรูปแบบของ column สถานะ

    ส่วนของ Format columns Panel ก็จะโผล่ขึ้นมา ดังรูป เอา JSON มาวาง แก้ไขตามข้อมูลของเรา แล้ว บันทึก (Save) เท่านี้ก็เป็นอันเสร็จ สมหวังดั่งตั้งใจ

    มาลองทำกันซัก 2 ตัวอย่างนะคะ

    ตัวอย่างแรก สีจะมาจาก Class ส่วน ICON เปลี่ยนได้ ก็หยิบมาใช้ได้จากที่นี้นะคะ Fluent UI Icons

    {
    "$schema": "https://developer.microsoft.com/json-schemas/sp/v2/column-formatting.schema.json",
    "elmType": "div",
    "attributes": {
    "class": "=if(@currentField == 'เสร็จสิ้น', 'sp-field-severity--good', if(@currentField == 'รอดำเนินการ', 'sp-field-severity--low', if(@currentField == 'ดำเนินการแล้วรอทดสอบ', 'sp-field-severity--warning', if(@currentField == 'รอเปิดโครงการ', 'sp-field-severity--severeWarning', 'sp-field-severity--blocked')))) + ' ms-fontColor-neutralSecondary'"
    },
    "children": [
    {
    "elmType": "span",
    "style": {
    "display": "inline-block",
    "padding": "0 2px"
    },
    "attributes": {
    "iconName": "=if(@currentField == 'เสร็จสิ้น', 'CheckMark', if(@currentField == 'รอดำเนินการ', 'Forward', if(@currentField == 'ดำเนินการแล้วรอทดสอบ', 'Error', if(@currentField == 'รอเปิดโครงการ', 'Warning', 'ErrorBadge'))))"
    }
    },
    {
    "elmType": "span",
    "txtContent": "@currentField"
    }
    ]
    }

    มากันที่ตัวอย่างที่ 2 JSON ตามด้านล่าง ตัวอย่างนี้สำหรับใครอยากเปลี่ยนสี ก็แก้ไขโค้ดสีกันได้เลยค่ะ ส่วนใครอยากจะใช้ ICON อื่น ก็หยิบมาใช้ได้จากที่นี้ Fluent UI Icons เช่นเดิมนะคะ

    {
    "elmType": "div",
    "style": {
    "background-color": "=if(@currentField == 'ดีมาก', '#7ed9a1', if(@currentField == 'ดี','#eded6b', '#f27ce0'))",
    "color": "#0d0101",
    "white-space": "nowrap"
    },
    "children": [
    {
    "elmType": "span",
    "txtContent": "@currentField",
    "style": {
    "font-size": "1em",
    "display": "inline-block",
    "padding": "0 3px"
    },
    "attributes": {
    "iconName": "=if(@currentField == 'ดีมาก', 'Emoji', if(@currentField == 'ดี','Emoji2', 'EmojiNeutral'))"
    }
    }
    ]
    }

    สำหรับ Blog นี้ ก็ฝากกันเอาไว้เท่านี้ก่อนนะคะ ขอให้สนุกกับ SharePoint List กันนะค่า 🙂 สำหรับ Blog หน้า มากำหนดรูปแบบฟิลด์ชนิดอื่นกันอีกนะคะ

    Ref:

    https://pnp.github.io/sp-dev-list-formatting/

    https://docs.microsoft.com/en-us/sharepoint/dev/declarative-customization/column-formatting

    https://docs.microsoft.com/en-us/sharepoint/dev/declarative-customization/column-formatting#predefined-classes