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

ในการนำเสนอข้อมูลจากหน้าจอโทรศัพท์มือถือไปยัง Projector บางครั้งอาจจะต้องมีอุปกรณ์พิเศษในการส่งข้อมูลภาพ แต่มีอีกวิธีง่าย ๆ ที่สามารถทำได้หากมี PC ที่ติดตั้ง Windows 10 นั่นคือ การส่งข้อมูลหน้าจอจากโทรศัพท์มือถือไปยัง PC จากนั้นจึงส่งภาพจากหน้าจอ PC ขึ้นไปยัง Projector อีกต่อหนึ่ง ซึ่งวิธีนี้ผู้นำเสนอก็จะสามารถนำเสนอได้ทั้งข้อมูลจากหน้าจอมือถือ และข้อมูลอื่น ๆ ที่อยู่บน PC ด้วย สำหรับในบทความนี้จะกล่าวถึงวิธีการดังกล่าว โดยจะเป็นการส่งภาพหน้าจอจากโทรศัพท์มือถือระบบ Android ซึ่งเป็นวิธีการที่ไม่ต้องติดตั้งโปรแกรมใด ๆ เพิ่มบนโทรศัพท์มือถือ หรือบน PC สิ่งที่ควรรู้ก่อนการตั้งค่า เนื่องจากวิธีการนี้เป็นการส่งผ่านข้อมูลถึงกันผ่านระบบเครือข่ายไร้สาย หรือ WiFi ดังนั้นทั้งอุปกรณ์ Android และ PC ควรเชื่อมต่อผ่าน WiFi บน Access Point ชื่อเดียวกัน เพื่อลดปัญหาที่จะเกิดจากการที่อุปกรณ์ทั้งสองหากันไม่เจอ ขั้นตอนการตั้งค่าบน Windows 10 บน 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

Read More »

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

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

Read More »

คลายข้อสงสัย “ทำไมสแกนบาร์โคดจากเครื่องอ่านแล้วไม่ enter หรือ tab ให้”

ในการพัฒนาระบบที่ต้องมีการอ่านข้อมูลจากเครื่องสแกนบาร์โคดแบบสองมิติ (แบบแท่งหรือแบบเส้น) รูปแบบในการทำงานมักจะเป็นการอ่านข้อมูลจากตัวบาร์โคด จากนั้นตามด้วยอักขระ Enter หรือ Tab เพื่อเป็นการระบุว่าให้ส่งข้อมูลที่อ่านได้จากบาร์โคดให้กับฟังก์ชันใดฟังก์ชันหนึ่งเพื่อนำไปใช้งานต่อ แต่ในบางครั้งอาจจะเคยเจอปัญหาว่าทำไมเมื่อสแกนบาร์โคดแล้วไม่มีการ Enter หรือ Tab โดยอัตโนมัติ ทำให้ต้องกดปุ่ม Enter หรือ Tab เองทุกครั้งจากคีย์บอร์ด หรือต้องปรับแต่ง code เพื่อเพิ่มอักขระ Enter หรือ Tab ต่อหลังข้อมูลที่อ่านได้จากเครื่องสแกนบาร์โคด หนึ่งในแนวทางสำหรับการแก้ปัญหานี้อยู่ที่ตัวคู่มือสำหรับเครื่องสแกนบาร์โคดแต่ละรุ่นนั่นเอง โดยในที่นี้จะยกตัวอย่างกรณีที่เคยพบดังนี้ ตัวอย่างการตั้งค่าเครื่องอ่านบาร์โคด Honeywell รุ่น Xenon Model 1900 หาคู่มือการตั้งค่าตามรุ่น ซึ่งรุ่นนี้ คือ Xenon Model 1900 (ถ้าไม่มีคู่มือที่ให้มาพร้อมกับอุปกรณ์ อาจจะสามารถค้นหาคู่มือได้จากทาง internet โดยค้นตามรุ่น หรือตามบริษัทผู้ผลิต) ในคู่มือที่เกี่ยวกับการตั้งค่าเพื่อแก้ปัญหานี้ จะมีรหัสบาร์โคดที่ให้เราทำการสแกนเพื่อตั้งค่าอุปกรณ์ดังนี้ กรณีต้องการให้ลงส่งอักขระ Enter หลังสแกนบาร์โคด สามารถทำได้โดยการสแกนบาร์โคดด้านล่าง กรณีต้องการให้ลงส่งอักขระ Tab หลังสแกนบาร์โคด สามารถทำได้โดยการสแกนบาร์โคดด้านล่าง สรุปควรแก้ปัญหาด้วยการเขียน Code หรือตั้งค่าอุปกรณ์ จากการเปรียบเทียบจะเห็นว่าหากใช้วิธีการเขียน code น่าจะเป็นแนวทางที่ดีกว่าในการแก้ปัญหานี้ เพราะเป็นวิธีการที่ไม่ขึ้นกับเครื่องสแกนบาร์โคด ไม่ต้องลำบากหาคู่มือ แต่วิธีการตั้งค่าอุปกรณ์นั้น อาจจะเหมาะสมในกรณีที่ต้องการอ่านข้อมูลบาร์โคดจำนวนมากลงไฟล์ เช่น อ่านลง text file หรืออ่านลง excel เพื่อนำไฟล์นี้เตรียมไว้เป็นข้อมูลสำหรับทดสอบนำเข้าระบบใดระบบหนึ่งอีกที เป็นต้น ถือว่าเป็นสิ่งที่รู้ไว้เป็นแนวทางนำไปประยุกต์ใช้ให้เหมาะกับสถานการณ์ได้

Read More »

ปัญหาการ Debug บางคำสั่งใน .NET Web Project (VS.NET 2013)

ในการพัฒนา web application ด้วย Visual Studio.NET 2013 ผู้พัฒนาบางท่าน อาจจะเคยเจอปัญหาเมื่อ debug ไปถึงบางคำสั่งแล้ว คำสั่งไม่ทำงานตามที่ควรจะเป็น หรือบางครั้งก็ไม่มีการ return ค่าออกมา ทั้ง ๆ ที่ค่าของข้อมูลถูกต้อง ซึ่งหากเจอปัญหานี้แล้ว ให้ลองสังเกตดังต่อไปนี้ เครื่องที่ใช้พัฒนาเป็น Windows 32 bit หรือ 64 bit ตรวจสอบแน่ใจแล้วว่าใช้งานคำสั่งได้ถูกต้อง และข้อมูลที่คำสั่งนี้นำไปประมวลผลมีความถูกต้องแล้ว ถ้าเครื่องที่ใช้เป็น Windows 64 bit ให้ทดลองทำตามดังนี้ คือ ไปที่เมนู TOOLS –> Options จะปรากฏหน้าต่าง Options เมนูด้านซ้ายมือของหน้าต่าง Options เลือกเมนูย่อย Projects and Solutions และภายใต้เมนูนี้ เลือกเมนูย่อย Web Projects จะเห็นตัวเลือกด้านขวามือสองตัวเลือก ให้เลือกเครื่องหมายถูกตัวเลือกแรก คือ Use the 64 version… คลิกปุ่ OK และทดลอง run project และ debug คำสั่งที่พบปัญหาอีกครั้ง   ตัวอย่างคำสั่งที่พบปัญหา สำหรับตัวอย่างคำสั่งที่เคยพบปัญหาเมื่อทำการ debug คือ คำสั่งที่ใช้ในการอ่านข้อมูลจาก registry Registry.LocalMachine.OpenSubKey โดยคำสั่งนี้จะอ่านข้อมูลจาก registry ตาม key ที่ระบุ  โดยรายละเอียดปัญหาที่พบคือ มีข้อมูลใน registry ตาม key ที่ระบุจริง แต่ตอน debug กลับ return ค่าว่างกลับมา  ซึ่งหากไปใช้ใน projects ที่เป็น Windows และทำการ debug คำสั่งนี้จะ return ข้อมูลออกมาได้ถูกต้อง

Read More »

การเรียกใช้งาน constructor จากอีก constructor ใน C#.NET

constructor คืออะไร constructor ก็คือ ฟังก์ชันที่ถูกเรียกใช้งาน เมื่อ object ถูกสร้างขึ้นมา ซึ่งใน C#.NET  ก็คือฟังก์ชันที่ตั้งชื่อเป็นชื่อเดียวกับชื่อ class นั่นเอง   constructor มีประโยชน์อย่างไร ในการสร้าง object ขึ้นมา บางครั้งต้องมีการระบุค่าเริ่มต้นบางอย่างให้กับ object นั้น ซึ่ง constructor ก็จะเป็นเครื่องมือหนึ่งที่เป็นตัวช่วยบังคับให้ต้องระบุค่าเริ่มต้นนี้ตอนสร้าง object นั่นเอง   ยกตัวอย่าง เช่น class Student { public Student(string studentID) { คำสั่งดึงข้อมูลนักศึกษาด้วย Student ID โดยใช้ข้อมูล Student ID จาก argument studentID } } จากตัวอย่างนี้ ต้องการสร้าง object Student โดยใช้ Student ID เพื่อไปดึงข้อมูลเบื้องต้นของนักศึกษามาแสดง ดังนั้น object ใหม่ที่สร้างจาก class Student ก็จะต้องระบุค่า Student ID ให้กับ argument studentID ก่อน ตัวอย่างการเรียกใช้งานคือ Student student = new Student(12345); student ก็คือ object ที่ถูกสร้าง 123456 คือ ข้อมูล Student ID ทีต้องระบุตอนที่ object นี้ถูกสร้างนั่นเอง   ทำไมต้องเรียกใช้ constructor จากอีก constructor หนึ่ง ในบางครั้งเมื่อเราใช้งาน class ไประยะเวลาหนึ่ง อาจะเจอกรณีที่ constructor เดิม ยังไม่รองรับความต้องการที่เปลี่ยนไปหรือเพิ่มขึ้น   แต่ความต้องการใหม่นั้นยังคงต้องใช้ชุดคำสั่งและขั้นตอนการทำงานเหมือนกับที่มีอยู่เดิมด้วย และมีการเพิ่มเติมชุดคำสั่งใหม่เข้าไปเล็กน้อยเพื่อให้รองรับกับความต้องการใหม่ด้วย ซึ่งทางเลือกที่เป็นไปได้คือ ปรับแก้ constructor เดิมที่มีอยู่ให้รองรับความต้องการใหม่ สร้าง constructor ใหม่ โดยทำการสำเนาชุดคำสั่งทั้งหมดใน constructor เดิมมา สร้าง constructor ใหม่ โดยเรียกใช้งาน constructor เดิม มาพิจารณาแต่ละทางเลือก ทางเลือกที่ 1 เป็นการปรับแก้ของเดิมที่มีอยู่แล้ว ซึ่งเป็นทางที่ควรเลี่ยงที่สุด เพราะอาจจะไปกระทบกับการทำงานเดิมที่ถูกต้องอยู่แล้ว และอาจจะกระทบเป็นลูกโซ่กับ object อื่นที่มาเรียกใช้ ทางเลือกที่ 2 สำเนาคำสั่งทั้งหมดจาก constructor เดิม มาใส่ใน constructor ใหม่ แล้วเขียนคำสั่งเพิ่มเพื่อให้รองรับความต้องการใหม่ ซึ่งทางเลือกนี้ถือว่าดีกว่าทางเลือกแรก เพราะไม่กระทบกับการทำงานเดิมแน่นอน แต่จะเห็นว่าเกิดความซ้ำซ้อนกันของชุดคำสั่งของ constructor เดิม และใหม่ และจะพบปัญหาในกรณีที่มีความจำเป็นต้องปรับปรุงคำสั่งที่ใช้อยู่ใน constructor ทั้งสอง ผู้พัฒนาก็จะต้องมาแก้ทั้งสองที่ให้เหมือนกันอีก ซึ่งจะเป็นการเสียเวลา ทางเลือกที่ 3 เรียกใช้งาน constructor เดิม ซึ่งจะเห็นว่าเป็นวิธีการที่สะดวกรวดเร็วที่สุด หากต้องการปรับปรุงคำสั่ง ก็เพียงไปจัดการที่ constructor เดิมเท่านั้น   วิธีการเรียกใช้งาน constructor เดิม จาก constructor ใหม่ syntax ที่ใช้ใน C#.NET คือ  หลังจากส่วนประกาศ constructor ให้ใช้  : this() เพิ่มเข้าไป ยกตัวอย่าง   class Student { public Student(string studentID) //constructor เดิม { คำสั่งดึงข้อมูลนักศึกษาด้วย Student ID โดยใช้ข้อมูล Student ID จาก argument studentID }   public Student(string studentID, string citizenID) : this(studentID)  //constructor ใหม่ { คำสั่งใหม่ที่เพิ่มเติม } }

Read More »