Month: November 2020

  • ทำ 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

  • เขียน code ส่ง Line Notify ด้วย C#

    เริ่มต้นต้องประกาศ Using ก่อน ดังนี้

    using System.Net;
    using System.IO;

    แล้วใส่ code ตามด้านล่างนี้

    private void LineNotify(string lineToken, string message)
    {
            try
            {
                string message = System.Web.HttpUtility.UrlEncode(message, Encoding.UTF8);
                var request = (HttpWebRequest)WebRequest.Create("https://notify-api.line.me/api/notify");
                var postData = string.Format("message={0}", message);            
                var data = Encoding.UTF8.GetBytes(postData);            
                request.Method = "POST";
                request.ContentType = "application/x-www-form-urlencoded";
                request.ContentLength = data.Length;
                request.Headers.Add("Authorization", "Bearer " + lineToken);
                var stream = request.GetRequestStream();
                stream.Write(data, 0, data.Length);
                var response = (HttpWebResponse)request.GetResponse();
                var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }

    พารามิเตอร์ที่ต้องส่งมีดังนี้

    lineToken วิธีการขอ Line Token ดูได้จากบทความ การส่ง Line Notify ด้วย Command Line

    message คือข้อความที่ต้องการจะส่งผ่าน Line Notify

    ในการทดสอบฟังก์ชันหรือใช้งานฟังก์ชันนี้เครื่องคอมพิวเตอร์ต้องทำการต่อ internet ด้วยถึงจะทำงานได้

    ตัวอย่างการเรียกใช้ฟังก์ชัน

    LineNotify(“DwNQ7NQxrG8wgEaoUKvjgWKh1n08rxxxxxx”,”Hello World” );

    ผลที่ได้

    ถ้าหากต้องการให้ส่ง sticker หรือ รูปภาพไปด้วยให้ใส่ code ตามด้านล่างนี้

    private void LineNotify(string lineToken, string message , int stickerPackageID, int stickerID, string pictureUrl)
    {
            try
            {
                string message = System.Web.HttpUtility.UrlEncode(message, Encoding.UTF8);
                var request = (HttpWebRequest)WebRequest.Create("https://notify-api.line.me/api/notify");
                var postData = string.Format("message={0}", message); 
                if (stickerPackageID > 0 && stickerID > 0)
                    {
                        var stickerPackageId = string.Format("stickerPackageId={0}", stickerPackageID);
                        var stickerId = string.Format("stickerId={0}", stickerID);
                        postData += "&" + stickerPackageId.ToString() + "&" + stickerId.ToString();
                    }
                if (pictureUrl != "")
                    {
                        var imageThumbnail = string.Format("imageThumbnail={0}", pictureUrl);
                        var imageFullsize = string.Format("imageFullsize={0}", pictureUrl);
                        postData += "&" + imageThumbnail.ToString() + "&" + imageFullsize.ToString();
                    }           
                var data = Encoding.UTF8.GetBytes(postData);            
                request.Method = "POST";
                request.ContentType = "application/x-www-form-urlencoded";
                request.ContentLength = data.Length;
                request.Headers.Add("Authorization", "Bearer " + lineToken);
                var stream = request.GetRequestStream();
                stream.Write(data, 0, data.Length);
                var response = (HttpWebResponse)request.GetResponse();
                var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }

    พารามิเตอร์ที่ต้องส่งมีดังนี้

    lineToken วิธีการขอ Line Token ดูได้จากบทความ การส่ง Line Notify ด้วย Command Line

    message คือข้อความที่ต้องการจะส่งผ่าน Line Notify

    stickerPackageID กับ stickerID ดูได้จาก sticker_list

    pictureUrl คือ url ของรูปภาพที่ต้องการจะส่งผ่าน Line Notify

    ตัวอย่างการเรียกใช้ฟังก์ชัน

    LineNotify(“DwNQ7NQxrG8wgEaoUKvjgWKh1n08rxxxxxx”,”สวัสดีชาวโลก” , 1 , 10 , “https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png”);

    ผลที่ได้

  • Oracle User expire โดยไม่ทราบสาเหตุ

    นักพัฒนาบางท่านที่เพิ่งเริ่มพัฒนาระบบบนฐานข้อมูล Oracle อาจจะเคยเจอปัญหาเมื่อใช้ Oracle ตั้งแต่เวอร์ชัน 11 เป็นต้นไป นั่นคือ เมื่อสร้าง user บน Oracle และใช้งานไปได้ซักระยะอยู่ ๆ user นี้ก็เกิดก็ expire โดยที่ไม่ได้มีใครเข้าแก้ไขการตั้งค่าของ user นี้ ซึ่งเหตุการณ์นี้อาจจะมีสาเหตุแบบเดียวกับที่จะนำเสนอในบทควาามนี้ก็เป็นได้

    หมายเหตุ ในบทความนี้จะใช้ Oracle SQL Developer ซึ่งเป็นเครื่องมือในการเข้าถึงและจัดการฐานข้อมูล Oracle มาช่วยในการอธิบายเพื่อให้เห็นภาพได้ง่ายขึ้น

    ขั้นตอนการตรวจสอบที่มาของปัญหาและการแก้ไข

    1. login ด้วย sys
    2. ตรวจสอบการตั้งค่า Default Profile โดยเลือกเมนู View –> DBA

    3. ในหน้าต่าง DBA เลือกเพิ่มการเชื่อมต่อโดย SYS

    4. ไปที่การตั้งค่า Default Profile

    5. คลิกขวาที่ Default แล้วเลือก Edit

    6. จะปรากฏหน้าต่าง Default Profile

    ซึ่งใน Oracle 11 เป็นต้นไป หลังจากติดตั้งและสร้าง Database แล้ว ใน Default Profile จะมีการตั้งค่าเริ่มต้นไว้ดังรูป โดย Default Profile จะมีผลกับ user ที่ถูกสร้างใหม่ และค่าที่ทำให้ user หมดอายุโดยอัตโนมัติก็คือ “Expire in (days)” นั่นเอง จึงเป็นที่มาของการที่ user expire เองโดยที่ไม่ได้มีการเข้าไปแก้ไขข้อมูลใด ๆ ของ user นี้

    7. การแก้ไขไม่ให้ user ที่สร้างใหม่ expire อัตโนมัติ ทำได้โดยการแก้ค่า “Expire in (days)” ให้เป็น UNLIMITED

    เมื่อแก้ไขแล้ว user ใหม่ที่ถูกสร้างหลังจากนี้ก็จะใช้งานได้ตลอดไม่มีวัน expire แต่ส่วนของ user ที่เคยสร้างไปก่อนหน้านี้ ผู้พัฒนาจะต้องเข้าไปปรับแก้วันที่ expire เป็นราย user ไป

  • สวัสดี PDPA 🙂

    สำหรับ Blog นี้ ทางผู้เขียนขอพูดถึง PDPA เบื้องต้นละกัน คิดว่านาทีนี้จากไม่อยากรู้จัก ก็ต้องมาทำความรู้จักกันไว้บ้างแล้วแหละ !!

    ต้องขอบอกก่อนเลยว่า ในยุคปัจจุบันที่มีการพัฒนาของเทคโนโลยีแบบก้าวกระโดด การเข้าถึงอุปกรณ์ต่างๆ ที่ง่ายขึ้น รวมไปถึงการเข้าใช้งาน Internet แบบเข้าถึงได้ทุกที่ทุกเวลา ทุกเพศทุกวัย และมีการใช้งานที่กำลังขยายเป็นวงกว้าง ส่งผลให้เกิดโลกออนไลน์ที่มีขนาดใหญ่ และสิ่งต่างๆ เหล่านี้นี่แหละที่เราทุกๆ คน หากต้องการเข้าใช้งาน เราก็จะต้องแลกมาด้วยการใส่ข้อมูลเข้าไป

    ผลจากสิ่งต่างๆ ที่มีความทันสมัย และสะดวกสบายเหล่านั้น มันก็จะมีผลบางอย่างที่เดินตามหลังเรามาแบบติดๆ ผลกระทบที่เห็นได้ชัดอย่างนึงเลยก็คือเรื่องของ “ข้อมูลส่วนบุคคล ที่อาจจะมีผู้ไม่หวังดีสามารถที่จะเลือกใช้ช่องโหว่ของเทคโนโลยีเหล่านั้นมาก่อปัญหา และหลายครั้งก็นำมาซึ่งความเดือดร้อน หรือสร้างความเสียหายให้แก่เจ้าของข้อมูล เราจึงจำเป็นต้องมีกฏหมายขึ้นมา เพื่อกำหนดหลักเกณฑ์ มาตรการ กำกับดูแล และคุ้มครองข้อมูลส่วนบุคคลดังกล่าว นั่นก็คือ PDPA พระเอกของเราในวันนี้นั่นเอง

    PDPA คืออะไร ?

    PDPA (Personal Data Protection Act, B.E. 2562(2019)) ก็คือพระราชบัญญัติคุ้มครองส่วนบุคคล พ.ศ.2562 ซึ่งประเทศไทยได้ประกาศในราชกิจจานุเบกษาไปเมื่อ วันที่ 27 พฤษภาคม 2562 และได้มีผลบังคับใช้ไปเมื่อวันที่ 28 พฤษภาคม 2562 ไปแล้วในบางส่วน และเมื่อวันที่ 27 พฤษภาคม 2563 ถือเป็นวันที่ พ.ร.บ. ดังกล่าวมีผลบังคับใช้ตามกฏหมายทั้งฉบับ

    ข้อมูลส่วนบุคคล คืออะไร?

    ถ้าว่ากันตาม PDPA ดังกล่าว จะให้ความหมายของคำว่า “ข้อมูลส่วนบุคคล” ไว้ดังนี้ “ข้อมูลเกี่ยวกับบุคคลซึ่งทำให้สามารถระบุตัวบุคคลนั้นได้ ไม่ว่าทางตรงหรือทางอ้อม โดยข้อมูลของผู้ถึงแก่กรรม และข้อมูลนิติบุคคล ไม่ถือเป็นข้อมูลส่วนบุคคลตาม พ.ร.บ.นี้”

    ตัวอย่างข้อมูลส่วนบุคคล (Personal Data)

    • ชื่อ – นามสกุล, เลขประจำตัวประชาชน, เลขประกันสังคม, เลขประจำตัวผู้เสียภาษี เป็นต้น
    • ที่อยู่, เบอร์โทรศัพท์, วันเกิด, อีเมล, การศึกษา, เพศ, อาชีพ, รูปถ่าย
    • ข้อมูลทางการเงิน
    • ข้อมูลส่วนบุคคลที่มีความละเอียดอ่อน (Sensitive Personal Data) เช่น ข้อมูลทางการแพทย์หรือสุขภาพ, เชื้อชาติ, ความคิดเห็นทางการเมือง, ความเชื่อทางศาสนาหรือปรัชญา, พฤติกรรมทางเพศ เป็นต้น

    PDPA เกี่ยวกับใคร ?

    เอาจริงๆ ผู้เขียนมองว่าเกี่ยวกับทุกคนนะ และอย่างน้อยๆ เราควรรู้ข้อมูลเหล่านี้ไว้บ้างไม่มากก็น้อย เพื่อไว้ในการช่วยรักษาสิทธิของเราเอง

    • เจ้าของข้อมูลส่วนบุคคล (Data Subject) คือ บุคคลที่ข้อมูลระบุไปถึง
    • ผู้ควบคุมข้อมูลส่วนบุคคล (Data Controller) คือ บุคคลหรือนิติบุคคลซึ่งมีอำนาจหน้าที่ “ตัดสินใจ” เกี่ยวกับการเก็บรวบรวม ใช้ หรือเปิดเผยข้อมูลส่วนบุคคล
    • ผู้ประมวลผลข้อมูลส่วนบุคคล (Data Processor) คือ บุคคลหรือนิติบุคคลซึ่งดำเนินการเกี่ยวกับการเก็บรวบรวม ใช้ หรือเปิดเผยข้อมูลส่วนบุคคล “ตามคำสั่งหรือในนามของผู้ควบคุมข้อมูลส่วนบุคคล” ทั้งนี้บุคคลหรือนิติบุคคลซึ่งดำเนินการดังกล่าว ต้องไม่เป็นผู้ควบคุมข้อมูลส่วนบุคคล

    หากหน่วยงาน / องค์กรของเราต้องการใช้ข้อมูลเหล่านี้ ต้องทำอย่างไร ?

    กรณีที่ต้องมีการประมวลผลข้อมูลส่วนบุคคลด้วยการยินยอม ผู้ควบคุมข้อมูล (Data Controller) ต้องดำเนินการขอความยินยอมจากเจ้าของข้อมูลก่อนการประมวลผลข้อมูล ดังนี้

    • ต้องอธิบายให้ชัดเจนถึงวัตถุประสงค์ในการประมวลผลข้อมูลที่ขอความยินยอม
    • ต้องระบุประเภทของข้อมูลที่นำไปใช้
    • ต้องมีข้อความที่เข้าถึงได้ง่าย อ่านเข้าใจ และไม่เป็นภาษาในทางกฏหมายจนเกินไป
    • ไม่เป็นการบังคับ ต้องให้สิทธิอิสระแก่เจ้าของข้อมูลในการให้หรือไม่ให้ความยินยอม
    • ห้ามกำหนดการให้ความยินยมเป็นเงื่อนไขในการให้บริการ
    • กรณีเป็นผู้เยาว์อายุไม่ถึง 20 ปี คนไร้ความสามารถ คนเสมือนไร้ความสามารถ การขอความยินยอมต้องได้จากผู้ใช้อำนาจปกครอง ผู้อนุบาล หรือผู้พิทักษ์ด้วย

    บทลงโทษหากเราไม่ปฏิบัติตาม PDPA

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

    • ความรับผิดทางแพ่ง ตามความเสียหายที่เกิดขึ้นจริง และอาจต้องชดใช้ค่าสินไหมทดแทนเพิ่มขึ้นอีก โดยสูงสุดไม่เกิน 2 เท่าของค่าเสียหายที่แท้จริง
    • โทษทางอาญา จำคุกสูงสุดไม่เกิน 1 ปี หรือปรับไม่เกิน 1 ล้านบาท หรือทั้งจำทั้งปรับ
    • โทษทางปกครอง ปรับสูงสุดไม่เกิน 5 ล้านบาท

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

    ขอขอบคุณแหล่งข้อมูลเพิ่มอาหารสมองมา ณ ที่นี้ด้วย

    • https://www.hubbathailand.com/hubba-blog/10-pdpa-part
    • https://www.scb.co.th/th/personal-banking/stories/tips-for-you/pdpa-about-us.html
    • https://techspace.co.th/