Month: November 2020

  • Remote ไปยังเครื่องคอมพิวเตอร์อื่นด้วย Chrome Browser

    การใช้งานเทคโนโลยีการทำงานระยะไกลหรือการ remote จากเครื่องคอมพิวเตอร์เครื่องหนึ่งไปยังอีกเครื่อง นับว่ามีความจำเป็นเพิ่มขึ้นมากในปัจจุบัน ซึ่งตัวระบบปฏิบัติการเองก็มีเครื่องมือรองรับ เช่น ใน Windows จะมี Remote Desktop นอกจากนี้ยังมีซอฟต์แวร์ที่รองรับการทำงานลักษณะนี้ เช่น TeamViewer หรือ AnyDesk ซึ่งบางซอฟต์แวร์หากใช้งานในลักษณะฟรี ก็อาจจะมีข้อจำกัดในการใช้งานบ้าง ดังนั้นในบทความนี้จะนำเสนอการใช้งาน remote ผ่าน chrome browser ซึ่งสามารถใช้งานได้ฟรี และค่อนข้างจะรองรับการทำงานทั่ว ๆ ไปได้ โดยไม่จำกัดเรื่องการเข้าใช้งาน (บางซอฟต์แวร์อาจจะมีการจำกัดจำนวนครั้งในการใช้งานในช่วงระยะเวลาหนึ่ง เป็นต้น)

    เตรียมการเบื้องต้นก่อนการใช้งาน

    1. ติดตั้ง chrome browser ทั้งฝั่งเครื่องต้นทางและฝั่งเครื่องปลายทาง
    2. เตรียมบัญชีผู้ใช้งานสำหรับ google หรือ google account เพื่อใช้สำหรับ remote

    ขั้นตอนการติดตั้งและตั้งค่า Extensions “Chrome Remote Desktop”

    1. การใช้งาน remote ผ่าน chrome browser นั้น อันดับแรกจะต้องทำการติดตั้ง Extensions เพิ่มก่อน ซึ่งก็คือ Chrome Remote Desktop ซึ่งช่องทางการดาวน์โหลดสามารถทำได้จากเมนูที่อยู่ในหน้าจอ chrome ได้เลยดังรูป โดยการกดที่เมนู Apps

    ถ้าไม่เจอเมนู Apps ให้ไปที่เมนู Bookmarks และเลือก Show bookmark bar ดังรูป

    จะปรากฏแถบว่าง ๆ ใต้ช่อง URL ซึ่งแถบนี้ก็คือ bookmark bar นั่นเอง

    คลิกขวาที่ bookmark bar จากนั้นเลือกเมนู Show apps shortcut

    เมื่อกดเลือกเมนู Apps แล้ว ในหน้าจอ chrome จะปรากฏรายการดังนี้

    เลือก Web Store เพื่อเข้าไปดาวน์โหลด Chrome Remote Desktop

    2. ในช่อง Search the store พิมพ์ chrome remote desktop เพื่อค้นหา

    กดเลือก Chrome Remote Desktop จะเข้าสู่หน้าจอการติดตั้ง extension นี้เพิ่มเติมให้กับ chrome browser

    เมื่อกดปุ่ม Add to Chrome จะมีกล่องข้อความถามเพื่อยืนยันการติดตั้ง ให้กดปุ่ม Add extension เพื่อยืนยัน

    เมื่อติดตั้งสำเร็จจะมีข้อความแจ้งดังรูป

    สังเกตว่าหลังช่อง URL จะปรากฏไอคอน

    ซึ่งมีไว้สำหรับแสดงและเรียกใช้งาน extensions ที่ติดตั้งไปนั่นเอง

    3. ทำการติดตั้ง Chrome Remote Desktop ทั้งฝั่งเครื่องต้นทางและปลายทางที่ต้องการ remote

    4. การเรียกใช้งานสามารถทำได้ดังรูป

    จากนั้นเลือก Chrome Remote Desktop

    5. ก่อนที่จะทำการ remote หรือตั้งค่าการ remote จะต้องทำการ login บน chrome browser ก่อนด้วยบัญขี google ที่ได้เตรียมไว้

    6. เริ่มต้นการตั้งค่าครั้งแรกโดยเลือก Remote Access ซึ่งครั้งแรกสุดจะต้องติดตั้งโปรแกรมเพิ่มเติมก่อน

    กดตรงไอคอนดังรูป เพื่อดาวน์โหลดโปรแกรมติดตั้งเพิ่มเติม

    ไฟล์ติดตั้งชื่อ chromeremotedesktophost.msi

    รันไฟล์นี้เพื่อทำการติดตั้งโปรแกรม หรือกดยอมรับและติดตั้งจากหน้าจอ chrome browser ดังรูป

    ในขั้นตอนการติดตั้งจะมีให้ตั้งชื่อเครื่อง

    จากนั้นจะเข้าสู่ขั้นตอนในการสร้างรหัส PIN โดย PIN นี้ใช้สำหรับให้เครื่องต้นทางที่ต้องการ remote เข้ามา ทำการกรอกเพื่อเชื่อมต่อ

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

    7. สามารถแก้ไขชื่อเครื่องและตั้งค่ารหัส PIN ใหม่โดยเลือกที่ไอคอน

    จะเข้าสู่หน้าจอการตั้งค่าดังรูป

    8. การปิดการเชื่อมต่อระยะไกล สามารถทำได้โดยการเลือกที่ไอคอน

    เมื่อปิดการเชื่อมต่อแล้วสามารถกลับมาเปิดใหม่ได้อีกครั้งดังรูป

    9. เริ่มต้นการ remote โดยเลือกรายการที่เป็น อุปกรณ์ระยะไกล

    จากนั้นจึงใส่รหัส PIN ที่ได้ตั้งค่าไว้สำหรับเครื่องนั้น ๆ (เครื่องปลายทาง) ก็จะสามารถ remote เข้าไปที่เครื่องปลายทางได้

    เมื่อ remote สำเร็จแล้ว สามารถควบคุมการทำงานจากเครื่องต้นทางได้เสมือนไปทำงานอยู่ที่เครื่องปลายทาง

    ส่วนด้านขวาของหน้าจอจะมีสัญลักษณ์คล้ายหัวลูกศร สำหรับใช้เพื่อเรียกเมนูสำหรับปรับแต่งและควบคุมการทำงานของหน้าจอ remote

    การตั้งค่าการควบคุมระยะไกล หรือ Remote Support

    การตั้งค่าการควบคุมระยะไกล หรือ Remote Access ที่ได้กล่าวถึงไปก่อนหน้านี้ เป็นการตั้งค่าสำหรับการรีโมต โดยอาศัยบัญชี google บัญชีเดียวกันเพื่อ remote ไปมาระหว่างเครื่องสองเครื่องหรือมากกว่า แต่หากต้องการ remote โดยใช้บัญชี google อื่นสามารถตั้งค่าได้ในส่วนของ Remote Support ซึ่งการใช้งานในลักษณะนี้เหมาะกับการที่จะให้ผู้ที่ทำงานอยู่อีกเครื่องทำการ remote เข้ามาช่วยเหลือหรือแก้ไขปัญหาที่หน้าจอของอีกฝ่าย เช่น ผู้ดูแลระบบ remote ไปช่วยดูปัญหาที่เครื่องของผู้ใช้ โดยทั้งผู้ดูแลระบบและผู้ใช้ที่ต้องการความช่วยเหลือ ต่างก็มีบัญชี google เป็นของตัวเอง

    1. ลักษณะการใช้งาน Remote Support จะเป็นการสร้างรหัส PIN สำหรับการเข้าถึงเป็นครั้ง ๆ ไป
    2. หน้าจอการใช้งาน จะแบ่งเป็นสองส่วน คือ ฝั่งรับการสนับสนุน และฝั่งให้การสนับสนุน

    3. ฝั่งเครื่องที่ที่ต้องการรับการสนับสนุน ต้องทำการสร้างรหัสสำหรับให้เครื่องที่จะเข้ามาสนับสนุนทำการกรอกดังรูป

    4. ฝั่งเครื่องที่จะเข้ามาสนับสนุน หรือ remote เข้ามาช่วยเหลือ จะต้องได้รับแจ้งรหัสตัวเลขที่ทางฝั่งเครื่องปลายทางแจ้งมา เพื่อนำมากรอกในส่วนของ ให้การสนับสนุน

    จากนั้นกดปุ่มเชื่อมต่อ

    5. เมื่อฝั่งเครื่องที่จะเข้ามาสนับสนุนกรอกรหัสและกดปุ่มเชื่อมต่อ ฝั่งเครื่องที่ขอรับการสนับสนุน จะปรากฏข้อความให้ยืนยันว่าจะยอมรับการเชื่อมต่อหรือไม่

    เมื่อตอบ Share แล้ว ฝั่งเครื่องที่จะ remote เข้ามาก็จะสามารถเชื่อมต่อเข้ามาที่เครื่องที่ขอรับการสนับสนุนได้

    และฝั่งผู้รับการสนับสนุนสามารถหยุดการเชื่อมต่อได้โดยเลือก Stop Sharing จากแถบเมนูด้านล่าง

    เบื้องหลังการทำงาน

    สำหรับการทำงานเบื้องหลัง จะมี Service ที่ชื่อ Chrome Remote Desktop Service ที่คอยตรวจสอบและจัดการเรื่องการเชื่อมต่อ

    ดังนั้น หากมีปัญหาเชื่อมต่อไม่ได้อาจจะตรวจสอบว่า service นี้ยังทำงานอยู่หรือไม่

    อ้างอิง สามารถดูข้อมูลการตั้งค่าและการใช้งานเพิ่มเติมได้ที่

    https://support.google.com/chrome/answer/1649523?co=GENIE.Platform%3DDesktop&hl=en

  • การตั้งค่า TeamViewer ให้ Remote ด้วย IP Address

    การตั้งค่า TeamViewer ให้ remote ด้วย IP Address จะช่วยให้เราจดจำ ID ได้ง่ายขึ้น และ ไม่จำเป็นต้อง remote ผ่าน Internet แต่ต้องเป็นเครื่องที่อยู่ใน network เดียวกัน มีวิธีการตั้งค่าดังนี้

    1. เปิดโปรแกรม TeamViewer แล้วกดที่เมนู Extras

    2 กดที่ Options

    3. ที่ Incoming LAN connections ให้เลือกเป็น accept หรือ accept exclusively

    • accept จะสามารถใช้ได้ทั้ง LAN และ Internet
    • accept exclusively ใช้ได้แค่ LAN เท่านั้น

    เสร็จแล้วให้กดปุ่ม OK

    ถ้าเลือกเป็น accept ตรง Your ID จะแสดงเป็นตัวเลขแบบปกติ ซึ่งจะ remote โดยใช้ตัวเลข Your ID ก็ได้ หรือจะ remote ด้วย IP Address ก็ได้ถ้าอยู่ใน network เดียวกัน

    ถ้าเลือกเป็น accept exclusively ตรง Your ID จะแสดงเป็นเลข IP Address ซึ่งจะ remote โดยใช้ IP Address ได้อย่างเดียวเท่านั้นและต้องอยู่ใน network เดียวกันด้วย

  • สร้าง Web API สำหรับส่ง iOS Push Notification ด้วย dotAPNS

    ความสามารถของแอปพลิเคชันในปัจจุบันที่จะขาดไม่ได้เลย อย่าง Push Notification นั้น สำหรับนักพัฒนาชาว .Net แน่นอนครับว่ามี Library มากมายให้เลือกใช้ ในบทความนี้ผมจะเล่าวิธีการหนึ่ง ที่ได้เลือกใช้เพื่อตอบโจทย์การเชื่อมต่อแอปพลิเคชันกับหลายๆฐานข้อมูล การที่เราจะไป Deploy ตัวส่ง (Sender) ไว้ทุกๆ Server นั้นในด้าน Compatibility, Configuration, Maintain นั้นมีปัญหาแน่นอน เพราะข้อกำหนดของ Apple นั้นมีหลายอย่างพอสมควร ก่อนที่ตัวส่งของเรา จะได้รับอนุญาตุให้ส่งข้อความไปหาผู้ใช้ได้ ดังนั้นการติดตั้ง Sender ในแบบ Web API ไว้เพียงที่เดียว แล้วให้ทุก Client ที่ต้องการส่งมาเรียกใช้งาน จึงเป็นการลดปัญหาข้างต้นได้

    สิ่งที่จะต้องมี

    1.KeyID, BundleID, TeamID ทั้งสามค่านี้สามารถดูได้จาก appstoreconnect ในรายละเอียดของแอปพลิเคชัน

    2.Push Notification Certification (.p8) ในบทความนี้จะใช้วิธีการส่งแบบ Token Based ซึ่งมีความยืดหยุ่นและบำรุงรักษาได้ง่ายกว่า แบบ Certification Based แต่อย่างไรก็ตามยังคงต้องมี Certificate สำหรับการยืนยันตัวตนประกอบการสร้าง Token อยู่ดี ซึ่งสามารถเข้าไปสร้างได้ที่ developer.apple.com > Account > Key เลือกสร้างแบบ
    Apple Push Notifications service (APNs)

    3. Web Server ที่สามารถเชื่อมต่อด้วย HTTPS, HTTP/2 ได้

    สร้างโปรเจค Web API

    ในบทความนี้ใช้ Visual Studio 2019 Version 16.8.0

    1.ไปที่ File > New > Project เลือกเทมเพลต ASP.NET Web Application (.Net Framework) กดปุ่ม Create

    2.เลือกรูปแบบโปรเจคเป็นแบบ Web API กดปุ่ม Create

    3.เมื่อสร้างโปรเจคสำเร็จจะได้ไฟล์ต่างๆดังรูป (Main.aspx, MainController.cs สร้างเองภายหลัง สามารถตั้งชื่ออื่นๆได้)

    4.ทำการเพิ่ม Library dotAPNS ด้วย Nuget Manager โดยการคลิกขวาที่โปรเจค เลือกเมนู Manage Nuget Packages ค้นหาด้วยคำว่า dotAPNS จากนั้นกดปุ่ม Install

    5. ในไฟล์ MainController.cs ทำการ using dotAPNS มาใช้งาน จากนั้นสร้าง Method ชื่อ SendPush (ไม่จำเป็นต้องชื่อนี้) โดยโค้ดการสร้าง Token และส่ง Push Notification ทั้งหมดมีดังนี้

    using System.Net.Http;
    using System.Web.Http;
    using System.Threading.Tasks;
    using System.Configuration;
    using dotAPNS;
    using System.Web;
    using System;
    
    namespace APNsService.Controllers
    {
        [RoutePrefix("api")]
        public class MainController : ApiController
        {
            [Route("SendPush")]
            [AcceptVerbs("GET", "POST")]
            public async Task<ApnsResponse> SendPush(string title, string body, string token, string category)
            {
                try
                {
                    //อ่านค่า CertContent หรือ CertFilePart, BundleID, KeyID,TeamID มาจาก ไฟล์ web.config
                    string certContent = ConfigurationManager.AppSettings["CertContent"];
                    string certFilePath = ConfigurationManager.AppSettings["CertFilePath"];
                    string bundleId = ConfigurationManager.AppSettings["BundleId"];
                    string keyId = ConfigurationManager.AppSettings["KeyId"];
                    string teamId = ConfigurationManager.AppSettings["TeamId"];
    
                    //สร้าง Option สำหรับ Token
                    var options = new ApnsJwtOptions()
                    {
                        CertContent = certContent,
                        BundleId = bundleId,
                        KeyId = keyId,
                        TeamId = teamId
                    };
    
                    //สร้าง Token
                    var apns = ApnsClient.CreateUsingJwt(new HttpClient(new WinHttpHandler()), options);
    
                    //สร้าง Push Object
                    var push = new ApplePush(ApplePushType.Alert)
                        .AddAlert(HttpUtility.UrlDecode(title), HttpUtility.UrlDecode(body))//ข้อความแจ้งเตือน
                        .AddBadge(0)//แสดงจำนวนแจ้งเตือนที่หน้าแอปพลิเคชัน
                        .AddCategory(category)//กำหนดกลุ่มของการแจ้งเตือน
                        .AddToken(token);//token
                    
                    //ส่ง Notification
                    return await apns.Send(push);
                }
                catch (Exception ex)
                {
                    return ApnsResponse.Error(ApnsResponseReason.Unknown, ex.Message + ex.StackTrace);
                }
            }
        }
    }

    จากโค้ดด้านบน สามารถทราบว่าส่วนไหนทำหน้าที่อะไรได้จาก Comment ครับ เพียงเท่านี้ก็สามารถ Publish และ Deploy Web API บน Server เพื่อทดสอบการใช้งานได้แล้ว อย่างไรก็แล้วแต่ Web API ดังกล่าวยังต้องการ การปรับแต่งให้เหมาะสมกับระบบของนักพัฒนาแต่ละท่าน แต่โดยขั้นตอนหลักๆก็มีเพียงเท่านี้ครับ

    6.หน้าฟอร์ม และตัวอย่างโค้ดเรียกใช้งาน (อยู่ในหน้า Main.aspx,Main.aspx.cs เพื่อใช้ทดสอบการส่ง)

    using System;
    using System.IO;
    using System.Configuration;
    using System.Net;
    using Newtonsoft.Json;
    
    namespace APNsService
    {
        public partial class Main : System.Web.UI.Page
        {
            string token = string.Empty;
            string baseUrl = string.Empty;
    
            protected void Page_Load(object sender, EventArgs e)
            {
                token = ConfigurationManager.AppSettings["apiToken"].ToString();
                baseUrl = string.Format("{0}://{1}{2}/", Request.Url.Scheme, Request.Url.Authority, Request.ApplicationPath.TrimEnd('/'));
            }
    
            protected void btnSend_Click(object sender, EventArgs e)
            {
                string url = string.Format("{0}api/SendPush?title={1}&body={2}&category={3}&token={4}", baseUrl, txtTitle.Text,txtBody.Text,txtCategory.Text,txtToken.Text);
    
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                request.Method = "GET";
                request.ContentType = "application/json";
                request.Headers.Add("token", token);
    
                try
                {
                    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                    using (Stream responseStream = response.GetResponseStream())
                    {
                        StreamReader reader = new StreamReader(responseStream, System.Text.Encoding.UTF8);
                        string resultJSON = reader.ReadToEnd();
                        var result = JsonConvert.DeserializeObject<APNsResult>(resultJSON);
                        txtResult.Text = resultJSON;
                        txtURL.Text = url;
                        btnSend.Focus();
                    }
                }
                catch (Exception ex) 
                {
                    txtResult.Text = ex.Message;
                }
            }
    
        }
    
        public class APNsResult
        {
            public bool IsSuccess { get; set; }
            public int Reason { get; set; }
            public string ReasonString { get; set; }
        }
    }

    สังเกตุว่าในส่วนของการส่งจาก Client อื่นๆผ่าน Web API นั้นต้องการเพียงแค่ HttpWebRequest, Newtonsoft.Json เท่านั้นทำให้มีขนาดเล็ก และลดปัญหาความเข้ากันได้ในการติดตั้ง Client ไปได้อย่างแน่นอนครับ

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

  • วิธีการส่ง Line Notify เมื่อมีการเปิดคอมพิวเตอร์

    เริ่มจากต้องทำการขอ Line Token ซึ่งดูได้จากบทความ การส่ง Line Notify ด้วย Command Line

    จากนั้นให้สร้าง bat file โดยเปิด notepad แล้วใส่คำสั่ง command line ดังนี้

    curl -X POST -H “Authorization: Bearer Token” -F “message=XXX” https://notify-api.line.me/api/notify

    โดยที่ตัวอักษรสีแดงให้ทำการแทนที่ดังนี้
    Token แทนที่ด้วย Line Token ที่ขอไว้ตอนต้น
    XXX แทนที่ด้วย ข้อความที่ต้องการส่ง

    แล้วให้ save file ด้วยนามสกุล .bat

    เปิด Task Scheduler ขึ้นมา แล้วกดที่ Create Task

    ใส่ชื่อ task ที่ช่อง Name

    กดที่tab Triggers แล้วกดปุ่ม New

    ที่ Begin the task เลือกเป็น At startup

    ติ๊กที่ Delay task for แล้วเลือกเป็น 1 minute แล้วกดปุ่ม OK

    จะได้ผลดังรูป

    กดที่tab Actions แล้วกดปุ่ม New

    กดปุ่ม browse เลือก file bat ที่สร้างไว้ตอนต้น แล้วกดปุ่ม OK

    กดที่tab Conditions

    ตรงส่วนของ Network ให้ติ๊กหน้า Start only if the following network connection is available

    กดปุ่ม OK

    กดที่ปุ่ม OK อีกครั้งตามรูป

    จะมี task ที่สร้างขึ้นปรากฏดังรูป

    เมื่อมีการ start computer จะมีข้อความส่งไปทาง Line ดังรูป

  • การส่งภาพหน้าจอโทรศัพท์มือถือระบบ Android ไปยัง PC (Windows 10) โดยไม่ต้องติดตั้งโปรแกรมเพิ่ม

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

    สำหรับในบทความนี้จะกล่าวถึงวิธีการดังกล่าว โดยจะเป็นการส่งภาพหน้าจอจากโทรศัพท์มือถือระบบ Android ซึ่งเป็นวิธีการที่ไม่ต้องติดตั้งโปรแกรมใด ๆ เพิ่มบนโทรศัพท์มือถือ หรือบน PC

    สิ่งที่ควรรู้ก่อนการตั้งค่า

    • เนื่องจากวิธีการนี้เป็นการส่งผ่านข้อมูลถึงกันผ่านระบบเครือข่ายไร้สาย หรือ WiFi ดังนั้นทั้งอุปกรณ์ Android และ PC ควรเชื่อมต่อผ่าน WiFi บน Access Point ชื่อเดียวกัน เพื่อลดปัญหาที่จะเกิดจากการที่อุปกรณ์ทั้งสองหากันไม่เจอ

    ขั้นตอนการตั้งค่าบน Windows 10

    1. บน PC ไปที่ Setting

    2. เลือก System จะปรากฏเมนูด้านซ้ายมือ จากนั้นเลือก Projecting to this PC

    3. การตั้งค่าลำดับแรก “Some Windows and Android devices can project this PC when you say it’s OK” จะมี 3 ตัวเลือก

    ให้ตั้งค่าเป็นตัวเลือก Available everywhere on secure networks หรือ Available everywhere ส่วนตัวเลือก Always Off เป็นการเลือกที่จะไม่ให้มีการเชื่อมต่อเข้ามา

    4. การตั้งค่า “Ask to project to this PC”

    เป็นการตั้งค่าให้มีข้อความแจ้งบน PC เมื่อมีการขอเชื่อมต่อเข้ามาจากโทรศัพท์มือถือ โดยบนฝั่ง PC จะเป็นการเลือกว่าจะยอมรับการเชื่อมต่อหรือไม่

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

    ส่วนตัวเลือกในการยอมรับการเชื่อมต่อจะมีสี่ตัวเลือกดังรูป

    ตัวเลือก First time only เป็นการตั้งค่าให้มีการแจ้งเตือนครั้งแรกที่ขอเชื่อมต่อเข้ามาเท่านั้น หากมีการขอเชื่อมต่อหลังจากนี้ครั้งต่อไปจะสามารถทำการเชื่อมต่อได้เลย (ตอนยอมรับการเชื่อมต่อต้องเลือก Always allow ด้วย หลังจากนี้หากมีการขอเชื่อมต่ออีกก็จะไม่มีข้อความแจ้งเตือนขึ้นมาอีก)

    ตัวเลือก Every time a connection is requested เป็นการตั้งค่าให้มีการแจ้งเตือนทุกครั้ง เมื่อมีการเชื่อมต่อ

    5. การตั้งค่า Require PIN for pairing

    เป็นการกำหนดว่าเมื่อมีการเชื่อมต่อกัน จะต้องมีการยืนยันรหัส PIN หรือไม่ โดยฝั่ง PC จะออกรหัส PIN ให้ และฝั่งโทรศัพท์มือถือต้องกรอกรหัส PIN นี้เพื่อยืนยัน

    ตัวเลือกการตั้งค่ามี 3 ตัวเลือก คือ

    ตัวเลือก Never เลือกตัวเลือกนี้หากไม่ต้องการใช้รหัส PIN ในการยืนยัน

    ตัวเลือก First Time ใช้สำหรับยืนยันรหัส PIN ครั้งแรกครั้งเดียว

    ตัวเลือก Always ต้องมีการยืนยันรหัส PIN ทุกครั้ง

    ตัวอย่างรหัส PIN

    6. การตั้งค่า “This PC can be discovered for projection only when it’s plugged into a power source”

    ถ้าเลือกเป็น On สามารถเชื่อมต่อได้เฉพาะกรณีที่ PC ต่อเข้ากับสาย power adapter ที่ต่อเข้ากับแหล่งจ่ายไฟเท่านั้น

    ส่งภาพจากหน้าจอโทรศัพท์มือถือไปยัง PC

    1. บนโทรศัพท์มือถือ ให้ไปที่ Setting และหาเมนู Wireless Display (อยู่ในหมวด WIRELESS & NETWORKS)

    จากตัวอย่าง เลือก More จะเจอเมนู Wireless Display

    2. แตะที่เมนู Wireless Display แล้วเปิดการใช้งาน Wireless Display จะปรากฏรายการ PC ที่เปิดให้สามารถเชื่อมต่อได้

    3. แตะเลือก PC ที่ต้องการเชื่อมต่อ หากบน PC มีการตั้งค่าให้ยืนยันรหัส PIN จะมีหน้าต่างให้ป้อนรหัส PIN บนโทรศัพท์มือถือ

    4. เมื่อป้อนรหัส PIN แล้วกด Accept ก็จะสามารถเชื่อมต่อกับ PC เพื่อส่งหน้าจอจากโทรศัพท์มือถือไปยัง PC ได้ดังรูป

  • การติดตั้งเว็บไซต์ ที่พัฒนาด้วย ASP.NET บน IIS

    สำหรับนักพัฒนาเว็บแอปพลิเคชัน ที่จะต้องทำหน้าที่ครบวงจร (Full Stack Programer) สิ่งที่ต้องทำหลังจากพัฒนาเว็บขึ้นมาเสร็จแล้ว คือการติดตั้งบนเซิร์ฟเวอร์ (Deploy) ในบทความนี้จะเล่าขั้นตอนหลักๆ ในการติดตั้งเว็บไซต์ ที่พัฒนาด้วย ASP.NET (ไม่ว่าจะพัฒนาด้วย .Net Framework เวอร์ชันไหนก็ขั้นตอนเดียวกัน เปลี่ยนแปลงแค่ .Net Runtime ที่ใช้งาน) บนวินโดวส์เซิร์ฟเวอร์ โดยใช้ IIS (Internet Information Services) ซึ่งหน้าตาอาจเปลี่ยนแปลงไปตามเวอร์ชันของ IIS แต่ขั้นตอนการตั้งค่ายังคงคล้ายคลึงกัน

    Publish เว็บไซต์ (กรณีใช้ Visual Studio)

    1.คลิกขวาที่ชื่อโปรเจ็ค เลือก Publish

    2.จะได้หน้าจอเลือกประเภทในบทความนี้เลือกเป็น Folder เพื่อใช้วิธีการ Deploy แบบนำไฟล์ไปวางที่ Server เอง ดังรูป

    3. เลือกที่ตั้งไฟล์ กด Finish

    4. ตั้งค่าการ Publish จากในรูปคือให้ลบไฟล์ที่มีอยู่ก่อน และใช้รูปแบบ Release ในการ Compile

    5. ตัวอย่างไฟล์ที่ทำการ Publish เสร็จแล้ว

    6. ทำการ Copy ไฟล์ทั้งหมดไปวางใน wwwroot บน Server

    ติดตั้ง Component ต่างๆ

    1.ในบทความนี้ใช้ Windows Server 2016 Datacenter เป็นตัวอย่าง ซึ่งการติดตั้ง Component ต่างๆ สามารถทำได้ผ่าน Server Manager > Manage > Add Roles and Features ได้เกือบทั้งหมด ยกเว้น Runtime อื่นๆที่เว็บไซต์มีการนำมาใช้งานเพิ่มเติม

    2. ติดตั้ง IIS , ASP.NET และ Component ที่เกี่ยวข้อง โดยไปที่ Server Role > Web Server (IIS) และทำการเลือก Component ต่างๆดังรูป จากนั้นกด Next

    3. ติดตั้ง .Net Framework เวอร์ชันที่เว็บไซต์ใช้งาน ในตัวอย่างใช้ .Net Framework 4.6 โดยสามารถเลือกจาก เมนู Features ดังรูป

    4. เท่านี้ก็จะมี Component ที่จำเป็นในการติดตั้งเว็บไซต์ที่พัฒนาด้วย ASP.NET แล้ว

    สร้าง และตั้งค่า Application Pool

    1.เปิดโปรแกรม IIS โดยไปที่ Start > Windows Administrative Tools > Internet information Services (IIS) จะได้หน้าจอดังรูป

    2. เลือกเมนู Application Pool จากนั้นคลิก Add Application Pool จะได้หน้าจอการตั้งค่าดังรูป โดยที่ .Net CLR Version จะแยกเป็น 2.0.xxx และ 4.0.xxx โดยหากต้องการใช้งาน .Net Runtime 3.5 – 4.x สามารถเลือกเป็น 4.0.x ได้ทั้งหมด

    3. เมื่อสร้างสำเร็จ จะมีรายการ Application Pool ที่เราสร้างดังรูป

    สร้าง และตั้งค่าเว็บไซต์ ทดสอบเรียกใช้งาน

    1.ในการสร้างไซต์นั้น หากบน Server นั้นยังไม่มีเว็บไซต์ใดๆ สามารถใช้ Default Web Site ได้เลย แต่ถ้ามีเว็บไซต์อื่นๆอยู่ก่อนแล้ว จะต้องพิจารณาว่าจะให้บริการในแบบใด เป็น Application ที่อยู่ภายใต้เว็บไซต์เดิม หรือแยกออกมาเป็นอีก URL ในส่วนนี้ บทความจะไม่ลงรายละเอียด โดยจะแสดงวิธีการเพิ่ม ไซต์ใหม่ภายใต้ URL เดิมที่มีอยู่แล้วโดยเลือกเมนู Add Website จะได้หน้าจอการตั้งค่าดังรูป

    2. จากนั้นทำการตั้งค่า Default Document โดยคลิกเลือกที่ชื่อเว็บไซต์ เลือกไฟล์ที่ต้องการกำหนดเป็นหน้าแรกของเว็บไซต์

    3. ตั้งค่าต่างๆของเว็บไซต์ ซึ่งขึ้นอยู่กับแต่ละเว็บไซต์ว่ามีการใช้งาน Feature ใดบ้าง ดังรูป (อีกช่องทางนึงคือการแก้ไขไฟล์ web.config โดยตรง)

    4. ทำการทดสอบเรียกใช้งาน โดยคลิกที่เมนู Browse เพื่อเรียกดูแบบ Localhost หรือหากมี URL อยู่แล้วสามารถเรียกดูผ่าน URL/ApplicationName ดังรูป

    ในขั้นตอนติดตั้งชิ้นงานจริง แน่นอนว่าอาจมีขั้นตอนเพิ่มเติมตามแต่ละเว็บไซต์ และอาจพบปัญหาต่างๆ แตกต่างกันไปตามเวอร์ชันของวินโดวส์, IIS, .Net Runtime แต่อย่างไรก็ดีหวังว่าบทความนี้จะเป็นไกด์ไลน์ ให้เห็นภาพขั้นตอนคร่าวๆในการติดตั้งเว็บไซต์หนึ่งๆ สำหรับผู้เริ่มต้นครับ

  • การส่ง Line Notify ด้วย Command Line

    ถ้าจะส่ง Line Notify ต้องมี Line Token ก่อน ซึ่งมีวิธีการขอดังนี้
    1. เข้าไปยังwebsite https://notify-bot.line.me/my/
    2. Login ด้วย LINE Account
    3. คลิกที่ปุ่ม Generate token

    4. ตั้งชื่อ Line ที่จะแสดงตอนแจ้งเตือน ในช่องตามรูป

    5. เลือกว่าจะ Notify ไปที่ group ใด ซึ่ง group ที่เราเลือกจะเป็นสีเขียว แล้วให้กดปุ่ม Generate Token

    6. จะได้ Line Token มาดังรูป

    หลังจากได้ Line Token แล้ว ให้เราเปิดโปรแกรม Command Promt ขึ้นมา โดยถ้าเป็น windows10 ให้กดที่รูปแว่นขยายที่ taskbar แล้วพิมพ์ Command Promt แล้วกดที่ปุ่ม open ทางด้านขวา

    จะมีโปรแกรมปรากฎดังรูป

    ให้ใส่ข้อความดังนี้

    curl -X POST -H “Authorization: Bearer Token” -F “message=XXX” https://notify-api.line.me/api/notify

    โดยที่ตัวอักษรสีแดงให้ทำการแทนที่ดังนี้
    Token แทนที่ด้วย Line Token ที่ขอไว้ตอนต้น
    XXX แทนที่ด้วย ข้อความที่ต้องการส่ง

    เมื่อใส่ข้อความเสร็จแล้วให้กด Enter

    ถ้าส่งข้อความสำเร็จโปรแกรม Command Promt จะขึ้นดังรูป

    แล้วที่ Line ก็จะได้รับข้อความดังรูป

  • วิธีติดตั้ง HTTPS ด้วย Certificate ของ Let’s Encrypt แบบ wildcard สำหรับ Intranet ที่ไม่สามารถเข้าถึงได้จาก Internet

    ความเดิมตอนที่แล้ว

    ต่อจาก วิธีติดตั้ง HTTPS ด้วย Certificate ของ Let’s Encrypt ซึ่ง เครื่องที่จะขอใช้ Certificate นั้น ต้องสามารถ “เข้าถึงได้” จาก Internet เพราะ จะต้องสร้าง File ไปวางในตำแหน่งที่ Let’s Encrypt CA สามารถเข้ามาตรวจสอบได้ว่าเป็น ผู้ที่มีสิทธิ์ในการจัดการ Domain Name นั้นจริง

    ปัญหาคือ

    • ในองค์กร ถ้าจะให้มีเซิร์ฟเวอร์ ที่สามารถเข้าถึงได้ จาก Internet ต้องเปิด Firewall ขององค์กร ซึ่ง ซับซ้อน และ มีความเสี่ยง
    • แล้ว ถ้ามีเครื่องภายใต้โดเมนเดียวกันอีกหลายเครื่อง ต้องทำทุกเครื่อง ซึ่งไม่สะดวกเลย

    ต้องเข้าใจก่อน

    Let’s encrypt มีวิธีการตรวจสอบความเป็นเจ้าของ Domain Name หรือที่เรียกว่า “Challenge” หลายวิธี ได้แก่

    1. HTTP-01 Challenge
    2. DNS-01 Challenge
    3. TLS-SNI-01 Challenge
    4. TLS-ALPN-01 Challenge

    วิธีที่ง่าย และทำกันทั่วไป คือ HTTP-01 คือ เมื่อ certbot client รับคำสั่งขอ certificate สำหรับโดเมนที่ต้องการแล้ว จะต้องเอาไฟล์ ไปวางที่

    http://<YOUR_DOMAIN>/.well-known/acme-challenge/<TOKEN>

    ซึ่ง ชื่อต้องตรงกับที่กำหนด และในไฟล์ จะเป็น Token และ Thumbprint ของ account key

    (ในทางเทคนิค อาจจะให้มีสักเครื่องในองค์กรที่เปิดให้เข้าถึงจาก Internet ได้ ทำหน้าที่ร้องขอ Certificate ได้ แล้วทำ HTTP-01 Challenge ให้ผ่าน ก็จะสามารถขอ Certificate ให้กับ Subdomain อื่น ๆ ได้)

    แต่มีอีกวิธีหนึ่ง คือ DNS-01 Challenge ซึ่ง ไม่จำเป็นต้องมีเครื่องที่เข้าถึงได้จาก Internet (แต่สามารถ ออก Internet ได้) แต่อาศัยการสร้าง TXT Record ตามที่กำหนดแทน ประมาณนี้

    _acme-challenge.<YOUR_DOMAIN> 300 IN TXT "<TOKEN>"

    วิธีการมีดังนี้

    0. เราจะขอ wildcard certificate โดเมนของ abc.ijk.xyz.psu.ac.th โดยการติดตั้ง Let’s Encrypts certbot client บน Ubuntu 20.04 ซึ่งเครื่องนี้ สามารถต่อ Internet ได้ แต่ไม่สามารถเข้าถึงได้จาก Internet

    1.ติดตั้ง Let’s Encrypts certbot client (ยุ่งยากหน่อย แต่จะได้ certbot version 1.19)

    sudo apt update
    sudo snap install core; sudo snap refresh core
    sudo apt-get remove certbot
    sudo snap install --classic certbot
    sudo ln -s /snap/bin/certbot /usr/bin/certbot

    หรือสั้นๆ ทำอย่างนี้ก็ได้ (ไม่ต้องใช้ snap แต่จะได้ certbot version 0.40)

    sudo apt update
    sudo apt install certbot

    2. สั่ง certbot ให้ไปขอเฉพาะ certificate จากนั้นบอกว่าจะติดตั้งเอง (manual) และ ขอใช้ DNS-01 Challenge

    sudo certbot certonly --manual --preferred-challenges dns

    3. กรอกข้อมูล โดเมนเนม ที่ต้องการ ในที่นี้ จะขอใช้ wildcard คือ *.abc.ijk.xyz.psu.ac.th

    Saving debug log to /var/log/letsencrypt/letsencrypt.log
    Plugins selected: Authenticator manual, Installer None
    Please enter in your domain name(s) (comma and/or space separated) (Enter 'c' to cancel): *.abc.ijk.xyz.psu.ac.th
    Obtaining a new certificate
    Performing the following challenges:
    dns-01 challenge for *.abc.ijk.xyz.psu.ac.th

    NOTE: The IP of this machine will be publicly logged as having requested this
    certificate. If you're running certbot in manual mode on a machine that is not
    your server, please ensure you're okay with that.
    Are you OK with your IP being logged?

    (Y)es/(N)o: y

    Please deploy a DNS TXT record under the name
    _acme-challenge.abc.ijk.xyz.medicine.psu.ac.th with the following value:
    xjid...4u1znkFXut0Y...n3ck89gGaUl75K4fI
    Before continuing, verify the record is deployed.

    Press Enter to Continue

    **** ตรงนี้ อย่าเพิ่งเคาะ Enter เด็ดขาด จนกว่า DNS admin จะดำเนินการเสร็จ *****

    4. แจ้งผู้ดูแล DNS ขององค์กร ว่า ให้เพิ่ม TXT Record ส่งข้อความตามนี้ไปให้เค้าก็น่าจะได้

    Please deploy a DNS TXT record under the name
    _acme-challenge.abc.ijk.xyz.medicine.psu.ac.th with the following value:
    xjid...4u1znkFXut0Y...n3ck89gGaUl75K4fI

    หรือจะให้ดี แจ้งไปตรง ๆ ว่า จะเอาแบบนี้

    _acme-challenge.abc.ijk.xyz.medicine.psu.ac.th 300 IN TXT 
    "xjid...4u1znkFXut0Y...n3ck89gGaUl75K4fI"

    5. รอ รอ รอ จนกว่า DNS Admin บอกว่า เสร็จแล้ว (แนะนำว่า ควรทำในเวลาที่สามารถประสานงานกับ DNS Admin ได้ เพราะ ในขั้นตอนข้อ 3. นั้น จะเคาะผ่านไม่ได้ หากแจ้ง DNS admin ไปแล้ว แต่เค้ายังไม่ทันทำให้ แล้วเราดันไปเคาะ Enter ผ่านไปก่อน TOKEN ที่แจ้งไป ก็จะใช้ไม่ได้)

    ตรวจสอบด้วย Google Admin Toolbox ก็ได้ ว่าได้ TXT ตรงตามที่กำหนดมาแล้ว ที่

    https://toolbox.googleapps.com/apps/dig/#TXT/

    สิ่งที่ควรได้ น่าจะมีหน้าตาประมาณนี้

    เมื่อมั่นใจว่า TXT Record ตรงกันแล้ว ค่อยกลับไปที่หน้าต่างในข้อ 3. แล้วกด Enter

    Let’s Encrypt certbot client จะแจ้งไปยัง CA server ให้ตรวจสอบ ถ้าผ่านก็จะได้ข้อคาวมประมาณนี้

    Waiting for verification…
    Cleaning up challenges
    Subscribe to the EFF mailing list (email: kanakorn.h@g.psu.ac.th).
    IMPORTANT NOTES:
    Congratulations! Your certificate and chain have been saved at:
    /etc/letsencrypt/live/abc.ijk.xyz.psu.ac.th/fullchain.pem
    Your key file has been saved at:
    /etc/letsencrypt/live/abc.ijk.xyz.psu.ac.th/privkey.pem
    Your cert will expire on 2021-02-17. To obtain a new or tweaked
    version of this certificate in the future, simply run certbot
    again. To non-interactively renew all of your certificates, run
    "certbot renew"
    If you like Certbot, please consider supporting our work by:
    Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
    Donating to EFF: https://eff.org/donate-le

    ตรวจสอบ Certification ด้วยคำสั่ง

    sudo certbot certificates

    จะได้รายละเอียดว่า Certificate ที่ได้มา เป็นของ domain อะไรบ้าง

    Found the following certs:
    Certificate Name: abc.ijk.xyz.psu.ac.th
    Serial Number: 3808642657a...........bbeacd6df8bacc
    Domains: *.abc.ijk.xyz.psu.ac.th
    Expiry Date: 2021-02-17 02:59:43+00:00 (VALID: 89 days)
    Certificate Path: /etc/letsencrypt/live/abc.ijk.xyz.psu.ac.th/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/abc.ijk.xyz.psu.ac.th/privkey.pem

    สุดท้าย เอา fullchain.pem และ privkey.pem ไปไว้ในเครื่อง web server ที่จะต้องการใช้ https เป็น subdomain ของ abc.ijk.xyz.psu.ac.th

    จากนั้น ตั้งค่าใน Web Server เช่น Apache2 ให้ใช้ Certificate ประมาณนี้

    <VirtualHost *:443>
    # ...
       SSLEngine on
       SSLCertificateFile /etc/ssl/letsencrypt/fullchain.pem
       SSLCertificateKeyFile /etc/ssl/letsencrypt/privkey.pem
    </VirtualHost>

    แล้วก็ restart เป็นอันเรียบร้อย

    ตรวจสอบการใช้งานจริง โดยการใช้ https://server1.abc.ijk.xyz.psu.ac.th/ จะได้แบบนี้

    หวังว่าจะเป็นประโยชน์ครับ

  • คำสั่ง Update โดยใช้ข้อมูลจากอีกตาราง [Oracle]

    ในการสั่ง update ข้อมูล ในบางครั้งเราอาจจะเจอโจทย์ว่า ต้องการ update ข้อมูลในตารางหนึ่งโดยใช้ข้อมูลจากอีกตารางหนึ่ง ซึ่งลักษณะของข้อมูลทั้งสองตารางนี้ จะต้องมีฟีลด์ข้อมูลที่สามารถเชื่อมโยงความสัมพันธ์ของข้อมูลแต่ละเร็คคอร์ดได้

    ตัวอย่างข้อมูล

    1. มีข้อมูลสองตาราง

    ตารางที่ 1 เก็บข้อมูลวันในหนึ่งสัปดาห์ภาษาไทย [ชื่อตาราง : DAY_OF_WEEK_THAI]

    โครงสร้างตารางประกอบด้วย

    • ฟีลด์ ID เก็บ ID ของแต่ละเร็คคอร์ด
    • ฟีลด์ DAY_FULL เก็บข้อมูลวันแบบเต็มภาษาไทย
    • ฟีดล์ DAY_SHORT เก็บข้อมูลวันแบบย่อภาษาไทย

    ข้อมูลในตารางเป็นดังนี้

    ตารางที่ 2 เก็บข้อมูลวันในหนึ่งสัปดาห์ภาษาอังกฤษ [ชื่อตาราง : DAY_OF_WEEK]

    โครงสร้างตารางประกอบด้วย

    • ฟีลด์ ID เก็บ ID ของแต่ละเร็คคอร์ด
    • ฟีลด์ DAY_ENG เก็บข้อมูลวันแบบเต็มภาษาอังกฤษ
    • ฟีดล์ DAY_ENG_SHORT เก็บข้อมูลวันแบบย่อภาษาอังกฤษ

    ข้อมูลในตารางเป็นดังนี้

    2. ฟีลด์ที่เชื่อมโยงความสัมพันธ์ของทั้งสองตารางคือฟีลด์ ID

    3. ต่อมามีการปรับแก้โครงสร้างตาราง DAY_OF_WEEK โดยเพิ่มฟีลด์ 2 ฟีลด์ ดังนี้

    ฟีลด์ DAY_THA สำหรับเก็บข้อมูลวันแบบเต็มภาษาไทย

    ฟีลด์ DAY_THA_SHORT สำหรับเก็บข้อมูลวันแบบย่อภาษาไทย

    4. เนื่องจากมีข้อมูลวันภาษาไทยในตาราง DAY_OF_WEEK_THAI อยู่แล้ว และสามารถเชื่อมโยงข้อมูลกันได้ด้วยฟีลด์ ID ดังนั้นความต้องการคือ การใช้ข้อมูลจากตาราง DAY_OF_WEEK_THAI มา update ให้กับตาราง DAY_OF_WEEK

    5. รายละเอียดการ update

    นำข้อมูลวันแบบเต็มภาษาไทยในฟีลด์ DAY_FULL ของตาราง DAY_OF_WEEK_THAI มาใส่ในฟีลด์ DAY_THA ของตาราง DAY_OF_WEEK

    นำข้อมูลวันแบบย่อภาษาไทยในฟีลด์ DAY_SHORT ของตาราง DAY_OF_WEEK_THAI มาใส่ในฟีลด์ DAY_THA_SHORT ของตาราง DAY_OF_WEEK

    รูปแบบคำสั่ง SQL

    แบบที่ 1

    update table1 t1 set

    table1.data1= (select table2.data1 from table2 where table2.key = t1.key),

    table1.data2 = (select table2.data2 from table2 where table2.key = t1.key);

    แบบที่ 2

    update table1 t1 set

    (table1.data1, table1.data2) =

    (select table2.data1, table2.data2 from table2 where table2.key = t1.key);

    อธิบายคำสั่ง

    table1 คือ ตารางที่ต้องการ update

    t1 คือ ชื่ออ้างอิงแทนตาราง table1 ซึ่ง t1 จะถูกใช้ในคำสั่ง select

    table1.data1 และ table1.data2 คือ ฟีลด์ข้อมูลที่ต้องการ update

    table2 คือ ตารางที่จะนำข้อมูลมาใช้เพื่อ update ให้กับ table1

    table2.data1 และ table2.data2 คือ ฟีลด์ข้อมูลที่จะนำมาใช้เพื่อ update ให้กับ table1.data1 และ table1.data2 ตามลำดับ

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

    แบบที่ 1

    update day_of_week t1 set
    day_tha = (select day_full from day_of_week_thai where day_of_week_thai.id = t1.id),
    day_tha_short = (select day_short from day_of_week_thai where day_of_week_thai.id = t1.id);

    แบบที่ 2

    update day_of_week t1 set
    (day_tha, day_tha_short) =
    (select day_full, day_short from day_of_week_thai where day_of_week_thai.id = t1.id);

    ผลลัพธ์การรันคำสั่งทั้งสองรูปแบบ จะได้ผลลัพธ์เช่นเดียวกัน ดังรูป

    ข้อมูลก่อน update

    ข้อมูลหลัง update

    สรุป

    1. สามารถใช้คำสั่ง update ได้ทั้งสองรูปแบบซึ่งจะได้ผลลัพธ์เหมือนกัน
    2. แบบที่ 2 จะเป็นการใช้คำสั่งที่สั้นและกระชับกว่าแบบที่ 1 มาก กรณีที่ข้อมูลที่ต้องการ update มีมากกว่า 1 ฟีลด์
    3. ข้อควรระวังคือ ความสัมพันธ์ระหว่างสองตารางต้องเป็น 1 ต่อ 1 จึงจะสามารถใช้คำสั่งรูปแบบนี้ได้