บทความ
ไม่ว่าจะ ข่าวสาร บทสัมภาษณ์ และ Digital Skill บนสื่อ
มีให้คุณได้อ่านบทความดี ๆ มากมายแล้วที่นี่
โดย: สุวิชา บัวคอม
| Security
Broken Authentication การรับรองตัวตนที่ไม่มั่นคงปลอดภัย
Broken Authentication คือการรับรองความความถูกต้องของการเข้าถึงระบบอย่างไม่ปลอดภัย การโจมตีช่องโหว่ Broken Authentication มีอยู่หลายรูปแบบ ในบางครั้งอาจจะง่ายมาก หรือบางครั้งอาจจะซับซ้อนมากเลยก็ว่าได้ โดยมีพื้นฐานของการเกิด Broken Authentication อยู่ที่การอนุญาติให้ผู้ใช้ใดๆก็ตามสามารถเข้าถึงไฟล์หรือฟังก์ชันในระบบที่ไม่ควรจะเข้าถึงได้โดยการใช้ประโยชน์จากการมีมาตรการการจัดการการเข้าถึงระบบได้อย่างไม่มั่นคงปลอดภัยหรือมั่นคงปลอดภัยไม่เพียงพอไปลองดูกันในแล็บดีกว่า โดยแล็บที่ผมจะใช้ก็คือ WebGoat เวอร์ชัน 7.1 โดยติดตั้งผ่าน Docker วิธีการติดตั้งแล็บ WebGoat โดยใช้ Dockerสำหรับผู้ที่ยังไม่มี Docker ในเครื่องสามารถดาวน์โหลดและติดตั้ง Docker ได้ที่ URL ด้านล่างนี้:https://www.docker.com/get-started เมื่อติดตั้ง Docker เสร็จแล้วให้ดาวน์โหลด Docker Image ของ WebGoat ผ่านคำสั่ง docker pull ดังนี้:docker pull webgoat/webgoat-7.1เมื่อได้ Docker Image มาแล้วให้สั่ง docker run เพิ่มเริ่มใช้งาน Docker Image โดยจะใช้ port ในการเข้าใช้งานเป็น port 8080docker run -p 8080:8080 -t webgoat/webgoat-7.1เมื่อ run ขึ้นมาสำเร็จแล้วเราจะสามารถเข้าแล็บของเราได้ผ่าน http://127.0.0.1:8080/WebGoatหรือhttp://localhost:8080/WebGoat เข้ามาแล้วจะเจอหน้า Login ให้เราเข้าผ่าน Username: guest และ Password: guestโดยจะมีเมนูเกี่ยวกับข้อผิดพลาดของ Authentication ให้เราเล่นอยู่ทั้งหมด 4 เมนูทางด้านซ้ายมือPassword Strengthเป็นโจทย์เกี่ยวกับความปลอดภัยของรหัสผ่าน โดยให้เราหาว่ารหัสที่ให้มาจะถูกแกะรหัส (crack) ได้ในเวลาเท่าไหร่โดยให้เรานำ password ไปเช็คในเว็บที่เค้าให้มาแล้วนำไปตอบในหน้าโจทย์https://howsecureismypassword.net/ เนื่องจากเป็นแล็บเวอร์ชันเก่า คำตอบที่เราเช็คในเว็บอาจจะไม่ตรง กับคำตอบที่ถูกต้อง ณ เวลานั้น ในปัจจุบันเทคโนโลยีได้พัฒนาให้ผู้โจมตีสามารถ crack รหัสผ่านได้เร็วขึ้น คำตอบตามที่ผมเช็ค ณ​ เวลาปัจจุบัน 29/4/2562 คือ0 seconds, 0.2 seconds, 2 seconds, 2 hours, 2 days, 36 quintillion years ตามลำกับคำตอบที่ถูกต้องคือ 0 seconds, 2 seconds, 19 seconds, 15 hours, 20 days, 364 quintillion yearsตามลำดับเมื่อเราตอบถูกทั้งหมดและผ่านแล้ว จะได้เครื่องหมายถูกสีเขียวด้านหลัง Password Strength ข้อที่เราผ่าน ตามภาพนี้สำหรับข้ออื่นๆ สามารถลองเล่นได้เองโดยมีคำใบ้จะได้เมื่อกดปุ่ม Show Hints แล้วมีเฉลยดูได้ ด้วยการกดปุ่ม Show Solution
โดย: สุวิชา บัวคอม
| Security
Injection แทรกคำสั่งเพื่อแฮกการทำงานของระบบ
Injection คือเทคนิคการแทรกคำสั่งเข้าไปใน code ภาษาต่างๆ ส่วนมากจะพบได้จากการรับ input มาจาก user โดยที่ server ไม่ได้มีมาตรการป้องกันหรือยอมรับให้นำคำสั่งที่ได้รับมา นำไปประมวลผลอย่างไม่ปลอดภัย โดยการ Injection นั้นมีหลายประเภท แต่ที่ร้ายแรงและพบบ่อยจะเป็น SQL Injection คือการแทรกคำสั่งเข้าไปใน code ภาษา SQL ที่ server เรียกใช้ก่อนจะทำการ SQL Injection ผมแนะนำให้ศึกษาพื้นฐานที่จำเป็นของภาษา SQL โดยคำสั่งที่จำเป็นจะต้องรู้หลักๆ ก็คือคำสั่ง SELECT ที่ใช้ในการเลือกข้อมูลจากฐานข้อมูลมาแสดง โดยคำสั่ง SELECT นั้นมีเงื่อนไขและการจัดเรียงหลายรูปแบบในการเลือกข้อมูล เช่น WHERE, ORDER BY, UNION เป็นต้น สามารถศึกษาได้จากเว็บนี้https://www.w3schools.com/sql/ เพื่อให้เห็นภาพจริงเรามาติดตั้งแล็บแล้วลองทำกันดูเลย โดยที่ต้องติดตั้งมี 2 อย่างหลักๆคือVirtualBox เป็นโปรแกรมจำลองเครื่อง และ Web for Penetration Tester Lab เป็นไฟล์ .iso ไว้ติดตั้งแล็บบน VirtualBoxVirtualBox https://www.virtualbox.org/wiki/Downloads Web for Penetration Tester Lab https://isos.pentesterlab.com/web_for_pentester_i386.iso วิธีติดตั้ง Web for Pentester Labเมื่อติดตั้ง VirtualBox เสร็จแล้วสร้างแล็บด้วยการกดเมนูด้านบน Machine->New…ตั้งชื่อและตั้งค่าให้เรียบร้อยใช้ RAM 1GB, พื้นที่ดิส 8GBเมื่อสร้างเครื่องมาแล้ว คลิกที่เครื่องจากนั้นตั้งค่าเครื่องโดยการกดเมนูด้านบน Machine->Settings...เลือกแถบ Network ตั้งค่าเป็น Host-only Adapter หรืออาจจะตั้งเป็นค่าอื่นก็ได้หากเข้าใจการทำงานของ Network โดยให้เครื่องของเราสามารถติดต่อกับเครื่องจำลองที่เราสร้างได้เลือกแถบ Storage คลิกที่รูป และเลือกไฟล์ Web for Pentest ที่เราโหลดมา จากนั้นกด OKเมื่อตั้งค่าทุกอย่างเสร็จแล้วให้ดับเบิลคลิกที่เครื่องเพื่อเปิดเครื่องของเราขึ้นมาจะได้หน้าตาแบบนี้พิมพ์คำสั่ง clear เพื่อเคลียหน้าจอเทอร์มินัล$ clearและพิมพ์คำสั่ง ifconfig เพื่อดู ip ของเครื่อง$ ifconfigจะเห็น IP ที่เราสามารถเข้าเว็บไซต์ผ่านเครื่องหลักของเราที่อยู่นอก VirtualBox ได้โดยการนำ IP ไปเข้าที่เว็บบราวเซอร์ ในที่นี้จะเป็น IP 192.168.56.104เมื่อเข้ามาที่หน้าเว็บได้แล้วให้เข้ามาที่ SQL Injection Example 1หรือเข้าผ่าน URL ด้านล่างนี้http://192.168.56.104/sqli/example1.php?name=root(เปลี่ยน IP ด้านหน้าให้เป็นเครื่อง Web for Pentester ใน VirtualBox โดยของแต่ละคนจะไม่เหมือนกัน)เมื่อเข้ามาจะเห็นว่าหน้าเว็บได้ทำการดึงข้อมูล id, name, และ age (ในฐานข้อมูลอาจจะเป็นชื่ออื่นก็ได้ แต่ในแอพพลิเคชัน) มาจาก ฐานข้อมูล ถ้าหากเราเข้าใจการใช้คำสั่ง SELECT ในภาษา SQL ที่มีเงื่อนไขตรงกับที่เว็บนี้ใช้ก็จะสามารถเดาคำสั่งได้ว่าเป็นคำสั่งดังนี้ (เราจะไม่รู้ชื่อฐานข้อมูล)SELECT id, name, age FROM [database name] WHERE name=rootคำสั่ง SQL ที่ใช้อาจจะเลือกข้อมูลอย่างอื่นมาด้วยหรือเลือกมาทั้งหมด (SELECT *) แต่นำมาแสดงให้เห็นแค่สามอย่าง เงื่อนไข WHERE จะนำข้อมูลที่ตรงกับเงื่อนไขมาแสดงในเว็บนี้จะนำข้อมูลของคนที่มี name เป็น root ออกมาแสดงโดยระบบจะไปเช็คทีละชุดข้อมูล (record) ว่าตรงตามเงื่อนไขหรือเปล่าถ้ามีจะถูกเลือกออกมาแสดง หากผู้โจมตีระบบต้องการจะนำข้อมูลของทุกคนในระบบมาแสดง ผู้โจมตีจะทำการ Injection โดยการทำให้เงื่อนไขที่ถูกนำไปเช็คเป็นจริงทั้งหมดโดยเว็บไซต์นี้มีการรับข้อมูลจากผู้ใช้ผ่านพารามิเตอร์ name ใน URL แล้วนำไปประมวลผลคำสั่ง SQLผู้โจมตีจะใส่ค่าที่ทำให้เงื่อนไขเป็นจริงโดยคาดเดาการเขียนโปรแกรมของโปรแกรมเมอร์ โดยส่วนมากการเขียนแบบที่ไม่มีการป้องกัน (นำค่าที่รับมาไปประมวลผลในคำสั่ง SQL เลย) เป็นแบบนี้$sql = "SELECT id, name, age FROM [database name] WHERE name='".[user input]."'";$result = mysql_query($sql);เมื่อใส่ค่า root เข้าไปโปรแกรมจะเห็นแบบนี้$sql = "SELECT id, name, age FROM [database name] WHERE name='root'"การโจมตีของผู้โจมตี จะใส่ค่า 'or'1'='1 หรือ 'or'2'='2 หรือ 'or'a'='a หรืออะไรก็ได้ ที่ได้ค่าเป็นจริงเข้าไปโดยด้านหน้าคำสั่งที่ใส่เข้าไปจะเป็นค่าอะไรก็ได้ที่ไม่ใช่ ' หรือ " หรือเครื่องหมายอื่นๆ ที่มีผลต่อการประมวลผลภาษา SQL ในที่นี้ใช้ test 'or'1'='1$sql = "SELECT id, name, age FROM [database name] WHERE name='test’or’1’=1'"ค่า name ใส่ไปจะถูกมองเป็น 'test' or '1' = '1' เป็นการโจมตีด้วยเงื่อนไขทางตรรกศาสตร์ โดยการนำค่าอะไรก็ได้ ไป or กับค่าที่เป็นจริงจะได้ค่าที่เป็นจริงเสมอ เมื่อระบบนำค่านี้ไปเช็คกับแต่ละชุดข้อมูลจะได้ผลลัพธ์เป็นจริงเสมอ จึงนำค่าทั้งหมดมาแสดงปล. %27 คือค่า ' ที่ถูกทำการ URL encode
โดย: Laris
| IoT
MQTT Security (3)
Payload EncryptionMQTT Payload Encryptionนอกจาก authentication แล้ว ใน Applicaiton level ยังสามารถทำการ encryption ได้ค่ะ โดยทำการ encrypte ตัว payload ค่ะ ซึ่งส่วนใหญ่ก็จะใช้กับ message ประเภท PUBLISH และ LWT ค่ะMQTT Payload Encryptionจะเห็นว่าในส่วนอื่นๆ (นอกจาก payload แล้ว ) จะไม่มีการ encrypt ค่ะ เช่น topic หรือ QoS ทั้งนี้ก็เพื่อเป็นการลดภาระที่ไม่จำเป็นให้กับ broker ค่ะ เพราะไม่ต้อง decrypt ข้อมูล meta พวกนี้Encryption Scenariosรูปแบบของ encryption ก็จะมีอยู่ด้วยกัน 2 แบบ นะคะEnd-to-end (E2E) encryption ( publisher — subscriber )Encrypted message จาก publisher จะไม่ถูก decrypt โดย broker ค่ะ เพราะ broker ใช้ข้อมูลจาก meta เท่านั้น สำหรับ routing /QoS และจะมีแต่ subscriber ที่มี decryption key เท่านั้น ที่สามารถ decrypt message ได้ค่ะ ถึงแม้ว่า attacker จะสามารถเข้าถึง message นี้ได้ อาจจะเพราะ ข้อผิดพลาด เรื่อง authentication/authorization หรือ TLS แต่ก็จะไม่สามารถ decrypt message ได้ค่ะEnd-to-end (E2E) encryption2. Client-to- Broker encryption ( publisher — broker )message จะถูก encrypt ระหว่าง publisher กับ broker เท่านั้นค่ะ broker จะทำการ decrypt (ซึ่งต้องอาศัย plugin สำหรับ decryption เพิ่มนะคะ) และ เฉพาะ trusted subscriber ที่เชื่อมต่อ กับ broker ด้วย TLS เท่านั้นที่จะได้รับ message ที่ decrypt แล้วจาก broker ค่ะถือเป็นอีกตัวเลือกนึง หากว่าไม่สามารถนำ TLS มาใช้ได้กับการเชื่อมต่อ ของ publisher และ broker ค่ะClient-to- Broker encryptionEncryption mechanismsที่นิยมใช้กันก็มีอยู่ 2 แบบค่ะ Asymmetric encryption (public/private key encryption)แบบนี้จะเหมาะกับระบบ ที่มี trusted subscriber ไม่เยอะมากค่ะ แต่มี untrusted publisher เยอะ และควรใช้ public/private key หนึ่งคู่ ต่อ topic ค่ะSymmetric encryptionแบบนี้ key ที่ใช้จะมีอันเดียวค่ะ และส่วนใหญ่ก็จะใช้ในรูปแบบของ password ซึ่งเป็นวิธีที่ง่ายกว่า Asymetric encryption เพราะไม่ต้องยุ่งยากกับการจัดสรร private key ให้ subscriber และแต่ละ topic ควรใช้ key (password) ของใครของมันนะคะ เผื่อหากว่ามีการขโมย password ไป topic อื่นๆจะได้ไม่ถูก decrypt ได้ค่ะการใช้ Payload encryption สามารถมั่นใจได้ว่า message ถูก encrypt ตั้งแต่ผู้ส่ง ถึง ผู้รับค่ะ แม้จะผ่าน broker ระหว่างทาง ก็ไม่มีการ decrypt ใดๆเกิดขึ้น ช่วยเพิ่มความปลอดภัยอีกระดับนึงถ้าหาก topic นั้นๆมีการส่งข้อมูลที่ค่อนข้างเป็น confidental information ค่ะ แต่จะมีความยุ่งยากในการจัดการเรื่อง key ให้กับ subscriber ค่ะ และ วิธีการ encrtypion ก็ไม่สามารถป้องกัน man-in-the-middle attack หรือว่า replay attack ได้ค่ะPayload encryption จะช่วยแก้ปัญหาการถูกดัก message ได้ค่ะ (หากไม่มีการใช้ authentication ใดๆ) แต่จะเห็นว่ามีเฉพาะ payload เท่านั้นที่จะถูก encrypt นั่นหมายความว่า ข้อมูล meta สามารถถูกเห็น และ แก้ไขได้ (เช่น topic) ซึ่งเราสามารถใช้ TLS เข้ามาช่วยเพิ่มความปลอดภัยให้ข้อมูลของเราตรงนี้ได้ค่ะ ถึงแม้ว่า TLS และ Payload encryption ถูกนำมาใช้คนละ level แต่เราสามารถใช้ควบคู่ เพื่อเสริมพลังกันได้ค่ะPayload encryption เป็นตัวเลือกที่ดีค่ะ ถ้าเราไม่ต้องการส่งข้อมูลแบบ plain text (unencrypted data)และระบบของเรามีข้อจำกัด ไม่สามารถที่จะใช้ TLS ได้ (ไม่ว่าจะด้วยข้อจำกัดของ bandwidth ของระบบ network หรือว่าข้อจำกัดของอุปกรณ์เอง) แต่ถึงยังไง encryption/decryption ก็ยังต้องใช้ processing power อยู่ดีนะคะ ต้องลองพิจารณาค่ะ ว่าจะใช้ algorithm แบบไหนเพิ่มความปลอดภัยให้กับระบบของเรา แต่ก็ไม่ได้ทำให้ประสิทธิภาพ และความเร็ว ของระบบ IoT เราลดลงค่ะอ้างอิงจาก MQTT Security Fundamentals: MQTT Payload Encryption
โดย: Laris
| IoT
MQTT Security (2)
Authentication & AuthorizationAuthenticationAuthentication ถือว่าเป็นส่วนหนึ่งของ MQTT Security ทั้งใน Transport level และ Application level ค่ะ ใน TLS (Transport Layer Security) ใช้ client certificate ในการยืนตัวตนของ client ต่อ server ส่วนใน Application level นั้น MQTT protocol จะมี built-in authentication ซึ่ง ใช้ username/password ในการยืนยันตัวตนซึ่ง username/password จะอยู่ใน CONNECT message เป็น optional ค่ะ ไม่ใส่ก็ได้ (สามารถใส่แต่ username โดยไม่มี password ยังได้ค่ะ แต่ไม่สามารถใส่ password โดยไม่มี username นะคะ)CONNECT Messageusername/password ใน CONNECT message จะถูกตรวจสอบโดย broker และ ส่ง return code กลับไปให้กับ client ตามนี้ค่ะ0 — Connection Accepted4 — Connection Refused, bad user name or password5 — Connection Refused, not authorizedCONNACK Messageถ้าหากว่าเราจะใช้ MQTT built-in authentication เราอาจจะต้องใช้ TLS เข้ามาเพิ่มนะคะ เพราะว่า username/password ไม่ถูก encrypt ให้ อาจจะถูก eavesdropping ได้ง่ายๆค่ะนอกจาก username/password แล้ว client สามารถใช้ข้อมูลอื่นสำหรับ authentication ได้ด้วยนะคะ อย่างเช่น Client IdMQTT client แต่ละตัวจะมี client Id ที่ไม่ซ้ำกันอยู่แล้วนะคะ ส่วนใหญ่ก็จะใช้ UUID ค่ะ เป็นตัวกำหนด id ให้กับ client ซึ่งจะถูกกำหนดไว้ใน CONNECT message นี่แหละค่ะ อาจจะใช้ id ร่วมกับ username/password ในการ authentication ได้ หรือจะใช้เพียง id ตัวเดียวก็ได้ค่ะX.509 Certificateclient สามารถใช้ X.509 client certificate เพื่อ authenticate กับ broker ระหว่าง TLS handshake ได้ค่ะ ซึ่ง broker ก็จะใช้ข้อมูลใน client certificate นี้ใน application level authentication ค่ะAuthorization in MQTTหลังจากที่ MQTT client ทำการเชื่อมต่อกับ broker เรียบร้อยแล้ว จะมีอยู่ 2 สิ่ง ที่ client สามารถทำได้ค่ะ คือ publish message และ subscribe กับ topic ที่สนใจ ถึงตรงนี้ authorization จะเข้ามามีส่วนในการดูแล ว่า client ไหน สามารถ publish message ไปที่ topic ไหนได้บ้าง หรือ subscribe กับ topic ไหนได้บ้าง ซึ่งสามารถทำได้ โดย กำหนด topic permission ที่ broker ค่ะ และ จะ มีค่า config ดังนี้ค่ะAllowed topic (exact topic or wild card topic)Allowed operation (publish, subscribe, both)Allowed quality of service level (0, 1, 2, all)แล้ว client จะรู้ได้อย่างไร ว่าไม่มีสิทธิ์ที่จะ publish /subscribe กับ topic ไหน สำหรับ publisher หากว่าไม่มีสิทธิ์ ในการ publish นะคะ broker จะทำการ disconnect การเชื่อมต่อไปเลยค่ะ (ตามที่ MQTT 3.1.1 version กำหนดไว้นะคะ) และ ถ้าหาก subscriber ไม่มีสิทธิ์ที่จะ subscribe ใน topic ไหน broker จะแจ้งด้วย return code ค่ะใน Application level นี้นอกจากจะมีการ authentication แล้ว เรายังสามารถเพิ่มระดับความปลอดภัยเข้าไปได้อีกด้วย การ encryption ค่ะ ตามมาอ่านกันได้ ในบทความถัดไปค่ะอ้างอิงจาก MQTT Security Fundamentals: AuthorizationMQTT Security Fundamentals: Authentication with Username and Password
โดย: Laris
| IoT
MQTT Security (1)
Is MQTT Secure?IoT ที่มีการเชื่อมต่ออุปกรณ์ที่หลากหลายเข้าด้วยกัน เพื่ออำนวยความสะดวกสบายให้เรา ไม่ว่าจะใน รถยนต์ หรือ บ้านทั้งหลัง เพียงแค่มีอุปกรณ์ที่สามารถตรวจจับความเคลื่อนไหว และ ระบุตำแหน่ง เราสามารถรู้ได้ทันทีว่าสมาชิกในบ้านอยู่ที่ตำแหน่งไหนของบ้าน แต่ถ้าหากไม่ได้มีเพียงแค่เรา ที่สามารถเข้าถึงข้อมูลเหล่านี้ หากข้อมูลนี้สามารถเข้าถึงได้ง่ายๆ โดยผู้ประสงค์ร้าย ข้อมูลเหล่านี้ก็อาจจะย้อนกลับมาทำความเสียหายให้เราได้ค่ะ อาจจะเล็กน้อยเพียงแค่ทรัพย์สินในบ้าน หรืออาจจะร้ายแรงถึงชีวิตของคนในบ้านดังนั้นเราจำเป็นต้องให้ความสำคัญกับเรื่องความปลอดภัยของข้อมูลเหล่านี้ค่ะ บางคนอาจจะคิดว่าแค่โดน Hack พวกอุปกรณ์ไม่ได้ร้ายแรงอะไรมั้ง ก็แค่สั่ง ON/OFF ไม่ได้เข้าถึงข้อมูลส่วนตัว หรือ ข้อมูลทางการเงิน แต่ถ้าอุปกรณ์เชื่อมต่อเหล่านี้มีผลกับความปลอดภัยของเรา ยังไง๊ ยังไง มันก็ต้องมีผลกระทบค่ะ ไม่ทางใดก็ทางหนึ่งค่ะ…. กันไว้ดีกว่าแก้นะคะ Better safe than sorry ค่ะในบทความนี้ ก็ไม่พลาดที่จะต้องพูดถึง Security ใน MQTT ค่ะ สำหรับนักพัฒนาแบบเราๆแล้ว เรื่องนี้สำคัญมาก จำเป็นต้องทำความเข้าใจและนำมาพิจารณา ตั้งแต่เริ่มดีไซน์ระบบ IoT กันเลยทีเดียวค่ะ มองข้ามไม่ได้นะคะ….. ซึ่งสามารถทำได้ตั้งแต่ protocol level ไปถึง application levelเดิมที MQTT ถูกออกแบบเพื่อให้ใช้งานง่าย และ lightweight เพื่อให้มีความเหมาะสมกับ IoT ดังนั้นตัว protocol จึงไม่ได้มีระบบ security ที่ดีนัก ก็จะใช้วิธีพึ่งพา security standards อื่นๆ เช่น ใช้ SSL/TLS ในการเพิ่มความปลอดภัยให้กับการเชื่อมต่อ ของ MQTT ค่ะ Security ใน MQTT จึงถูกแบ่งออกเป็นหลาย Layer ค่ะ ทั้งนี้ก็เพื่อเพิ่มความปลอดภัยจากผู้ประสงค์ร้ายที่มีมาหลากหลายรูปแบบ ได้มากขึ้น ซึ่งก็จะแบ่งตามนี้ค่ะ Network levelวิธีที่จะเพิ่มความปลอดภัยให้การเชื่อมต่อระหว่าง client และ broker ก็คือใช้ network ที่มีความปลอดภัยสูง หรือ VPN ค่ะ ซึ่งมีความเหมาะสมกับระบบที่ใช้ gateway โดยที่ gateway ฝั่งหนึ่งเชื่อมต่อกับเหล่าอุปกรณ์ และ อีกฝั่งนึงเชื่อมกับ broker ผ่าน VPN ค่ะTransport levelMQTT ใช้ Transport layer ใน TCP/IP ในการรับส่งข้อมูล ซึ่งปกติแล้วการเชื่อมต่อของ TCP จะไม่ใช่แบบที่มีการ encryption ใดๆค่ะ ดังนั้นถ้าอยากเพิ่มความปลอดภัย ให้กับการเชื่อมต่อ (encrypted communication) การใช้ TLS หรือ Transport Layer Security เป็นวิธีที่ค่อนข้างมั่นใจได้ว่าข้อมูล จะไม่ถูกอ่าน หรือ ถูกแก้ไข ระหว่างทางค่ะTLS เป็น cryptographic protocol ที่ใช้วิธี handshake ก่อนทำการเชื่อมต่อระหว่าง client และ broker ค่ะ ซึ่งการเชื่อมต่อแบบนี้สามารถรับประกันได้ว่าจะไม่มีการ eavesdropping เกิดขึ้น ใช้ x.509 certicate สำหรับยืนยันตัวตน ระหว่าง client กับ broker ข้อดีของการใช้ทั้ง server certicate และ client certificate ก็คือ สามารถทำ authentication ได้ในขั้นตอน handshake เลย ถ้า authenticate ไม่ผ่าน ก็ไม่จำเป็นต้องมีการเชื่อมต่อเกิดขึ้น (ไม่ต้องส่ง MQTT CONNECT message มาให้ broker ) เพื่อเป็นการลดภาระให้กับ broker อีกทางนึงค่ะ เพราะ broker ไม่ต้องทำการ authenticate ไม่ต้องไปเปิดหาใน database ว่ามี client นี้อยู่มั้ยแต่ทว่าการใช้ TLS ใน MQTT ต้องใช้ CPU ของอุปกรณ์ และ bandwidth ของ network ซึ่งก็ถือว่าเป็นข้อเสียนึงของ TLS เลยก็ว่าได้ ถ้าเกิดว่า อุปกรณ์ หรือ network ของเรามีข้อจำกัดในการใช้งาน ซึ่งอาจจะหันไปใช้วิธี authentication แทนได้ค่ะ (สามารถอ่านเนื้อหาเพิ่มเติมเกี่ยวกับ authentication ในบทความถัดไปค่ะ)Application LevelMQTT มี built-in authentication ที่ใช้ username/password สำหรับ authenticate อุปกรณ์ต่างๆ ส่วนเรื่องของ authorization จะถูกกำหนดขึ้นโดยเฉพาะ โดย broker ค่ะ นอกจากนี้ยังมี payload encryption เข้ามาช่วย หากว่าเราไม่สามารถใช้ TLS ใน Trasport level ได้ (สามารถอ่านเนื้อหาเพิ่มเติมเกี่ยวกับ payload encryption ในบทความถัดไปค่ะ)นอกจากการ secure ให้กับตัว protocol แล้ว ควรให้ความสำคัญ​กับ MQTT system ด้วยค่ะ ซึ่งก็รวมไปถึง infrastructure, OS, และ MQTT broker ค่ะในส่วนของ infrastructure ระบบ network ถือว่ามีความสำคัญกับเรื่อง security อย่างมาก การกำหนด rules บน. firewall มีส่วนช่วยอย่างมาก ในการเพิ่มความปลอดภัย เราสามารถกำหนดให้ firewall จำกัดการใช้แค่ port ที่จำเป็นสำหรับ MQTT เช่น 1883 (MQTT over TCP) และ 8883 (Secure MQTT) หรือ block ข้อมูลที่เป็น UDP datagram packet ออกให้หมด ( MQTT ใช้ TCP ) หรือหากเป็นไปได้ ถ้าเรารู้ IP ของ client ทุกตัว เราก็สามารถ กำหนด IP range ที่สามารถผ่าน firewall ได้ เพื่อเพิ่มความปลอดภัยให้กับ networkอ้างอิง: Introducing the MQTT Security Fundamentals
โดย: Laris
| IoT
สิ่งเล็กๆที่เรียกว่า Beacon (7)
Simple Scanner Monitor by IFTTT x Line Notifyจากหลายๆบทความก่อนหน้านี้ในซีรีย์ของ “สิ่งเล็กๆที่เรียกว่า Beacon” เราได้ทำการติดตั้ง Scanner และ Server สำหรับระบบ Tracking ของเราเรียบร้อยแล้วนะคะ ผ่านขั้นตอนติดตั้งแล้ว เริ่มใช้งานและเก็บข้อมูลแล้ว ก็มาถึงขั้นตอนดูแลระบบให้เก็บข้อมูลอย่างต่อเนื่องไม่ขาดหาย หรือ ให้สูญหายน้อยที่สุดค่ะ… ยุคนี้ข้อมูลมีค่าค่ะ สิ่งที่ต้องใส่ใจให้ความสำคัญเลยก็ตัว scanner นี่แหละค่ะ ถ้า offline ไป ข้อมูลหายทันทีค่ะ ถ้าหากเราต้องการเก็บข้อมูลไว้เชิงสถิติแล้วเนี่ย ข้อมูลพลาดหายไปเพียงวันเดียว อาจจะมีผลคลาดเคลื่อนต่อการวิเคราะห์ได้ค่ะด้วยเหตุนี้…..เราจะใช้ Line Notify ช่วยส่งข้อความแจ้งเตือนผ่านทาง Line เมื่อมี Scanner เกิด offline ไม่ว่าจะด้วยปัญหาทาง Network หรือ Hardware หรือ อะไรก็ตามนะคะ เราจะทราบได้ทันที และแก้ไขปัญหาได้เร็วขึ้น นั่นก็หมายความว่า จะช่วยลดจำนวนข้อมูลที่อาจจะสูญหายไปได้ค่ะสิ่งที่ต้องทำในบทความนี้นะคะ ….เพิ่ม Line Notify เป็นเพื่อนใน Lineเพิ่ม Applet สำหรับเชื่อม Webhooks และ Line ที่ IFTTTcode เชื่อมต่อ NETPIE สำหรับ monitor ค่ะ 1. เริ่มจากการเพิ่ม Line Notify เป็นเพื่อนใน Line กันก่อนนะคะหากเลือกที่จะรับข้อความ แบบ 1-on-1 chat with Line Notify สามารถข้ามไป ข้อ 2. ได้เลยค่ะ หรือหากอยากจะสร้างกลุ่มขึ้นมาแล้วเพิ่ม Line Notify เข้าไปในกลุ่ม ก็ไม่ผิดกติกานะคะ แต่แนะนำแบบหลังนะคะ เผื่อใช้งาน Line Notify หลาย services เดี๋ยวเราจะ งง… ได้ค่ะ ว่าได้รับ Notification มาจาก service ไหนกันแน่หมายเหตุ : อ่านรายละเอียดเพิ่มเติม Line Notify2. Sign up กับ IFTTT กันก่อนนะคะ ถ้าใครยังไม่มี account3. Connnect กับ Line ค่ะ IFTTTConnect LINE to and more.ifttt.com4. เพิ่ม Applet ค่ะ My Applets > New Appletเพิ่ม this เป็น Webhooks และ ตั้งชื่อ Event Name สำหรับ Trigger ค่ะจากนั้นก็เพิ่ม that ด้วย Line และเลือก Action เป็น Send message ตั้งค่า สำหรับ Action ค่ะAction — Send message Recipient สามารถเลือกเปน 1-on-1 หรือว่า กลุ่มที่เราสร้างไว้จาก ข้อ 1. ค่ะMessage เก็บค่า Default ไว้ก่อนค่ะ ยังไม่ต้องเปลี่ยนอะไร5. code สำหรับเอาไว้ monitor ค่ะในบทความนี้เราจะใช้ Microgear-python ซึ่งเป็น libray สำหรับ pythonในการส่งข้อมูลไปที่ NETPIE ค่ะnetpieio/microgear-pythonNETPIE client library for Python. Contribute to netpieio/microgear-python development by creating an account on GitHub.github.comซึ่งจะมี code example ไว้ให้ลองเทสกันค่ะก่อนจะเริ่มโค้ดสำหรับ monitor ….. ไปเพิ่ม Application key สำหรับ ตัว MonitorApp ที่ NETPIE ก่อนนะคะ เพราะเราจะ monitor จากการ publish ของ scanner ค่ะ เราก็ต้องไป subscribe topic เดียวกับที่ scanner ได้ publish ไว้ค่ะIFTTT Webhooks API Key จาก ifttt.com/maker_webhooks และ คลิกที่ Documentationได้ appid, gearkey, gearsecret, IFTT Webhooks API Key นำมาใส่ในโค้ดข้างล่างได้เลยค่ะ monitor.py….จากนั้นลองรันโค้ดได้เลยค่ะ หมายเหตุ ต้องใช้ python 2.7.xละคอยรอรับ notification ในไลน์ได้เลยค่ะ อาจจะต้องปิดตัว scanner ไปบางตัวเพื่อลองเทสดูนะคะแค่นี้ก็ไม่ต้องห่วงแล้วค่ะ ว่าจะพลาดการเก็บข้อมูลอันสำคัญของเรา มี notification แจ้งเตือนมาเมื่อไหร่ สามารถไปตรวจเชค scanner ได้ทันทีเลยค่ะ
โดย: Laris
| IoT
สิ่งเล็กๆที่เรียกว่า Beacon (6)
Asset/People Tracking using BLE Beacons — Server SetupAsset/People Tracking using BLE Beaconsจากบทความที่แล้ว….. เสร็จเรียบร้อยกันไปแล้วนะคะในส่วน ของ Scanner ซึ่งสามารถมีได้มากกว่าหนึ่งตัวนะคะ จากในรูปจะเห็นว่ามี Scanner อยู่ 3 ตัว และจะเห็นว่ามีส่วนที่ overlap กันอยู่ ซึ่งถ้าหาก มี beacon อยู่ในพื้นที่ overlap ตรงนี้ เราจะมีวิธีแยกได้ยังงัยว่า beacon อยู่ใกล้ Scanner ตัวไหนมากที่สุด เราจะใช้วิธีคำนวณจาก RSSI distance = 10 ^ ((Measured Power - RSSI) / 10 * 2)ซึ่งอ้างอิงจากบทความนี้ค่ะHow to Calculate Distance from the RSSI value of the BLE BeaconI am sure many people are working on the BLE technology and even on the projects like Indoor Location Positioning…iotandelectronics.wordpress.comในบทความนี้เราจะ setup ส่วนของ Server เพื่อเก็บข้อมูล เข้า Database — sqlite แล้วทำการคำนวณให้เราค่ะ รวมไปถึงการทำหน้า Report ส่งที่ต้องเตรียมนะคะ…….. 1. Code ค่ะ2. Application Key สำหรับ Server จาก netpie ค่ะ3. Server สำหรับ run Code (จากข้อ 1.)1. Codeตามไป clone ได้จากที่นี่เลยค่ะes08/serverContribute to es08/server development by creating an account on GitHub.github.com2. Application Key สำหรับ Serverเราจะทำการสร้าง Application Key ใหม่ สำหรับ Server เราค่ะ เราเคยทำกันไปแล้วนะคะ สำหรับการสร้าง Application Key สำหรับ Scanner ของเรา จากบทความ สิ่งเล็กๆที่เรียกว่า Beacon (4) สามารถย้อนกลับไปดูวิธีทำได้จากบทความนี้เลยค่ะเมื่อได้ clientId, username, password จาก netpie-auth มาแล้ว นำมาใส่ที่ config > local.json ได้เลยค่ะ"mqtt":{"url": "mqtt://gb.netpie.io","username": "<your username>","password": "<your username>","clientId": "<your clientId>"}จากนั้นทำการ run ไฟล์ server.js ได้เลยค่ะซึ่งเมื่อทำการเชื่อมต่อ (connected)กับ mqtt server เรียบร้อยแล้ว จะเห็น ข้อความแบบนี้ค่ะconnectedsubscribe to topic /Beacon/gearname/scaner/beacon/exitsubscribe to topic /Beacon/gearname/scaner/beacon/updateนั่นหมายความว่า ตัว server เราทำการ subscribe กับ topic ที่ชื่อว่า/Beacon/gearname/scaner/beacon/exit/Beacon/gearname/scaner/beacon/updateซึ่งจะเป็น topic ที่ตรงกับที่ scanner ได้ publish ไว้นะคะและถ้าสังเกตุ log ไปเรื่อยๆนะค่ะ จะเห็นว่า เริ่มมีการบันทึกข้อมูลของ beacon ที่เจอลง beacon.db ซึ่งเป็น sqlite แล้วค่ะtopic /Beacon/gearname/scaner/beacon/update----------------Location: Node AUUID: 60106EC7-790F-4D9B-9E86-468D2950D9D5Distance: 0.0042805510914958045Last Find Date: 2019-05-17T09:33:56.331Z----------------AddNewBeacon 0cf3eeb80576UpdateDistanceBeaconTotal beacon(s) found from all scanners = 1--------------------Send data to databasebeacon 0cf3eeb80576 Node AOpen databaseSave to sqlite3ข้อมูลทุกอย่างพร้อมแล้ว ทีนี้มาดู หน้าเวป summary ของเรากันค่ะ ด้วยการ run ไฟล์ summary.js ได้เลยค่ะจากรูป จะเป็นการโชว์ว่า beacon ที่ scanner A เจอ ในแต่ละช่วงเวลามีกี่ตัวนะคะ ในตัวอย่าง จะเจอ 1 ตัว ที่เวลา 16:00–17:00 ค่ะถ้าคลิกไปที่ตัวเลข (1) จะเปิด modal เพื่อโชว์ว่ามี beacon ที่เจอคือid ไหน และมีจำนวนที่เจอกี่ครั้ง ในช่วงเวลานั้นๆค่ะ ซึ่ง id ของ beacon สามารถเข้าไปเปลี่ยนได้ที่ beacon_list.json คะจากรูป จะบอกว่า beacon ที่เจอ มี id คือ 0cf3eeb80576 และมี name ว่า E (ตรงนี้สามารถเปลี่ยนเป็นชื่อคน หรือ สิ่อของที่เราต้องการ track ได้นะคะที่ beacon-list.json ค่ะ) และ เจอโดย scanner A ในช่วงเวลา 16:00–17:00 จำนวน 15 ครั้งค่ะข้อมูลที่เรามีตรงนี้สามารถนำไปทำ visualiazation เช่น graph ได้นะคะ ซึ่งสามาถนำมาเป็นข้อมูลเชิงสถิติ มีประโยชน์มากเลยทีเดียวค่ะ …จากการใช้งานจริงๆของผู้เขียน พบปัญหาบ่อยครั้งว่า ข้อมูลขาดหายไปค่ะ ซึ่งค่อนข้างจะเป็นปัญหาสำหรับผู้เขียนในการเก็บข้อมูล หากจะต้องคอยมาเชคข้อมูลผ่าน balena cloud dashboad ตลอดเวลาก็ไม่ค่อยจะสะดวกค่ะ ผู้เขียนจึงได้ทำตัว monitor ขึ้นมาค่ะ โดยใช้ตัวช่วยอย่าง IFTTT และ Line Nofity ค่ะ ซึ่งง่าย ไม่ซับซ้อน แต่ใช้งานได้ดี เหมาะกับงาน monitor ดีทีเดียวค่ะ ติดตามอ่านวิธีทำในบทความต่อไปนะคะ สวัสดีค่ะ…
โดย: อิศเรศ ประจิตต์มุทิตา
| Digital Skill
วิเคราะห์ภาพรวมสายงาน โปรแกรมเมอร์ ในปัจจุบันจากข้อมูลจริงกว่า 2400 คน!!
ปัจจุบันเป็นที่รู้กันอยู่แล้วว่า สายงาน IT เป็นหนึ่งในสายงานที่เงินเดือนสูงมากกก! บทความนี้เราจะมาขยายความให้ทุกคนได้เห็นและเข้าใจโลก IT ในปัจจุบันมากขึ้นว่า หากเราโฟกัสที่สาขา programming เป็นหลัก เรื่องของตำแหน่ง เงินเดือน และทักษะที่เกี่ยวข้องจะเป็นอย่างไรบ้างนะ จากภาพเราจะเห็นได้ว่า เงินเดือนเริ่มต้นของนักศึกษาจบใหม่ หรือคนที่มีประสบการณ์ทำงานไม่เกิน 3 ปีนั้น ค่อนข้างแตกต่างตามตำแหน่งงานอยู่บ้าง แต่เอ๊!? เราควรเข้าใจก่อนว่าแต่ละตำแหน่งงานมีหน้าที่แตกต่างกันอย่างไร ทำไมถึงมีความเหลื่อมล้ำของเงินเดือนอยู่พอควรเลยทีเดียว Front-end Developer: คนนี้ทำหน้าที่ดูแลส่วนโต้ตอบกับผู้ใช้ทุกอย่างครับ ทั้งข้อความ, ปุ่ม, รูปภาพ และขนาดของ elements เว็บไซต์พอดีกับหน้าจอคอมพิวเตอร์ไหม อยู่บนโทรศัพท์มือถือแล้วดูแปลกหรือเปล่า Back-end  Developer: คนที่ทำหน้าที่จัดการระบบเบื้องหลังทั้งหมดของแอปพลิเคชัน, สร้าง API สำหรับเป็นตัวกลางในการเข้าไปใช้งานข้อมูลในฐานข้อมูล, เน้นใช้โลจิคออกแบบการทำงานของโปรแกรม, กำหนดทิศทางข้อมูลจะวิ่งจากไหนไปไหน ด้วยวิธีอะไร โครงสร้างเป็นอย่างไร, ระบบความปลอดภัย, ชนิดของฐานข้อมูลที่ใช้เก็บข้อมูล ฯลฯ Full-Stack Developer: เป็นการผสมบทบาทของ Front-End และ Back-End ไว้ในคนๆ เดียวครับ หรือ ในบางครั้งอาจจะรวมถึงการทำในส่วนของ Infrastructure เช่นการจัดการ Server อีกด้วย  Software Developer: นักพัฒนาซอฟต์แวร์ มีหน้าที่ code โปรแกรม แต่เพิ่มการ design, Architecture, UML แต่บางคนอาจเรียกรวมหรือสลับกับ Programmer ก็ได้ ซึ่งในหลายๆบริษัทตำแหน่ง Software Developer อาจจะเป็นตำแหน่งเดียวกับ Full-Stack Developer ก็ได้เช่นกัน ทั้งนี้ขึ้นอยู่กับบริษัทนั้นๆ  Web Developer: เป็นตำแหน่งที่โฟกัสในส่วนของการพัฒนาเว็บไซต์เป็นหลัก ซึ่งเป็นตำแหน่งที่ขึ้นอยู่กับ job description ของบริษัทนั้นๆ เลย ในบางครั้งอาจจะเป็นตำแหน่งที่ทำในลักษณะของ Front-end เช่นเดียวกับ Front-end Developer ก็ได้ หรือ ในบางครั้งอาจจะหมายถึง Full-Stack Developer ก็ได้เช่นกัน Mobile Developer: คนที่พัฒนาแอปพลิเคชันต่างๆ  ของสมาร์ทโฟนหรือแท็บเล็ต โดยในตำแหน่งนี้จะแยกอีกว่าเป็นในฝั่งของ IOS หรือ Android ซึ่งในการพัฒนาแอปพลิเคชันนั้น แต่ละสาขามีความแตกต่างกันโดยสิ้นเชิง ทั้งในเรื่องของภาษา และ ความรู้พื้นฐานที่ใช้ในการพัฒนา Game Developer: เป็นหนึ่งในนักพัฒนาซอฟต์แวร์ที่มีความเชี่ยวชาญเฉพาะในการพัฒนาเกม กระบวนการออกแบบจึงมีความคล้ายกัน นักพัฒนาเกมจำเป็นต้องมีทักษะทั้งการเป็นโปรแกรมเมอร์ และเป็นดีไซน์เนอร์ ที่ต้องอาศัยความคิดสร้างสรรค์ในการออกแบบเกม แลมีทักษะการทำกราฟิกบ้าง Data engineer: ทำหน้าที่ออกแบบวิธีการจัดเก็บ และเรียกใช้งานข้อมูล มุมมองของข้อมูลของเขา คือ Data flow หรือ Pipeline รวมไปถึงการจัดเก็บและเรียกใช้งานข้อมูล โดยมีโจทย์สำคัญคือการรับมือการข้อมูลที่เพิ่มเข้ามาในระบบอย่างต่อเนื่อง หรือการจัดเก็บข้อมูลปริมาณมากได้อย่างมีประสิทธิภาพ Data analyst: คนที่ใช้ข้อมูลในการวิเคราะห์แนวโน้ม หรือแก้ปัญหาจากสิ่งที่ผิดแปลกไปจากแนวโน้มเดิม โดยใช้หลัก สถิติ ทั้งนี้การวิเคราะห์ต่างๆ ต้องอาศัยประสบการณ์ และมุมมองที่เฉียบขาด IT support: เป็นตำแหน่งงานสาย IT ที่เน้นการปฏิบัติการเป็นหลัก คอยแก้ไขปัญหาจุกจิกภายในบริษัท สโคปงานจะใกล้เคียงกันบ้าง เช่น ดูแลอุปกรณ์คอมพิวเตอร์ภายในสำนักงาน ดูเรื่องกล้อง CCTV ดูแลอินเตร์เน็ต เซิร์ฟเวอร์ ฯลฯ QA or Test Developer: เป็นคนที่รอทดสอบระบบหรือโปรแกรมที่ทีม Developer สร้างมา ว่าระบบหรือโปรแกรมนั้นทำงานถูกต้องตาม Requirement หรือไม่ และเป็น คนหาความผิดพลาดในการทำงานของโปรแกรม ก่อนที่จะส่งงานไปให้ลูกค้า จากกราฟด้านล่าง เป็นการสรุป “ทักษะ” ที่จำเป็นสำหรับตำแหน่งต่างๆ โดยเราโฟกัสที่ Top 6 สายงานของเด็กจบใหม่ที่เงินเดือนสูง ซึ่งเป็นทักษะที่จำเป็นต้องมีสำหรับการทำงานในปีแรกครับ จะเห็นได้ว่า ถึงแม้ทักษะที่จำเป็นของแต่ละงานจะซ้ำๆ กันอยู่บ้าง แต่ ทักษะที่จำเป็นต้องมี กับ ทักษะที่รู้ไว้ก็จะเป็นประโยชน์ นั้นแตกต่างกัน อย่างภาษา HTML/CSS หรือ SQL เป็นทักษะที่ติด Rank มาในทุกสายงานก็จริง แต่ความสำคัญสำหรับแต่ละสายงานก็ไม่เท่ากัน เช่น HTML/CSS สำหรับ Front-end Developer เป็นทักษะสำคัญที่ต้องมี แต่สำหรับ Data or Business analyst แล้วอาจไม่ได้สำคัญขนาดนั้น แต่ถ้าพอมีความรู้ไว้ก็จะดี (ข้อมูลดังกล่าวเป็นการสรุปจากการทำแบบสอบถาม ไม่ได้หมายความว่าคุณจะต้องมีทักษะตามที่ระบุเท่านั้น ถึงจะทำงานตำแหน่งดังกล่าวได้) หากใครกำลังต้องการศึกษาหรืออยากพัฒนาทักษะเพื่อทำงานสายนี้ ผลการสำรวจนี้อาจช่วยเป็น guideline ให้คุณได้นะครับ ไหนๆ บทความนี้ก็มุ่งเน้นให้คนทั้งในและนอกสาย IT ได้อ่านเป็นข้อมูลเพื่อให้เห็นภาพรวมแล้ว เราจึงทำการวิเคราะห์ในประเด็นสำคัญอีกหนึ่งประเด็นเพิ่มเติมว่า “อะไรคือสาเหตุหลักที่ทำให้คนสาย IT หมดไฟ!!” จากข้อมูลเราเห็นได้อย่างชัดเจนเลยว่า ไม่ว่าประสบการณ์จะมากหรือน้อย ทำงานมาแล้วกี่ปี ปัญหาใหญ่สุดของการหมดไฟคือ “ไม่เกิดการเรียนรู้สิ่งใหม่ๆ” แปลว่าหากคุณเป็นผู้ที่มีส่วนการขับเคลื่อนองค์กร เช่น CTO, Team Lead หรือแม้แต่ ถ้าคุณคือผู้ประกอบการ สิ่งหนึ่งที่คุณควรสนใจและให้ความสำคัญกับคนในองค์กรคือ การส่งเสริมให้เกิดการเรียนรู้สิ่งใหม่ๆ ตลอดเวลา ทุกคนย่อมมีความสนใจที่จะเรียนรู้สิ่งใหม่ๆ แตกต่างกันตามความสนใจส่วนบุคคล ซึ่งถ้าว่ากันด้วยภาพรวมนั้น เราได้ทำการวิเคราะห์และสรุปมาดังนี้ คุณจะเห็นได้ทันทีเลยว่า ในแต่ละช่วงอายุจะมีความสนใจในการเรียนรู้สิ่งใหม่ที่แตกต่างกัน แต่ Top Hit Keyword อย่าง Data science และ Blockchain ซึ่งมาเป็นอันดับหนึ่งและสองในกลุ่มวัยทำงานนั้น แสดงให้เห็นชัดเจนว่า เทรนด์ของทั้งสองทักษะกำลังเป็นสิ่งที่ทุกคนสนใจและอยากจะศึกษา แต่ถ้าเรามองที่อันดับสามของแต่ละช่วงอายุ เราจะเริ่มเห็นความแตกต่างแล้วว่ากลุ่มใดสนใจในทักษะไหน ยกตัวอย่างเช่น ในกลุ่มช่วงอายุ 26-30 เริ่มให้ความสนใจที่จะศึกษาทักษะสำคัญอย่าง CI/CD ซึ่งอาจมองได้ว่า ทักษะพื้นฐานอย่าง Database ที่กลุ่มเด็กจบใหม่อย่างช่วงอายุ 21-25 ที่ให้ความสนใจนั้น ในกลุ่มช่วงอายุ 26-30 อาจจะมีความเชี่ยวชาญแล้ว จึงหันไปสนใจในทักษะอื่นๆ แปลว่าหากคุณเป็นคนที่จะผลักดันให้เกิดการเรียนรู้ของคนในองค์กรนั้น ภาพนี้เป็นหนึ่งในสิ่งที่ช่วยให้คุณสามารถนำไปใช้พัฒนาคนในองค์กรได้อย่างดีเลย แน่นอนว่าวิธีการเรียนรู้ในปัจจุบันมีวิธีที่หลากหลายให้เลือกเต็มไปหมด แต่วิธีไหนล่ะที่คนส่วนใหญ่ให้ความสนใจมากที่สุด?กว่า 51.1 % ของผู้ทำแบบทดสอบทั้งหมด ให้คำตอบเป็นไปในทิศทางเดียวกันว่า การเรียนที่ให้ผลดีที่สุดคือ การเรียนผ่านทางคอร์สเรียนออนไลน์ เช่น Youtube, MOOCs (Udemy, Coursera) เป็นต้น  แต่เราก็ยังมีคำถามอยู่ว่า แล้วคอร์สเรียนออนไลน์แบบไหนล่ะ ที่ทำให้คนส่วนใหญ่สนใจอยากจะเรียนมากที่สุด หากลองเปรียบเทียบระหว่างคอร์สเรียนออนไลน์ในรูปแบบเดียวกันแต่เป็นภาษาไทยกับภาษาอังกฤษ ก็จะเห็นได้ว่ายังมีความเหลื่อมล้ำกันอยู่พอสมควร อาจเป็นเพราะปัจจัยทางภาษานี้ที่ทำให้กลุ่มคนส่วนใหญ่ยังมีข้อจำกัดทางการเรียนรู้เพิ่มเติมเพื่อพัฒนาตนเองอยู่ ซึ่งทางสมาคมโปรแกรมเมอร์ไทยได้มองเห็นถึงปัญหานี้ จึงได้มีแนวคิดในการส่งเสริมการเรียนรู้ที่ประโยชน์ เช่น การประชาสัมพันธ์ให้ประชาชนรู้จัก MOOCs มากขึ้นทั้งของไทยและต่างประเทศ หรือการส่งเสริมให้มีการแปลความรู้จากภาษาอังกฤษเป็นภาษาไทย อย่างที่กำลังดำเนินการพัฒนาแพลตฟอร์ม Digital Skill นี้ เพื่อที่จะเตรียมความพร้อมให้คนไทยได้รับประโยชน์จากสื่อการเรียนรู้อย่างเต็มที่ และนำผลวิเคราะห์ที่ได้นี้มาเป็นข้อมูลในการทำกิจกรรมต่างๆ ที่เหมาะสมต่อไป และสุดท้าย ข้อมูลทั้งหมดในบทความนี้มาจากแบบสอบถาม https://forms.gle/N9D28PcKb3LQT27x8 โดยได้ทำการเก็บข้อมูลมาตั้งแต่วันที่ 26 มิถุนายน 2562 ถึง 10 กันยายน 2562 ปัจจุบันมีผู้ร่วมทำแบบสอบถามอยู่ที่ 2,392 คน จากทั้งสมาชิกของสมาคมโปรแกรมเมอร์ไทย การช่วยเผยแพร่ของกลุ่มโปรแกรมเมอร์และวิทยากรงาน Code Mania อีกทั้งเราลงทุนกับการโปรโมตผ่านช่องทางออนไลน์ไปกว่า 23,000 บาท โดยได้รับการสนับสนุนค่าใช้จ่ายจากสำนักงานส่งเสริมเศรษฐกิจดิจิทัล(DEPA) ซึ่งเรามีความตั้งใจว่าจะเปิดเผยข้อมูลทั้งหมด (Open Data) ให้ทุกท่านนำไปวิเคราะห์เชิงลึกได้อย่างอิสระ เมื่อมีจำนวนผู้ร่วมทำแบบสอบถามครบ 10,000 คน ยังไงก็ช่วยกันแชร์ได้นะครับ เพื่อข้อมูลที่สามารถนำไปวิเคราะห์ต่อยอดให้เป็นประโยชน์ต่อไปได้ ขอบคุณครับ:)อิศเรศ ประจิตต์มุทิตาอุปนายกสมาคมโปรแกรมเมอร์ไทย
โดย: Laris
| IoT
สิ่งเล็กๆที่เรียกว่า Beacon (5)
Asset/People Tracking using BLE Beacons — Scanner Setup IIIมาถึงขั้นตอนสุดท้ายของการ Setup Scanner กันแล้วค่า หลังจากที่เราได้ทำไปแล้ว 5 ขั้นตอน :1. Sign up and login2. Create an application3. Add a device and download the OS4. Flash your SD card and boot the device5. Add application environment variablesถึงตรงนี้ เราได้ทำการเชื่อมต่อ RPi เข้ากับ balena แล้วนะคะขั้นตอนสุดท้าย เราจะ Deploy Code ค่ะ…เริ่มต้นด้วยการเตรียม code สำหรับ Scanner รอไว้ก่อนเลยค่ะes08/scannerContribute to es08/scanner development by creating an account on GitHub.github.comซึ่งก็จะมีไฟล์ตามนี้นะคะScanner Folderจากนั้นไปเพิ่ม SSH Key ของเราบน balena ก่อนค่ะ เพราะเราจะ push code ของเรา ผ่าน git ค่ะ อ่านรายละเอียดเพิ่มเติมวิธีเพิ่ม SSH Key ได้ที่นี่ค่ะ Generating a new SSH key and adding it to the ssh-agent - GitHub HelpBefore adding a new SSH key to the ssh-agent to manage your keys, you should have When adding your SSH key to the…help.github.comได้ SSH Key มาแล้วก็นำไปใส่ไว้ที่นี่ค่ะ Preference > SSH Keysbalena — Adding an SSH Keyเพิ่ม key กันเสร็จเรียบร้อย กลับมาหน้า Application ของเรากันก่อนค่ะApplication — Scannerลองสังเกตุตามรูปนะคะ ตรงมุมขวาบน ถ้าคลิก (?) จะเห็นรายละเอียดเกี่ยวกับการ push code คล้ายๆรูปข้างล่างนี้ค่ะ ซึ่งจะบอกend point ของ repository ของ Application เราค่ะ เริ่ม add remote และ push code ได้เลยค่ะ $ git remote add balena <USERNAME>@git.balena-cloud.com:<USERNAME>/<APPNAME>.git$ git push balena masterจะสังเกตุเห็น Unicorn นะคะ ถ้า code ถูก complie / build เสร็จ แล้วค่ะbalenaกลับมาที่ balena cloud dashboad ค่า…..ลองคลิกดูที่ พาย (Device)ของเรานะคะ จะเห็นว่า Status เค้าเริ่มมีการ Update ค่ะ หลังจากเรา push code ไปเสร็จเรียบร้อย รอจนครบ 100%ตอนนี้ Scanner ของเราพร้อมใช้งานแล้วค่ะ หยิบ beacon ของเรา (ในบทความนี้เราใช้ ibeacon นะคะ) มาเช็คกันเลยค่ะเปิด Log ขึ้นมา (สามารถเปิดได้จากบน balena cloud dashboard ได้เลยนะคะ) ขยายให้เห็นเต็มๆจอ) จะเห็นว่าน้องพายเรา เจอ beacon แล้วค่ะ Scanner Logเสร็จกันไปแล้ว ในส่วน ของ Scanner ค่ะ ในการใช้งานจริงๆ beacon ตัวนึงเนี่ย สามารถถูกแสกนเจอโดย Scanner หลายๆตัวในพื้นที่ใกล้เคียงกันได้ค่ะ ละเราจะมีวิธีรู้ได้ยังไงว่า beacon ตัวนี้ใกล้ Scanner ตัวไหนหรืออยู่ใน area ไหนกันแน่ เรามีวิธีคำนวณ พร้อมทำ Server ไว้เก็บข้อมูล และทำหน้าReport ให้เราค่ะ… มาติดตามวิธีทำ Server กันต่อใน สิ่งเล็กๆที่เรียกว่า Beacon ตอนต่อไปค่ะ….
โดย: Laris
| IoT
สิ่งเล็กๆที่เรียกว่า Beacon (4)
Asset/People Tracking using BLE Beacons — Scanner Setup IIสวัสดีคะ…… จากบทความที่แล้ว ( Scanner Setup I) เราได้ทำการ Setup Scanner ตาม 4 ขั้นตอนนี้ไปแล้ว1. Sign up and login2. Create an application3. Add a device and download the OS4. Flash your SD card and boot the deviceแต่เรายังไม่ได้เพิ่ม Environment Variables และ Deploy โค้ดค่ะ …งั้นเราไปต่อกันเลยค่ะ กับขั้นตอนที่ 5. Add application environment variables5. Add application environment variablesตรงนี้เราจะยังอยู่ในส่วนของ Application Configuration นะคะ เราจะเพิ่ม Application Environment Variables ตามนี้ค่ะ :beacon_serivce_uuid — <ใช้ uuid generator ทั่วไป generate ค่าได้เลยค่ะ>device_name — new_nodemqttClientId — clientIdmqttUsername — usernamemqttPassword — passwordmqttUrl — mqtt://gb.netpie.iotopicBeaconExit — /Beacon/gearname/scanner/beacon/exittopicBeaconStay — /Beacon/gearname/scanner/beacon/updateเสร็จจาก Application Environment Variables ก็ไปต่อที่ Device Environment Variables กันค่ะ ค่าต่างๆในส่วนของ Device จะ override ค่าที่ตั้งไว้ใน Application Environment Variables นะคะ ถ้าชื่อตรงกัน ซึ่งเราจะ override ตัวแปร 4 ตัวนี้ค่ะ :device_namemqttClientIdmqttUsernamemqttPassworddevice_nameสามารถเป็นชื่ออะไรก็ได้นะคะ ในบทความจะใช้ชื่อว่า Node A ละกันนะคะ เวลาดึงไปโชว์บนเวปจะได้เข้าใจง่ายค่ะ ว่าตัวไหนเป็นตัวไหนmqttClientId, mqttUsername, mqttPasswordส่วนสามตัวนี้ถ้าสังเกตุจากชื่อ mqtt* พอจะเดาได้ใช่มั้ยค่ะว่าต้องเกี่ยวข้องกะ MQTT ที่เราเคยพูดถึงกันไปแล้วแน่ๆ ในการเซทค่าเกี่ยวกับ mqtt ตรงนี้เราจะใช้ NETPIE เป็นตัวช่วยในการจัดการเกี่ยวกับ Ownership และ Authorization ค่ะ (อย่าเพิ่ง งง นะค่ะ ตามมาอ่านคำอธิบายด้านล่างกันค่ะ …)….เราจะ Pause เรื่องการเซทค่าตรงนี้แปบนึง ละไปคุยกันเรื่อง NETPIE กันก่อนคะ…NETPIE | Network Platform for Internet of EverythingNetwork Platform for Internet of EverythingNetwork Platform for Internet of Everythingnetpie.ioNETPIE — Network Platform for Internet of Everything เป็น Cloud Platform สำหรับเชื่อมต่ออุปกรณ์ หรือ Things ใน IoT ค่ะ (Distibuted MQTT Broker) มี Client Library ที่เรียกว่า Microgear ค่ะพัฒนาขึ้นมาโดย NECTEC และเปิดให้บุคคลทั่วไปใช้ได้ FREE ค่ะแต่ต้องลงทะเบียนและจัดการตัวตน(Ownership)และสิทธิ์ของแอปพลิเคชั่น (Authorization)และอุปกรณ์กันก่อน ซึ่งจะใช้ Client ID, Username และ Password ในการพิสูจน์ตัวตนก่อนเข้าใช้ NETPIE ซึ่งเป็นไปตามมาตรฐานของ MQTT 3.1.1 ค่ะClient ID มีไว้เพื่อให้ Broker ใช้ระบุตัวตนของ Client ดังนั้น Client ID จะต้องไม่ซ้ำกันค่ะUsername และ Password มีความจำเป็นสำหรับให้ Broker ใช้ในการ Authentication และ Authorization ซึ่งเป็นไปตามมาตรฐานของ MQTT 3.1.1 เช่นเดียวกันค่ะ…มาเริ่มใช้งาน NETPIE เพื่อนำมาเซทค่าให้mqttClientId, mqttUsername, mqttPassword กันค่ะ …เริ่มต้นสมัครและลงทะเบียนกันก่อนค่ะในส่วนของMobile Phone Number มีความสำคัญนะคะ เพราะจะใช้รับ OTP SMS ค่ะได้รับ OTP เสร็จ ก็จัดการ Login เลยค่ะ2. เริ่มสร้าง Application (AppID) ค่ะ ใช้ชื่อว่า Beacon3. สร้าง Application Key ค่ะตั้งชื่อ Application Key ว่า Scanner และเลือกใช้ Device Key นะค่ะNote: ข้อแตกต่างระหว่าง Device Key และ Session Key ค่ะDevice Key คือ Key ที่ใช้กับอุปกรณ์ Device Key ของอุปกรณ์จะถูกจำไว้ตลอดค่ะ ถึงแม้อุปกรณ์จะไม่ได้เชื่อมต่อกับ NETPIE แล้ว (Offline)แต่เมื่อมีการเชื่อมต่อกลับเข้ามาใหม่ จะถูกมองว่าเป็นอุปกรณ์ตัวเดิมค่ะSession Key คือ Key ที่ใช้กับอุปกรณ์ที่มีการใช้งานไม่ถาวรเช่น Browser ค่ะลองตรวจสอบข้อมูลและดูรายละเอียดของ Key ที่เราสร้างกันค่ะ ซึ่งประกอบด้วย Application Key NameKey สำหรับให้อุปกรณ์ใช้สำหรับเชื่อมต่อ NETPIESecret เป็นรหัสลับหรือรหัสผ่านที่อุปกรณ์ต้องใช้คู่กับ Key สำาหรับให้อุปกรณ์เชื่อมต่อ NETPIEREST API auth เป็น key ที่ใช้สำหรับการใช้งานด้วย REST API ค่ะถึงตรงนี้เราจะได้ AppID, AppKey, และ AppSecret มาแล้ว แต่ยังค่ะ… นี่ยังไม่ใช่สิ่งที่เราต้องการ เป็นแค่เพียงสารตั้งต้นค่ะ เราจะต้องนำ AppID, AppKey, และ AppSecret ไปทำการ generate ค่าของ ClientId, Username, และ Password ผ่าน netpie-auth (สามารถทำตามขั้นตอนได้เลยค่ะ ง่ายๆ…)netpie-authUsage $ netpie-auth

พบบทสัมภาษณ์ได้ที่นี่เร็ว ๆ นี้

พบDigital Skill บนสื่อ ได้ที่นี่เร็ว ๆ นี้

หมวดหมู่

พบหมวดหมู่ ได้ที่นี่เร็ว ๆ นี้

พบหมวดหมู่ ได้ที่นี่เร็ว ๆ นี้

Tags

พบคำสำคัญ ได้ที่นี่เร็ว ๆ นี้

พบคำสำคัญ ได้ที่นี่เร็ว ๆ นี้

พบคำสำคัญ ได้ที่นี่เร็ว ๆ นี้