Category: Developer

งานพัฒนาระบบ, เขียนโปรแกรม

  • มาลองใส่ข้อความ/ภาพลายน้ำ(Watermark) บนรูปภาพที่เราอัพโหลดด้วย C# กันเถอะ

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

              และสำหรับในบทความนี้ทางผู้เขียนจึงถือโอกาสมาแนะนำวิธีการทำภาพลายน้ำให้กับรูปภาพที่เราบันทึกข้อมูลจากการอัพโหลดไฟล์โดยระบบที่พัฒนาขึ้นกันค่ะ โดยวิธีการเพิ่มลายน้ำสามารถทำได้หลายทาง อาจจะเป็นการนำรูปภาพทั้งหมดที่มีการอัพโหลดมาตกแต่งด้วยโปรแกรมตกแต่งภาพ แต่ในกรณีนี้ ผู้เขียนจะขอแนะนำวิธีเบื้องต้นในการพัฒนาโปรแกรมในการใส่ลายน้ำให้กับภาพตอนอัพโหลดไฟล์ด้วย C#  เพื่อเป็นแนวทางให้กับผู้อ่านได้นำไปต่อยอดงานพัฒนาของตนเองได้ ซึ่งในบทความนี้จะแบ่งวิธีที่มาแนะนำการใส่ลายน้ำให้กับรูปภาพที่อัพโหลดออกเป็น 2 แบบดังนี้ค่ะ

    1.การใส่ลายน้ำแบบข้อความ โดยการทำลายน้ำด้วยวิธีนี้ เราจะต้องมีการระบุข้อความที่เราต้องการให้แสดงลายน้ำในภาพที่ทำการอัพโหลด ซึ่งขั้นตอนการทำลายน้ำ มีดังนี้

    1.1 เพิ่ม Library ที่เกี่ยวข้องเพิ่มเติมเข้ามา

    using System.IO;
    using System.Drawing;

    1.2 สร้างหน้าจอที่มี File upload และปุ่มเพื่อทำการอัพโหลดไฟล์

    .aspx page

       <html >
            <head runat="server">
            <title></title>
            </head>
            <body>
                    <form id="form1" runat="server">
                            <div><asp:FileUpload ID="FileUpload" runat="server" />
                            <asp:Button runat="server" Text="Upload" ID="btnSave" OnClick="btnSave_Click" />
                            </div>
                    </form>
            </body>
        </html>

    1.3 สร้างเมธอดที่ใช้ในการสร้างภาพลายน้ำ ที่ชื่อว่า AddTextWatermark() โดยมีพารามิเตอร์เป็นข้อความที่ต้องการให้แสดงเป็นลายน้ำ ดังนี้

    Code C#

    เมธอด AddTextWatermark

     protected void AddTextWatermark(string watermarkText)
            {
                ////รับพารามิเตอร์เป็นข้อความที่ต้องการแสดงผล ในชื่อตัวแปร watermarkText 
                ////สร้างตัวแปรรูปภาพที่ได้จากการอัพโหลดไฟล์โดยผู้ใช้งาน ในชื่อตัวแปร image
                System.Drawing.Image image = System.Drawing.Image.FromStream(FileUpload.PostedFile.InputStream);
    
                ////หาค่าความกว้างและความสูงของภาพที่อัพโหลดใส่ตัวแปร w และ h
                int w = image.Width;
                int h = image.Height;
    
                ////สร้างตัวแปรชื่อรูปภาพที่จะบันทึกใหม่จากการรอัพโหลดไฟล์โดยผู้ใช้งาน ในชื่อตัวแปร genName
                string genName = Guid.NewGuid().ToString() + Path.GetExtension(FileUpload.PostedFile.FileName);
    
                ////สร้างตัวแปร Bitmap ในชื่อ bmp และระบุค่าความสูงและความกว้างตามภาพที่ได้ทำการอัพโหลด 
                System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(w, h);
    
                ////กำหนดค่าต่างๆให้กับ Graphics ในตัวแปรที่ชื่อว่า g จากตัวแปร Bitmap ที่สร้างไว้
                System.Drawing.Graphics g = System.Drawing.Graphics.FromImage((System.Drawing.Image)bmp);
                g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
                g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                g.Clear(System.Drawing.Color.Transparent);
                g.DrawImage(image, 0, 0, w, h);
    
                ////กำหนดขนาดของตัวอักษร และค่าต่างๆในการแสดงผลของตัวอักษรของข้อความ
                System.Drawing.Font drawFont = new System.Drawing.Font("Arial", 30, FontStyle.Bold, GraphicsUnit.Pixel);
    
                ////หาขนาดของข้อความ ตามค่าตัวอักษร(font)ที่ระบุข้างต้น
                SizeF textSize = new SizeF();
                textSize = g.MeasureString(watermarkText, drawFont);
    
                /////กำหนดสีของข้อความที่ต้องการทำลายน้ำและการกำหนดสีแบบ transparency
                System.Drawing.SolidBrush drawBrush = new System.Drawing.SolidBrush(Color.FromArgb(200, 211, 211, 211));
    
                /////กำหนดจุดหมุนจากจุดกึ่งกลางภาพ และหมุนให้ข้อความเอียง 45 องศา
                g.TranslateTransform(bmp.Width / 2, bmp.Height / 2);
                g.RotateTransform(45);
    
                ////ระบุข้อความ ลักษณะตัวอักษร สีและตำแหน่งในการวางข้อความลงบนรูปภาพที่กำหนด โดยจะกำหนดให้อยู่กึ่งกลางภาพแบบทะแยงมุม 45 องศา
                g.DrawString(watermarkText, drawFont, drawBrush, -(textSize.Width / 2), -(textSize.Height / 2));
                System.Drawing.Image newImage = (System.Drawing.Image)bmp;
    
                ////บันทึกภาพไปยังที่อยู่ไฟล์ที่ระบุ
                newImage.Save(Server.MapPath("~/Uploads/" + genName));
                g.Dispose();
            }

    เรียกใช้เมธอดเมื่อกดปุ่ม Upload โดยส่งพารามิเตอร์เป็นข้อความที่ต้องการให้แสดงลายน้ำบนภาพไป

    protected void btnSave_Click(object sender, EventArgs e) {       AddTextWatermark("Copyrights (c) 2023"); }

    ผลลัพธ์ตัวอย่าง

    เพิ่มเติม

    1. หากต้องการเปลี่ยนตำแหน่งของภาพลายน้ำ สามารถทำได้หลายแบบ โดยผู้เขียนจะขอยกตัวอย่างกรณีที่ต้องการให้ภาพลายน้ำอยู่ตำแหน่งขวาล่าง ซึ่งปรับแก้เพิ่มเติม ดังนี้
      เปลี่ยนจาก
      /////กำหนดจุดหมุนจากจุดกึ่งกลางภาพ และหมุนให้ข้อความเอียง 45 องศา
      g.TranslateTransform(bmp.Width / 2, bmp.Height / 2);
      g.RotateTransform(45);

      ////ระบุข้อความ ลักษณะตัวอักษร สีและตำแหน่งในการวางข้อความลงบนรูปภาพที่กำหนด โดยจะกำหนดให้อยู่กึ่งกลางภาพแบบทะแยงมุม 45 องศา
      g.DrawString(watermarkText, drawFont, drawBrush, -(textSize.Width / 2), -(textSize.Height / 2));
      System.Drawing.Image newImage = (System.Drawing.Image)bmp;
      เป็น 
      Point position = new Point((bmp.Width – ((int)textSize.Width + 10)), (bmp.Height – ((int)textSize.Height + 10)));

      ////ระบุข้อความ ลักษณะตัวอักษร สีและตำแหน่งในการวางข้อความลงบนรูปภาพที่กำหนด โดยจะกำหนดให้อยู่ขวาล่างแทน
      g.DrawString(watermarkText, drawFont, drawBrush, position);
      แทน
    2. ในการนำไปใช้งานจริง ในส่วนของตำแหน่ง สีและขนาดตัวอักษร ท่านสามารถระบุได้ตามความเหมาะสมเพื่อให้รองรับกับการใช้งานจริง ในตัวอย่างเป็นเพียงกรณีศึกษาเท่านั้นค่ะ

    ตัวอย่างผลลัพธ์หลังมีการปรับตำแหน่งการแสดงผลลายน้ำ

    2.การใส่ลายน้ำด้วยรูปภาพ หลังจากที่เราได้ลองทำลายน้ำบนภาพด้วยข้อความกันไปแล้ว คราวนี้เราจะลองแบบกรณีที่ต้องการให้นำภาพมาเป็นลายน้ำบนรูปภาพที่ทำการอัพโหลดกันบ้างค่ะ โดยมีวิธี ดังนี้นะคะ

    Code C#

    เมธอด AddImageWatermark

       protected void AddImageWatermark(string watermarkImagePath)
            {
                try {
                    ////สร้างตัวแปรชื่อรูปภาพที่จะบันทึกใหม่จากการรอัพโหลดไฟล์โดยผู้ใช้งาน ในชื่อตัวแปร genName
                    string genName = Guid.NewGuid().ToString() + Path.GetExtension(FileUpload.PostedFile.FileName);
    
                    ////ประกาศตัวแปรของไฟล์รูปภาพที่ทำการอัพโหลด
                    using (Bitmap image = (Bitmap)System.Drawing.Image.FromStream(FileUpload.PostedFile.InputStream))
    
                    ////ประกาศตัวแปรไฟล์ภาพที่ต้องการนำมาทำเป็นภาพลายน้ำ
                    using (System.Drawing.Image watermarkImage = System.Drawing.Image.FromFile(watermarkImagePath))
    
                    using (Graphics imageGraphics = Graphics.FromImage(image))
                    using (TextureBrush watermarkBrush = new TextureBrush(watermarkImage))
                    {
                        ////หาจุดตำแหน่งกึ่งกลางภาพที่ต้องการวางภาพลายน้ำ
                        int x = (image.Width / 2 - watermarkImage.Width / 2);
                        int y = (image.Height / 2 - watermarkImage.Height / 2);
                        watermarkBrush.TranslateTransform(x, y);
                        imageGraphics.FillRectangle(watermarkBrush, new Rectangle(new Point(x, y), new Size(watermarkImage.Width + 1, watermarkImage.Height)));
    
                        ////บันทึกรูปภาพตามที่อยู่(Path)ที่ระบุ
                        image.Save(Server.MapPath("~/Uploads/" + genName));
                    }
                }
                catch (Exception ex)
                {
                    ////แสดงข้อความแจ้งเตือนกรณีที่พบข้อผิดพลาดระหว่างดำเนินการ
                    Page.ClientScript.RegisterClientScriptBlock(Page.GetType(), "alert", "alert('ไม่สามารถอัพโหลดไฟล์และทำลายน้ำภาพดังกล่าวได้" + ex.Message + "')", true);
                }
               
            }

    เรียกใช้เมธอดเมื่อกดปุ่ม Upload โดยส่งพารามิเตอร์เป็นที่อยู่ของภาพที่ต้องการให้แสดงลายน้ำบนภาพไป

    protected void btnSave_Click(object sender, EventArgs e) { string strWaterMark = HttpContext.Current.Server.MapPath("~/images/preview.png");       AddImageWatermark(strWaterMark); }

    ผลลัพธ์ตัวอย่าง

    หมายเหตุ : หน้า aspx ที่ใช้จะเป็นแบบเดียวกับวิธีที่ 1 (การทำลายน้ำแบบข้อความ) แต่จะแตกต่างกันเฉพาะในส่วนของการทำงานใน btnSave_Click ที่มีการเรียกใช้เมธอดและส่งค่าพารามิเตอร์ต่างกันค่ะ

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

    แหล่งอ้างอิง

  • DevToys รวมเครื่องมือใช้บ่อยของโปรแกรมเมอร์

    เคยมั้ยครับ

    ได้ข้อมูลรูปแบบ JSON มาอยากจัดรูปแบบให้อ่านได้ง่าย (ค้น google หาเว็บจัดรูปแบบ)

    อยาก Decode JWT ออกมาดูก่อนเริ่มเขียนโปรแกรมอ่านค่า (ค้น google หาเว็บ Decode)

    อยากทดสอบ Regex ที่เขียนว่าถูกต้องหรือไม่ (ค้น google หาเว็บทดสอบ)

    ฯลฯ

    https://devtoys.app/

    DevToys คือ ซอฟแวร์ที่รวมเอา Utility ที่เหล่า Dev ใช้งานบ่อยๆเอาไว้ที่เดียวกัน ในรูปแบบ Windows App ทำให้สะดวกต่อการเรียกใช้งานมากครับ และที่สำคัญฟรี เพราะพัฒนาขึ้นโดย Community ของ Dev ที่ทำงานบนระบบปฏิบัติการ Windows แล้วรู้สึกว่าขาดสิ่งอำนวยความสะดวกเหล่านี้ (แนวคิดคล้ายๆกับ PowerToys ชื่อยังล้อกันมาด้วย)

    โดยโปรแกรมนี้ก็จะมีเมนูที่แบ่งหมวดหมู่แยกไว้ตามแต่ละประเภท ดังรูป

    เมื่อเราคลิกเข้าไปในแต่ละเมนู ก็จะมี UI ที่เรียบง่าย สามารถเข้าใจวิธีการใช้งานได้ทันที

    ตัวอย่างการใช้งาน

  • แก้ปัญหาการเรียกใช้ font ผ่าน css แล้วเกิด error Access to font at has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource.

    เนื่องด้วยทางทีมงานต้องการใช้ font ผ่าน css ที่อยู่คนละที่ โดยต้องการให้ไปเรียกที่เดียวเพื่อการจัดการง่าย แต่ปัญหาก็เกิดขึ้น เพราะทางต้นทางมีการ block ไม่ให้เข้าถึง วันนี้จึงมีแนวทางการแก้ปัญหาดังนี้

    ขั้นตอนที่ 1 ไปตั้งค่าไฟล์ font ที่ต้องการ โดยในที่นี้ เป็น folder fonts โดยไปที่ IIS เลือก folder ที่ต้องการ จากนั้นเลือกเมนู “HTTP Response Headers” จากนั้น กด “Add” ดังรูป

    ขั้นตอนที่ 2 เพิ่ม Name: Access-Control-Allow-Origin และ Value: * ดังรูป

    ขั้นตอนที่ 3 ผลลัพธ์จากการเพิ่ม Name: Access-Control-Allow-Origin และ Value: * ดังรูป

    ขั้นตอนที่ 4 เพิ่ม Name: Access-Control-Allow-Origin และ Value: * ที่ไฟล์ font.css ด้วยเหมือนกัน

    ขั้นตอนที่ 5 ปรับแก้การเรียกใช้ css โดยใช้ SRI Hash Generator ผ่าน SRI Hash Generator

    ขั้นตอนที่ 6 เวบไซต์ปลายทางก็จะสามารถเรียกใช้ font จาก เวบไซต์ต้นทาง ดังรูป

    หวังว่าจะเป็นประโยชน์ให้กับคนที่มีปัญหาแบบเดียวกันนี้นะคะ

    ที่มา

  • upgrade crystal report version 10 ไปเป็น version 13

    เนื่องด้วยตอนนี้ crystal report version 10 มันเก่ามากแล้วทางผู้เขียนเลยอยากจะ upgrade crystal report version 10 ไปเป็น version 13 ดังนั้นจึงสรุปขั้นตอนไว้เพื่อเป็นแนวทางการทำงานของคนที่มีปัญหาเดียวกัน ดังนี้

    ขั้นตอนที่ 1 แก้ web.config ใน project web application โดยเปลี่ยนเลข version จาก 10.2.3600.0 เป็น 13.0.2000.0

    ขั้นตอนที่ 2 copy folder crystalreportviewers13 ใส่ไว้ที่ project web application

    ขั้นตอนที่ 3 แก้ page ที่เรียกใช้ crystal report โดยเปลี่ยนเลข version จาก 10.2.3600.0 เป็น 13.0.2000.0

    ขั้นตอนที่ 4 แก้ page ที่เรียกใช้ crystal report โดยเพิ่มการเรียก JavaScript ในส่วนของ tag head

    ขั้นตอนที่ 5 ลองเรียกใช้ page ที่มี crystal report ได้ผลลัพธ์ดังรูป

    ทางผู้เขียนหวังว่าจะมีประโยชน์ในการ upgrade crystal report version 10 ไปเป็น version 13 ใน source code ที่เรียกใช้ version เก่านะคะ

  • สร้าง UI หน้าเว็บแบบ Timeline ด้วย HTML+CSS

    เนื่องจากระบบที่กำลังพัฒนาอยู่ มีความต้องการแสดงผลข้อมูลในรูปแบบ Timeline ดังรูป

    เมื่อลองหาแนวทางดูพบว่ามี how to ที่เว็บไซต์ https://www.w3schools.com/howto/howto_css_timeline.asp ลองนำมาประยุกต์ใช้ โดยปรับสี เพิ่มเงา และส่วนแสดงผลรูป และไอคอนเข้าไป โดยใช้ https://getbootstrap.com/ เวอร์ชัน 5 เพื่อช่วยในการจัดตำแหน่งเนื้อหาด้านใน ก็จะได้ CSS และ HTML สำหรับนำไปใช้ในเว็บไซต์ดังนี้

    
    CSS (ตัด media query ออก เนื่องจากใช้ flex box ช่วยในการทำ responsive อยู่แล้ว)
    
    .timeline {
        position: relative;
        /*max-width: 1200px;*/
        margin: 0 auto;
    }
    
        .timeline::after {
            content: '';
            position: absolute;
            width: 6px;
            background-color: #977c44;
            top: 0;
            bottom: 0;
            left: 50%;
            margin-left: -3px;
        }
    
    .timeline-container {
        padding: 10px 40px;
        position: relative;
        background-color: inherit;
        width: 50%;
    }
    
        .timeline-container::after {
            content: '';
            position: absolute;
            width: 25px;
            height: 25px;
            right: -12px;
            background-color: white;
            border: 4px solid #FF9F55;
            top: 15px;
            border-radius: 50%;
            z-index: 1;
        }
    
    .timeline-left {
        left: 0;
    }
    
    .timeline-right {
        left: 50%;
    }
    
    .timeline-left::before {
        content: " ";
        height: 0;
        position: absolute;
        top: 22px;
        width: 0;
        z-index: 1;
        right: 30px;
        border: medium solid white;
        border-width: 10px 0 10px 10px;
        border-color: transparent transparent transparent white;
    }
    
    .timeline-right::before {
        content: " ";
        height: 0;
        position: absolute;
        top: 22px;
        width: 0;
        z-index: 1;
        left: 30px;
        border: medium solid white;
        border-width: 10px 10px 10px 0;
        border-color: transparent white transparent transparent;
    }
    
    .timeline-right::after {
        left: -12px;
    }
    
    .timeline-content {
        padding: 20px 30px;
        background-color: white;
        position: relative;
        border-radius: 6px;
    }

    HTML โดยในตัวอย่างได้นำโครงสร้าง html page และ ส่วนแสดงอีโมไอคอนออกเพื่อให้อ่านง่าย เห็นโครงสร้าง html ของ timeline ชัดเจน และต้องมีรูปอยู่ที่โฟลเดอร์ images (ภาพประกอบเนื้อหาของท่านเอง)

    /*Include Bootstrap 5*/
    <link href="css/bootstrap.min.css" rel="stylesheet" />
    
    <div class="timeline">
        <div class="timeline-container timeline-left">
            <div class="timeline-content shadow-lg">
                <div class="d-flex justify-content-between align-items-baseline">
                    <img src="/images/location01.jpg" class="rounded-3 img-shadow" width="150" height="150" />
                    <h3 class="text-brown text-shadow">พ.ศ. 1601-1700</h3>
                </div>
                <p>อุทยานประวัติศาสตร์พระนครศรีอยุธยา สัมผัสความรุ่งเรืองของกรุงศรีอยุธยา อดีตราชธานีที่ปกครองแผ่นดินมายาวนานถึง 417 ปี ภายในมีโบราณสถานมากมายน่าเที่ยว ทั้ง พระราชวังหลวง วัดพระศรีสรรเพชญ์ วัดราชบูรณะ วัดมหาธาตุ วัดไชย...</p>
            </div>
        </div>
        <div class="timeline-container timeline-right">
            <div class="timeline-content shadow-lg">
                <div class="d-flex justify-content-between align-items-baseline">
                    <img src="/images/location02.jpg" class="rounded-3 img-shadow" width="150" height="150" />
                    <h3 class="text-brown text-shadow">พ.ศ. 1601-1700</h3>
                </div>
                <p>อุทยานประวัติศาสตร์พนมรุ้ง ปราสาทหินพนมรุ้งเป็นโบสถ์พราหมณ์ลัทธิไศวะ มีการบูรณะก่อสร้างต่อเนื่องกันมาหลายสมัย ตั้งแต่ประมาณพุทธศตวรรษที่ 15 ถึงพุทธศตวรรษที่ 17 และในพุทธศตวรรษที่ 18 พระเจ้าชัยวรมันที่ 7 แห่ง...</p>
            </div>
        </div>
        <div class="timeline-container timeline-left">
            <div class="timeline-content shadow-lg">
                <div class="d-flex justify-content-between align-items-baseline">
                    <img src="/images/location01.jpg" class="rounded-3 img-shadow" width="150" height="150" />
                    <h3 class="text-brown text-shadow">พ.ศ. 1601-1700</h3>
                </div>
                <p>อุทยานประวัติศาสตร์พระนครศรีอยุธยา สัมผัสความรุ่งเรืองของกรุงศรีอยุธยา อดีตราชธานีที่ปกครองแผ่นดินมายาวนานถึง 417 ปี ภายในมีโบราณสถานมากมายน่าเที่ยว ทั้ง พระราชวังหลวง วัดพระศรีสรรเพชญ์ วัดราชบูรณะ วัดมหาธาตุ วัดไชย...</p>
            </div>
        </div>
        <div class="timeline-container timeline-right">
            <div class="timeline-content shadow-lg">
                <div class="d-flex justify-content-between align-items-baseline">
                    <img src="/images/location02.jpg" class="rounded-3 img-shadow" width="150" height="150" />
                    <h3 class="text-brown text-shadow">พ.ศ. 1792-2006</h3>
                </div>
                <p>อุทยานประวัติศาสตร์ศรีสัชนาลัย ศรีสัชนาลัย มีพัฒนาการมาแต่สมัยก่อนประวัติศาสตร์ตอนปลาย ประมาณ ๒,๓๐๐ – ๑,๕๐๐ ปีมาแล้ว โดยปรากฏชื่อควบคู่ไปกับเมืองสุโขทัยที่เป็นราชธานี สันนิษฐานว่าเมืองศรีสัชนาลัยมีความสำคัญในฐาน...</p>
            </div>
        </div>
    </div>

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

  • UX Design Processes

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

    รูปภาพแสดง design process โดย The Efficient Approach: How to Design a Lean UX MVP | Toptal

    Step 1 : Understanding Environment (Discovery phase)

    เป็น phase แห่งการทำความเข้าใจ การทำความเข้าใจในที่นี้หมายถึง การที่เราเข้าใจผู้ใช้, เข้าใจ brand, เข้าใจในเงื่อนไขต่างๆ เพื่อที่จะเอามาเป็นแนวทางในการทำ research ให้ phase ถัดไป

    • User การทำความเข้าใจผู้ใช้งานระบบ -> Pain Point discovery
      • การค้นหา Pain point ของผู้ใช้
      • เราต้องเข้าใจว่าปัญหาของผู้ใช้คืออะไรบ้าง
      • เราคิดว่าจะแก้ไขปัญหาให้กับผู้ใช้ได้อย่างไรบ้าง
    • Brand เป้าหมาย/จุดประสงค์ขององค์กร
      • เราต้องรู้โปรเจคนี้มีความเกี่ยวข้องกับภารกิจหรือเป้าหมายขององค์กรเราอย่างไร ต้องพยายามยึดติดอยู่กับเป้าหมายขององค์กรเพราะมันจะเป็นสิ่งที่ทำให้องค์กรประสบความสำเร็จได้
    • Clear Needs & Conditions ความต้องการและเงื่อนไขที่ชัดเจน
      • เราจะทำอะไร
      • เราต้องทำภายใต้เงื่อนไขอะไรบ้าง

    Step 2 : Research (Infomation Gathering, Hypothesis phase)

    เมื่อเราทราบถึงเป้าหมายของการสร้างหรือพัฒนาสินค้าและทราบถึงปัญหาของผู้ใช้แล้ว ขั้นต่อไปคือการค้นหาข้อมูลเพิ่มเติม

    phase นี้จึงเป็น phase แห่งการค้นคว้า เก็บข้อมูลตั้งต้นเพื่อที่จะนำมาวิเคราะห์ในขั้นตอนต่อไป การ research มีด้วยกันหลายวิธี

    Interview การสัมภาษณ์

    • 1:1 Interview การสัมภาษณ์ตัวต่อตัวกับผู้ใช้
      • จะเป็นเหมือนการพูดคุยทั่วไปถึงเรื่องการใช้งานระบบ เคยเจอปัญหาอะไรมาบ้าง ยังคงติดปัญหาในจุดไหนอยู่ไหม ในการใช้งานระบบเขามองหาอะไรอยู่
      • การสัมภาษณ์แบบตัวต่อตัวทำให้ทราบถึงความจริงใจและอารมณ์ของผู้ใช้ สามารถนำมาเป็นตัววัดความเที่ยงตรง เชื่อถือได้ของข้อมูลชุดนั้น
      • การสัมภาษณ์แบบนี้สามารถทำแบบพูดคุยตัวต่อตัวหรือทาง meeting/conference/telephone ก็ได้
    • Group Interview การสัมภาษณ์แบบกลุ่ม
      • เป็นวิธีการที่ให้ข้อมูลได้แบบไม่ค่อยละเอียด แต่ได้จุดที่สำคัญ มีการกรองกันจากการพูดคุยภายในกลุ่ม ลักษณะการถามก็จะเป็นเหมือนการสัมภาษณ์แบบตัวต่อตัว
      • การสัมภาษณ์ด้วยวิธีนี้อาจจะต้องนำข้อมูลมาวิเคราะห์ค่าเฉลี่ยเพิ่มขึ้นมา
      • กลุ่มของผู้ใช้ 3-5 คนก็เพียงพอไม่จำเป็นต้องไปเก็บจากผู้ใช้ 100-1000 คน (Rule of thumb)

    Surveys การทำแบบสอบถาม

    ในการสร้างแบบสอบถามขึ้นมา เราต้องรู้ถึงปัญหาของผู้ใช้ ปัญหานี้เกิดในผู้ใช้กลุ่มไหน แล้วนำข้อมูลนั้นมาวิเคราะห์ออกมาเป็นสมมติฐาน

    • หลักการสร้างแบบสอบถาม
      • แยกปัญหาออกมา โดยดูความสำคัญว่า ปัญหาอันไหนสามารถวัดและทำ Testing ได้แล้วนำมาทำให้เป็นคำถามแบบที่ Interactive ได้
      • พยายามตั้งคำถามปลายเปิดแต่ยังสามารถทำให้เรามองเห็นคำตอบได้
      • *ไม่ควรตั้งคำถาม Yes/No, Rating เนื่องจากไม่สามารถนำข้อมูลมาพัฒนาต่อได้
    รูปภาพแสดงการทำ Heat map analysis
    • ตัวอย่างของการทำ survey ที่ดี
      • Hypothesis: สงสัยว่าหน้าแรกของระบบมันไม่จูงใจผู้ใช้ ทำให้ผู้ใช้ออก (nothing grabs user’s attention)
        • วิธีถาม: 5seconds test นำหน้าเว็ปจริงๆมาและใช้ Heat map ในการวิเคราะห์โดยกำหนดโจทย์ว่า ให้ผู้ประเมินคลิกจุดแรกที่ผู้ใช้สนใจภายใน 5วินาที
        • คำตอบ: Heat map result ผู้ใช้สนใจตรงไหนมากที่สุด สามารถนำข้อมูลมาวิเคราะห์ต่อได้
      • Hypothesis: ข้อสงสัยที่คิดว่าลูกค้าไม่เข้าใจว่าเค้าทำอะไรได้บ้างบนเว็ปไซต์ของเขา
        • วิธีถาม: 5seconds test ดูหน้าเว็ปแล้วถามว่า คิดว่าหน้านี้เขาสามารถทำอะไรได้บ้าง
        • คำตอบ: ลำดับของความชัดเจนว่า ผู้ใช้สนใจอะไรเป็นอันดับแรก และอันดับตามๆมา
      • Hypothesis: สงสัยว่า content มันน่าจะไม่ดึงดูดผู้ใช้แน่ๆ
        • วิธีถาม: นำเว็ปไซต์คู่แข่งมาเปิดคู่กันกับเว็ปไซต์เราและทำในลักษณะของ A/B testing โดยทำ hot spot test ให้ผู้ประเมินเลือก section ของเว็ปตัวอย่าง 3 ชิ้นที่คิดว่าจำเป็นสำหรับเขา
        • คำตอบ: section ที่เขามองหาแต่เราไม่มี หรือจุดไหนที่มีเหมือนกัน หรือจุดไหนที่เรามีแต่คนอื่นไม่มี
    • ข้อดี:: Scale ได้, รวดเร็ว, วิเคราะห์ง่าย
    • ข้อเสีย:: คำตอบอาจจะมีการเอนเอียงได้ (Bias) ไม่สามารถอธิบายแทนสิ่งที่ผู้ใช้เจอมาได้ทั้งหมด คำตอบที่ได้ไม่หลากหลาย และมีความเสี่ยงต่อการสูญเสียข้อมูลจากผู้ใช้ ถ้ามีการออกแบบแบบสอบถามไม่ดี ทำให้เกิดการพลาดโอกาส

    Usability Testing การสำรวจการใช้งานในกลุ่มเป้าหมาย

    การทำ Usability test จะทำให้เราทราบถึง pain point และ happy point ของระบบได้ชัดเจนมากขึ้น

    • User testing คือการทำ test โดยการเปิดหน้าจอให้ผู้ใช้ลองทำ Task บางอย่างแล้วเราสังเกตุการใช้งาน แล้วบันทึกวิธีการ Interact และ Reaction ของผู้ใช้ระหว่างการใช้งาน
    • A/B Testing คือการทำ test โดยมีการสร้างระบบขึ้นมา 2 เวอร์ชั่นขึ้นไปมา แล้วนำไปทำ user testing เพื่อวัดผลว่าเวอร์ชั่นไหน user happy ที่สุด
      • อาจจะทำเป็น Prototype ก็ได้ ไม่จำเป็นต้อง Coding ขึ้นมาจริงๆ
    • Click heat คือการดูว่าผู้ใช้กำลังคลิกตรงไหน บริเวณไหนที่มีการ Interact บ่อยๆหรือไม่มีการ Interact ทำให้เราได้ข้อมูลสมมติฐานไปคุยกับ user ต่อไปได้ (tool e.g. Hotjar)

    Contextual Inquiry การสำรวจโดยลงพื้นที่จริง ที่มีการใช้งานจริง

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

    • ข้อดี:: ได้ผลการสัมภาสที่เป็นประสบการณ์จากผู้ใช้เองโดยตรง, ผู้สัมภาสได้มีอารมณ์ร่วมกับผู้ให้ประเมิน รับรู้ครบถ้วนในด้านตั้งแต่ประสบการณ์ ทัศนคติ แรงจูงใจ ความประทับใจเป็นต้น
    • ข้อเสีย:: ในกรณีที่เป็นเรื่องส่วนตัวก็จะไม่สามารถติดตามวัดผลได้ ต้องถามความสะดวกใจของผู้ใช้ด้วย, ต้องมีการเดินทางไปในแต่ละสถานี ส่งผลถึงเรื่องงบประมาณ

    วิธีการทำ Research อื่นๆ ศึกษาต่อได้ที่ More Research Techniques


    Step 3 : Analyze (Brain Storming)

    เป็น phase แห่งการวิเคราะห์ กลั่นกรองข้อมูลออกมาให้เหลือแต่สิ่งที่สำคัญ ขั้นตอนนี้สามารถทำได้หลายกระบวนการ แต่เราจะยกตัวอย่างมาให้เล็กน้อยก่อน

    รูปภาพแสดง User Persona

    User Persona สร้างโปรไฟล์ตัวอย่างของผู้ใช้

    เป็นเหมือนเข็มทิศในการออกแบบ การตัดสินใจ การออกแบบจะแก้ปัญหาของผู้ใช้อย่างไร แล้วจะตอบสนองความต้องการของเขาได้อย่างไร ซึ่งจะประกอบไปด้วย

    • Bare necessities ข้อมูลจำเป็นเบื้องต้น
      • ชื่อ-นามสกุล อายุ เพศ ที่อยู่ อาชีพ และอื่นๆ
      • ประวัติโดยย่อ
      • แผนผังบุคลิก
    • User’s image รูปภาพของผู้ใช้
      • บางครั้งรูปภาพของผู้ใช้สามารถบ่งบอกได้ถึงหลายๆอย่าง มากกว่าการเขียนบรรยาย
      • การแต่งกายของผู้ใช้ก็สามารถบ่งบอกถึงบุคลิกได้
    • Personality แถบที่บ่งบอกถึงนิสัยของผู้ใช้
      • สามารถทำเป็นแถบค่าพลังบ่งบอกความเป็นบุคลิกต่างๆได้เช่น Extroverted ⇔ Introverted, Passive ⇔ Active, Analytical ⇔ Creative เป็นต้น
    • Goals and Motivations เป้าหมายและแรงบรรดาลใจ
      • เป้าหมายของผู้ใช้ ทำให้เราสามารถสร้างระบบที่ไปตอบโจทย์เป้าหมายของผู้ใช้
      • แรงบรรดาลใจของผู้ใช้ ก็สามารถนำมาเป็นปัจจัยที่ต้องนำมาวิเคราะห์ก่อนออกแบบ
      • ยกตัวอย่าง การซื้อของออนไลน์ผ่านระบบ e-commerce
        • เป้าหมายของผู้ใช้คือ อยากได้สินค้าที่มีราคาถูกที่สุด คุ้มค่าที่สุด
        • แรงบรรดาลใจของผู้ใช้คือ ต้องการการเปรียบเทียบสินค้าในเรทราคาเท่าๆกัน
        • เราสามารถนำข้อมูลทั้ง 2 มาวิเคราะห์ออกแบบระบบให้รองรับได้เช่น การแนะนำสินค้าใกล้เคียงกับสินค้าที่ผู้ใช้กำลังดูอยู่ มีการแนะนำร้านที่แนะนำโดย platform หรือเรียงตามเรทของสินค้า
    • Pain points จุดที่ผู้ใช้ไม่ชอบ หรือ ข้อเสียของระบบที่ต้องแก้
      • เป็นสิ่งที่ต้องวิเคราะห์ออกมาจากการสัมภาสหรือได้มาจากการสัมภาสโดยตรง ข้อมูลส่วนนี้คือสิ่งที่ต้องให้ความสำคัญมากๆ ระบบที่สร้างขึ้นมาจะต้องแก้ไข pain points เหล่านี้ให้ได้
      • แก้ได้ = User happy

    User Journey mapping แผนผังแสดง Interaction ของผู้ใช้

    รูปภาพแสดง User Journey mapping

    การทำ user journey จะช่วยให้เรามองเห็นภาพรวมของระบบ ในขั้นตอนต่างๆว่า ผู้ใช้รู้สึกอย่างไร จุดไหนที่ต้องมีการปรับปรุงอีก

    User journey จะประกอบด้วย Flow การทำงานของระบบที่ผู้ใช้จะต้องเจอ ข้อมูล Emotions หรืออารมณ์ที่ผู้ใช้จะต้องเจอในแต่ละหน้าแต่ละขั้นตอน ข้อมูลความคิดของผู้ใช้ ณ ขณะนั้นซึ่งสัมพันธ์กับข้อมูลอารมณ์ของผู้ใช้ ข้อมูลโอกาสที่เราวิเคราะห์ออกมาว่า ณ ขณะนั้น เราสามารถ Offer อะไรให้กับผู้ใช้ได้บ้าง ข้อมูลประสบการณ์ มีความง่ายในการใช้งานมากแค่ไหน น่าเบื่อหรือไม่ และข้อมูลอื่นๆเพิ่มเติมที่สามารถนำมาวิเคราะห์ได้

    **นอกเหนือจากการทำ User persona และ User journey ที่กล่าวมาข้างต้น ยังมีวิธีการทำ Analyze อีกหลายวิธีเช่น การทำ Storyboard, Card Sorting, SWOT Analysis, Use cases และอื่นๆ More Analyze Techniques


    Step 4 : Design (Experiment phase)

    หลังจากได้ผ่านขั้นตอนแห่งการวิเคราะห์มา ขั้นตอนต่อไปคือการทำให้เกิดขึ้นมา ทำให้ Test ได้ ไม่ว่าจะเป็นการทำ Wireframe หรือ Prototype ขั้นตอนนี้เป็น phase แห่งการทดลอง ลองผิดลองถูก อ้างอิงจาก use case ต่างๆ นำข้อมูลที่ได้จากการ Analyze มาสร้างเป็นสิ่งที่สามารถทดสอบได้ ในขั้นตอนนี้จะประกอบไปด้วยการออกแบบในหลายๆส่วน ส่วนหลักๆจะประกอบไปด้วย

    รูปภาพแสดง Wireframe low-fidelity
    • Site map แผนผังของระบบ
      • ไม่ซับซ้อน
      • หน้าต่างๆอยู่ถูกที่ ถูกลำดับชั้น
    • User flow แผนผังการดำเนินการของผู้ใช้ หน้าไหนไปหน้าไหน
    • Information Architechture ออกแบบโครงสร้างของข้อมูลเช่น จัดหมวดหมู่ให้กับข้อมูล
    • Design system แกนหลักในการออกแบบ ประกอบด้วย
      • Typography ชุดตัวอักษร
      • Color Scheme ชุดโทนสี (Primary, Secondary, Accent, Success, Danger, Warning, Default)
      • Icon ชุด Icon
      • Image โทนการใช้รูปภาพภายในระบบ (Photos, Vertor Images, 3D)
      • (optional) Component สำเร็จรูป
    • Wireframe low-fidelity ต้นแบบของระบบ ไม่จำเป็นต้องมีข้อมูล โครงแบบร่างในกระดาษหรือโปรแกรมที่สามารถบอกได้ถึงความเชื่อมโยงระหว่างหน้าและรูปแบบของหน้าจอ
      • แสดงข้อมูลต่างๆ ที่ต้องแสดงในแต่ละหน้า
      • เป็นตัวตีกรอบโครงสร้างของแต่ละหน้าได้
      • แสดงให้เห็น Flow การทำงานและเป็นตัวอธิบาย Interface ในหน้าต่างๆ
    • Prototype การนำ Wireframe มาลงรายละเอียดจริง และนำมา mockup บนอุปกรณ์ต่างๆ เพื่อใช้ในการทดสอบและประเมินผล

    Loop : Design > Test > Validate > Design > Test > …

    เมื่อมีการออกแบบเสร็จสิ้น เราจะต้องทำการทดสอบ ประเมินผล ถ้าไม่ผ่านการทดสอบก็ต้องวนกลับมาขั้นตอนเดิมคือ ออกแบบใหม่ ทดสอบ วนไปเรื่อยๆ จนกว่าจะผ่านไป phase ต่อไปได้


    Step 5 : Build & Launch (Make it real phase)

    เมื่อผ่านขั้นตอนของการออกแบบมาแล้ว ขั้นตอนต่อไปคือขั้นตอนของการสร้างมันขึ้นมาให้เหมือนกับที่ออกแบบไว้ ในขั้นตอนนี้อาจจะมีการปรับเปลี่ยนหน้าตาหรือขั้นตอนที่ต่างจากการออกแบบได้เนื่องจากปัจจัยทางการสร้างหรือ coding ซึ่ง ณ ขั้นตอนนี้ก็ควรปรึกษาผู้ออกแบบและช่วยกันหาทางออกร่วมกันได้ ผลที่ได้จากการสร้าง เช่น

    รูปภาพแสดง Wireframe Hi-fidelity

    Prototype หรือ Wireframe Hi-fidelity

    Prototype เป็นการนำ Wireframe มาต่อยอด มีการลงรายเอียดส่วนของสัดส่วน สี ตัวอักษร รวมถึง Icon และรูปภาพ ลงรายละเอียด Content จริงๆ มีการเชื่อมโยงปุ่มกับหน้าต่างๆหรือเรียกว่า Prototyping ให้เป็น Flow การทำงานจริงๆขึ้นมา เราสามารถนำผลงานมาขึ้น Mockup เป็น device จริงไปให้ผู้ใช้ได้ทดสอบแทนการเปิดหน้าจอ application ให้ดูผ่านจอก็ได้เช่นกัน ในส่วนนี้สามารถทำได้จากหลากหลายโปรแกรมเช่น Figma, Adobe XD และโปรแกรมอื่นๆเป็นต้น

    Implement an actual application

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

    Make sure your product is perfect! :: Do you trust in your research and analysis?

    ถ้าคิดว่าการ Launch Feature ใหม่หรือสินค้าใหม่ออกสู่ตลาดหรือออกสู่ public ยังไม่กล้าเสี่ยงลองนำผลงานที่ได้ไป

    • ทำ User testing นำไปให้ผู้ใช้ทดสอบเหมือนขั้นตอนการทำ Usability test ในขั้นตอน Research
    • ทำ Internal testing ทดสอบและรีวิวกันเองภายในทีม
    • ทำ Beta Launch ปล่อยระบบให้กับกลุ่มคนเล็กได้ทดสอบ เก็บ Feedback แล้วนำกลับมาแก้ไข

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


    Step 6 : Analyze Validation (Collect Feedback) aka ตรวจการบ้าน

    เมื่อเราได้ผ่านขั้นตอนของการสร้างมาแล้ว ผู้ใช้ได้เจอกับสิ่งที่เราปรับปรุงหรือสร้างขึ้นมาใหม่ สิ่งที่เรา research analyze design ไปนั้นมันถูกต้องแล้วใช่หรือไม่ ตอบโจทย์ปัญหา pain point ของผู้ใช้หรือไม่ ดึงดูดให้ผู้ใช้กลับมาใช้งานระบบไหม และแน่นอนสิ่งที่ต้องเกิดคู่กันกับการเปลี่ยนแปลงคือ ผลตอบรับหรือ feedback เราจะต้องมีการเก็บข้อมูล feedback มาวิเคราะห์ อาจจะมีจุดที่เราพลาดไป ทดสอบไม่เจอในกลุ่มการทดสอบ beta ก็จะได้แก้ไข ปรับปรุง feature ให้ตอบโจทย์กว่าเดิม หรือคิดว่าการปรับปรุงระบบไปในแนวทางอื่นๆอาจจะส่งผลได้ดีกว่านี้ ข้อมูลตรงนี้ก็จะไปเป็นสารตั้งต้นของการขึ้นรอบการออกแบบและพัฒนาในรอบถัดๆไป


    Loop Step 1-6 > Step 2-6 > … > Perfect** Product! (at that time)

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

    ปล. การวน loop ในแต่ละครั้งเราสามารถตัดขั้นตอนบางอย่างไปได้เช่น รอบที่ 2 อาจจะเป็นผู้ใช้คนเดิมก็ข้ามไปทำ research ได้เลย หรือมีข้อมูลจาก loop เก่าก็สามารถนำข้อมูลนั้นมา Design & Test ได้เลย การกระทำแบบนี้เราเรียกว่าการ Lean UX Process

    **Perfect มันไม่มีอยู่จริง ไม่ต้องไป keep perfect but ทำให้ใกล้คำว่า perfect ที่สุดจะดีกว่า เราไม่สามารถออกแบบหรือสร้างอะไรสักอย่างที่มันตอบโจทย์คนทั้งโลกได้ แต่ทำให้ดีที่สุดของเราได้

    Summary

    จบแล้วขั้นตอนการออกแบบ UX Design process เบื้องต้น ยาวหน่อยแต่รายละเอียดเกือบครบ จะเห็นได้ว่าจริงๆแล้วขั้นตอนทาง UX design process ได้เข้าไปเกี่ยวข้องกับทุกๆส่วนของชีวิตประวันและของรอบตัว มันมีวิธีการต่างๆหลากหลายรูปแบบ ขึ้นกับมุมมองของผู้ทำ แต่ทุกวิธี base on problem แน่นอน ถ้าเราวิเคราะห์ได้ว่าคนๆนั้นไปเจอปัญหาอะไรมา แล้วเราแก้ไขให้เขาได้ ทำไมเขาจะไม่ซื้อ/ใช้สินค้าของคุณ ที่สำคัญคือ Keep doing research, keep developing.

    Thanks for references:
    The UX design process in 6 stages | Inside Design Blog (invisionapp.com)
    What is user research? | Inside Design Blog (invisionapp.com)
    หลงไปในงาน UX Research at Agoda. เอะนั่นเห็นมี Event UX Research at… | by Dark_Spirit (Warm) | WIP team | Medium
    UX Process – UX Mastery

  • UX, everything related!

    เรามักได้ยินคำว่า UI เป็นประจำเมื่อเราพัฒนาระบบแต่ รู้หรือไม่ว่านอกจาก UI แล้วมันมีอีกหนึ่งอย่างที่ควรรู้และสำคัญยิ่งกว่าแต่ถูกมองข้ามไปคือ UX (ย่อมาจาก User experience) หลายๆคนมักจะสับสนว่า UI และ UX มันคือสิ่งเดียวกัน จริงๆแล้วมันคือคนละอย่างกันเลย วันนี้เราจะมาเล่าให้ฟัง

    รูปภาพจาก UX vs. UI Design: What’s the Difference? – louelledesignstudio

    UI :: User Interface

    User Interface คือหน้าตาของระบบที่ผู้ใช้ได้เห็น ได้ตอบสนอง ไม่ใช่ระบบในทางคอมพิวเตอร์อย่างเดียวที่มี UI ถ้าเทียบกับขวดซอสมะเขือเทศ ขวดก็คือหนึ่งใน UI เช่นกันหรืออาหาร 1 จาน หน้าตาของอาหารก็ถือว่าเป็น UI ด้วย

    UI เป็นสิ่งที่สามารถมองเห็นได้หรือจับต้องได้


    UX :: User Experience

    User Experience คือ Experience หรือประสบการณ์ของผู้ใช้ที่เราได้ส่งมอบให้ มากกว่า Interface ที่ผู้ใช้งานได้ตอบสนอง เราจะไป focus ที่ผู้ใช้ใช้สินค้าเราแล้วมีความรู้สึกอย่างไร ผู้ใช้ใช้สินค้าเราแล้วได้บรรลุวัตถุประสงค์ของเราหรือไม่

    “UX คือสิ่งที่อยู่กับความรู้สึก จับต้องไม่ได้ มองไม่เห็น แต่วัดประเมินผลได้”

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

    จริงๆแล้ว นอกจาก website หรือ application ที่ต้องมี UX ที่ดีเป็น 1 ในองค์ประกอบแล้ว ทุกๆอย่างรอบตัวในชีวิตประจำวันก็ต้องมี UX ที่ดีเช่นกัน

    รูปภาพจาก Why people need to stop obsessing over UI design | by Zameel Kainikkara | Zartek | Medium

    Why should we have to care on UX?

    UX เรียกได้ว่าเป็นสารต้นต้นของสินค้าก็ว่าได้ การทำให้ผู้ใช้ได้รับประสบการณ์ที่ดีมักจะเป็น 1 ในวัตถุประสงค์หลักในการออกแบบสินค้าและบริการ เพราะถ้าทำออกมาแล้ว ผู้ใช้ไม่ enjoy ใช้แล้วลำบากกว่าเดิม แล้วใครจะมาใช้งาน? สินค้าบางอย่างที่ใช้ในชีวิตประจำวันเช่นซอสมะเขือเทศออกแบบขวดซอสแบบทั่วไป เวลาใช้ผู้ใช้จะต้องเคาะ/เขย่าขวด ซอสจึงจะออกมา การออกแบบขวดให้เป็นแบบคว่ำ บีบแล้วซอสออกเลย เป็นการแก้ปัญหาของผู้ใช้ เมื่อผลิตออกมาจึงขาย ตอบโจทย์ปัญหาของผู้ใช้ ผู้ใช้ก็ happy, win win ทั้งผู้ขายและผู้ซื้อ


    แล้วเราจะไปหาข้อมูลอะไรมาวิเคราะห์หละ แน่นอน

    UX = Research

    Research เท่านั้น ไม่ว่าจะเป็นการทำแบบสอบถาม การสัมภาส การสังเกตการใช้งาน การลงพื้นที่จริง หรือการอิงข้อมูลทางสถิติหรือข้อมูล log ยิ่งทำเยอะยิ่งทำให้เกิด UX ที่ดี

    การมี user experience ที่ดีมาจากการทำ Research หรือการค้นความหาข้อมูล ถามว่าการตามหาข้อมูลจะทำได้อย่างไรหละ

    User Research

    การ research ข้อมูลของผู้ใช้งาน/กลุ่มผู้ใช้งาน จะได้ออกแบบได้ตรงจุด

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

    ข้อมูลเหล่านี้เป็นตัวแปรตั้งต้นที่เราจะต้องมาออกแบบระบบอย่างไรให้ตอบโจทย์กลุ่มผู้ใช้ที่เราเก็บข้อมูลมา จะเห็นได้ว่า ยิ่งเราทำ research มาเท่าไหร โอกาสของการสร้างสินค้ามาให้ตอบโจทย์คนส่วนใหญ่ได้ จะทำให้สินค้าเราขายออกได้ง่ายกว่าเช่น การออกแบบระบบสารสนเทศที่กลุ่มผู้ใช้ระบบ 90%เป็นผู้มีอายุ การทำระบบให้เขาใช้งานก็ควรมีตัวอักษรที่ใหญ่กว่าทั่วไป มีการทำ Shortcut เมนูที่ง่าย ไม่สับซ้อน

    Brand Research

    คนที่ว่าจ้างหรือว่าง่ายๆคือเจ้าของระบบคือใคร Brand หรืออัตลักษณ์ของเขาเป็นอย่างไร วัตถุประสงค์ขององค์กร สีขององค์กร design token ขององค์กร ก็เป็นอีก 1 อย่างที่ต้องมีการศึกษาข้อมูลด้วยเช่นกัน

    Problem Research

    นอกจากการ research ผู้ใช้แล้ว เราก็ควรศึกษาปัญหาที่เกิดขึ้นด้วยเช่นกัน เพราะอะไรผู้ใช้ถึงเลิกใช้ ทำไมผู้ใช้ถึงไม่ใช้ feature นี้ ทำไมผู้ใช้สับสนในการใช้งาน ปัญหาเหล่านี้ก็จะเป็นอีกหนึ่งสารตั้งต้นที่จะทำไปออกแบบและพัฒนาสินค้าด้วยเช่นกัน ซึ่งเราสามารถสำรวจปัญหาเหล่านี้ได้จากการให้ผู้ใช้ทำแบบสอบถาม การลงพื้นที่จริงไปสังเกตการใช้งานระบบ


    What’s good UX?

    (ยกตัวอย่าง) ในการสร้างสินค้าขึ้นมาสักชิ้นที่จะทำให้ผู้ใช้รู้สึก win แล้วนั้น อีก 2 สิ่งที่ต้อง win ด้วยคือ Brand/Business win ด้วยไหม เสียผลประโยชน์รึเปล่าและ Team หรือคนสร้างสินค้า win ด้วยหรือไม่ ถ้าทั้ง 3 อย่างนี้ win ถือว่าเป็น UX ที่ดี

    ทั้งนี้การมี UX ที่ดีข้างต้นอาจเป็นเพียงสมมติฐานเบื้องต้น อาจจะมีปัจจัยอื่นๆเข้ามาเกี่ยวข้องอีก หรืออาจจะใช้ปัจจัยอื่นมาเป็นตัววัดก็ได้เช่น Happiness, Usability เป็นต้น


    Summary

    จะเห็นได้ว่า UX หรือ User experience ได้เข้าไปอยู่ในทุกๆส่วนในชีวิตประจำวันในหลายๆอย่าง นอกจากการออกแบบระบบสารสนเทศหรือ website เพียงอย่างเดียว ตั้งแต่การออกแบบสินค้าต่างๆที่เป็นมิตรต่อการใช้งาน การออกแบบบริการที่ตอบโจทย์คน การทำ marketing ที่สามารถส่งเสริมการขายได้ดี และอื่นๆอีกมากมาย

    โอกาาสหน้าไว้จะมาอธิบายการทำ UX Research ด้วยวิธีการต่างให้ดูเป็นแนวทางในการสร้างสินค้าและบริการให้ฟังกันครับ

  • สร้าง Modal dialog อย่างง่ายด้วย jquerymodal

    เนื่องจากตอนนี้มีพรบ.คอมพิวเตอร์เข้ามาเกี่ยวข้อง จึงต้องมี pop up Modal dialog ถามผู้ใช้ วันนี้จะมาแนะนำการใช้งาน jQuery ที่เรียกใช้ไม่กี่บรรทัดเราก็ได้ Modal dialog โดยจะยกตัวอย่าง Modal dialog แบบไม่ให้ปิดได้ โดยต้องอ่านข้อความก่อน ถึงจะปิดได้

    ขั้นตอนที่ 1 เพิ่ม jquery.min.js, jquery.modal.min.js, jquery.modal.min.css เพื่อเรียกใช้งาน

    <!-- Remember to include jQuery :) -->
        <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.min.js" type="text/javascript"></script>
        <!-- jQuery Modal -->
        <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-modal/0.9.2/jquery.modal.min.js" type="text/javascript"></script>
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jquery-modal/0.9.2/jquery.modal.min.css" />    

    ขั้นตอนที่ 2 เพิ่มการตั้งค่า Modal dialog ตามตัวอย่างไม่ให้แสดงปุ่ม “ปิด”

     <script type="text/javascript">
            $(document).ready(function () {
                $("#ex1").modal({
                    escapeClose: false,
                    clickClose: false,
                    showClose: false,
                    fadeDuration: 100
                });
            });
    
        </script>

    ขั้นตอนที่ 3 เพิ่ม User interface Modal dialog โดยใช้ tag div

    ขั้นตอนที่ 4 ได้ผลลัพธ์ Modal dialog ออกมาอย่างสวยงาม

    ที่มา : https://jquerymodal.com

  • Firebase และ Arduino ตอนที่ 2

    ในตอนที่ 2 เราจะมาดูภาคการเขียนโปรแกรมในส่วนของ board โดยใช้ซอฟต์แวร์ arduino-1.8.10 เขียน sketch แล้ว upload เข้า board เพื่อใช้งานร่วมกับ Firebase หากบังเอิญ search มาเจอบทความนี้ก่อน ย้อนกับไปอ่าน ตอนที่ 1 ได้ครับ

    เริ่มต้นเราต้องดาวน์โหลดซอฟต์แวร์ที่จะต้องใช้ ดังรูป

    ภาพที่ 1 แสดงรายการไฟล์ที่ใช้ใน project Firstapp-IoT ของผม

    รันโปรแกรมที่ดาวน์โหลดมา arduino-1.8.10-windows.exe (ส่วนอีก 2 ไฟล์ที่เป็น .zip แตกไฟล์ออกมา CH341SER_WINDOWS.zip ใช้เพื่อให้ USB port ของ Notebook จำลองเป็น Serial port COM3 ได้ และ firebase-arduino-master.zip จะใช้ในโปรแกรม Arduino ในขั้นตอน Add Libraries)

    ภาพที่ 2 แสดงโครงสร้างไดเรกทอรีของโปรแกรม Arduino จะได้ libraries มา และเราสร้างไดเรกทอรีเพิ่มเองเพื่อเก็บโปรแกรม

    ในไดเรกทอรี libraries จะเห็นว่าเราใช้งาน libraries ใดได้บ้างในการเขียนโปรแกรม

    ภาพที่ 3 แสดงรายการไดเรกทอรีภายในของ libraries

    และเมื่อเราจะเขียนโปรแกรม จะต้องวางไว้ในไดเรกทอรี ดูตัวอย่าง

    ภาพที่ 4 แสดงชื่อโปรแกรม nodemcu-8021x-v3.ino (แจกโค๊ด)

    เอาโค๊ดของ project ชื่อ Firstapp-IoT ได้ที่ link นี้ https://github.com/woonpsu/firstapp-iot

    เมื่อรันโปรแกรม Arduino ในครั้งแรก ให้ตั้งค่าเพิ่มที่ File > Preferences

    ภาพที่ 5 เพิ่ม Additional Boards Manager URLs

    ตัวอย่าง Arduino board ที่ใช้ ESP8266 ต้องใส่ URL: https://arduino.esp8266.com/stable/package_esp8266com_index.json

    ถัดไป ตั้งค่าเลือก Board ให้ตรงกับที่เราซื้อมา (ให้ข้อมูลเพิ่มครับ ที่ซื้อมาคือรุ่น บอร์ดทดลอง NodeMCU V2 NodeMCU V2 ESP8266 Development Kit ESP-12F/N)

    ภาพที่ 6 แสดงการเลือกใช้ Board: “NodeMCU 1.0 (ESP-12E Module)”

    เมื่อเราเขียน Sketch book เสร็จ ไม่ error แล้ว เราจะอัปโหลดใส่ board ในขั้นตอนนี้ เราใช้สาย USB data ต่อ board เข้ากับ USB port ในรูปจะเห็น COM3 หากใช้สาย USB Charger จะไม่เห็น Serial port นะ เมื่อพร้อมก็คลิกปุ่ม upload

    ภาพที่ 7 เมื่อเปิดโปรแกรม Arduino จะจำ Sketch book ล่าสุดที่เราใช้งาน คลิกรูปลูกศรชี้ขวา ด้านบน เพื่อ upload

    ต่อไปเราก็เปิดหน้าต่าง Serial Monitor เพื่อดูผลลัพธ์ หรือ debug

    ภาพที่ 8 เปิด Serial Monitor จากเมนู Tools

    จะเห็นว่า โปรแกรมมีการใช้คำสั่ง Serial.println(“WiFi connected”); เพื่อ debug

    ภาพที่ 9 แสดงข้อมูลในหน้าต่าง Serial monitor เมื่อ board เริ่มทำงาน

    ผลลัพธ์เมื่อเราใช้โปรแกรม JavaScript สั่งเปิด LED1 และ LED2 และตั้งสีให้กับหลอดสี เป็น สีเขียว

    ภาพที่ 10 แสดงผลลัพธ์การทำงานที่ถูกต้องตาม Project นี้

    อ้างอิง:

    • อ่านเยอะ ๆ และ search จาก google หลายเพจมาก ๆ
    • ได้รับข้อมูลเรื่องการเชื่อมต่อเน็ต Arduino ไปยัง Wi-Fi 802.1x จากเพื่อนชื่อโป้งทำงานที่ CLIB PSU โดยนักศึกษาฝึกงานเขียนโค๊ดไว้บน github ที่นี่ https://github.com/ton28919/firedoor/blob/main/nodeMCU_WifiEnterprise/nodeMCU_WifiEnterprise.ino
    • โปรแกรม JavaScript ที่เขียนก็ได้จาก Firebase Document ส่วนมาก
    • ต้องขอบคุณเพจนี้ด้วย เป็นเพจแรก ๆ ที่จุดประกายให้ http://www.daydev.com/firebase/web-authentication-with-firebase.html และ https://adamblog.co/firebase-authentication-with-firebaseui/
    • Firebase UI https://github.com/firebase/firebaseui-web
    • และขอบคุณทุกเพจบนโลกใบนี้ที่เขียนแนะนำโดยไม่หวังสิ่งใดตอบแทน