8 June 2017

bact

ความมั่นคงปลอดภัยของ Internet of Things – ข้อคิดจาก Bruce Schneier ในงาน #infosec17

โพสต์ที่แล้วเล่าเรื่องงาน Infosecurity Europe วันที่สองไป เรื่อง General Data Protection Regulation (GDPR) จากมุมมอง ICO ยังเหลืออีกเรื่องที่ไปฟังมา คือเรื่อง ความปลอดภัยของ Internet of Things (IoT)

หัวข้อคือ Artificial Intelligence and Machine Learning: Cybersecurity Risk vs Opportunity? มี Bruce Schneier เป็นคนพูด คนแน่นมาก ตรงที่เป็นถ่ายทอดให้ดูทางจอก็ยังแน่น (ในภาพนี้เฉพาะที่นั่ง มียืนรอบๆ อีก)


Schneier พูดหลายประเด็น แต่อันหลังสุดมาเน้นเรื่องความมั่นคงปลอดภัยของ Internet of Things หรือ “อินเทอร์เน็ตของสรรพสิ่ง”

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

เราเปลี่ยนมือถือทุก 2-3 ปี กล้องวงจรปิดทุก 5-10 ปี ตู้เย็นบางบ้าน 20 ปี รถยนต์ที่มีตลาดมือสองอาจมีอายุการใช้งาน 40-50 ปี

คนทำซอฟต์แวร์ควบคุมรถยนต์ทำแล้วใช้ไปได้ 40-50 ปี แต่คนทำซอฟต์แวร์มือถือหรือ IoT ไม่เคยทำอะไรแบบนี้มาก่อน

ที่ซอฟต์แวร์ในบางอุตสาหกรรมมีความปลอดภัยสูง เพราะการกำกับดูแลและระบบนิเวศน์มันทำให้เป็นแบบนั้นได้ ต้องมีใบรับรอง มีการทดสอบ มีการตรวจสภาพ ซึ่ง IoT ยังไม่มีระบบนิเวศน์แบบนั้น

Schneier มองว่า รัฐมีบทบาทตรงนี้ได้ ด้วยการกำหนดนโยบาย เช่นการกำหนดให้ซอฟต์แวร์ในกิจการที่สำคัญมากๆ (critical) เก็บประวัติการทำงานและข้อผิดพลาด แบบที่อุตสาหกรรมการบินและยานยนต์ทำนั้น ทำให้เรามีข้อมูลเพื่อศึกษาและปรับปรุงระบบในอนาคตให้ปลอดภัยขึ้นได้

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

สำหรับอุตสาหกรรมนี้ มันไม่ใช่ทางเลือกระหว่าง “กำกับ vs ไม่กำกับ” แต่เป็นระหว่าง “กำกับอย่างฉลาด vs กำกับอย่างโง่” (smart regulation vs stupid regulation)

เขาทิ้งท้ายว่า ในบางประเทศเริ่มมีความเคลื่อนไหวเรื่องนี้แล้ว ว่าจะทำอย่างไรให้ผู้ผลิตอุปกรณ์พวกนี้ “รับผิดชอบ” กับผู้ใช้มากขึ้น — เช่นในสหรัฐอเมริกา ที่ FTC และ FCC สอบสวนว่าทำไมผู้ผลิตโทรศัพท์ออกอัปเดตความปลอดภัยช้า หรือที่หน่วยงานคุ้มครองผู้บริโภคของเนเธอร์แลนด์ฟ้องซัมซุงและเรียกร้องให้ออกอัปเดตความปลอดภัยอย่างสม่ำเสมอตลอด 2 ปีนับจากวันที่ซื้อ 

ใครสนใจงานนี้ ติดตามแฮชแท็ก #infosec17 ได้ในทวิตเตอร์ครับ ส่วนเรื่อง AI กับ security เดี๋ยวมีอีกโพสต์

โดย bact ณ 8 June 2017 12:57 +0700

7 June 2017

bact

หลักการ/กลไกการคุ้มครองข้อมูลใหม่ใน GDPR ของสหภาพยุโรป #infosec17

วันนี้เป็นวันที่ 2 ที่มางาน Infosecurity Europe ที่ลอนดอน ได้ฟังหลักๆ 2 เวที เป็น Keynote ทั้งคู่ อันแรกตอนเช้า ฟัง Bruce Schneier พูดหัวข้อ Artificial Intelligence & Machine Learning: Cybersecurity Risk vs Opportunity? ส่วนตอนบ่ายฟัง EU GDPR Special Focus – Extended Session โพสต์นี้เล่าของตอนบ่ายก่อน ส่วนของตอนเช้ากับของงานวันแรกยังไม่ได้เขียนถึง เดี๋ยวทยอยลงนะ

เรื่อง General Data Protection Regulation (GDPR) ซึ่งเป็นกฎหมายคุ้มครองข้อมูลตัวใหม่ของสหภาพยุโรปที่ประกาศเมื่อปีที่แล้วและจะมีผลบังคับใช้ในวันที่ 25 พฤษภาคม 2018 นี่มาแรงมากๆ เดินไปไหนในงานก็เห็นคำนี้ มีในเกือบทุกทอล์ก เพราะเหลือเวลาอีกไม่ถึง 1 ปีแล้ว ที่ทุกบริษัท ทุกหน่วยงาน จะต้องปฏิบัติตามกฎหมายดังกล่าว ซึ่งมีผลบังคับใช้เหมือนกันหมดทั่วสหภาพยุโรป (หัวข้อตอนบ่ายที่ไปฟังมาอันนี้ฮิตมาก คนต่อแถวยาวเหยียด และเวลาก็ได้ยืดมากกว่าหัวข้ออื่น เป็น extended session)

Ready for GDPR (?)

Peter Brown ซึ่งเป็นเจ้าหน้าที่เทคโนโลยีอาวุโสของ Information Commissioner’s Office (ICO – สำนักงานคณะกรรมการข้อมูลข่าวสารของสหราชอาณาจักร) เป็นคนพูดเปิด เล่าถึงหลักการทั่วไปของ GDPR กับความพร้อมของ ICO ในฐานะองค์กรกำกับและคุ้มครองข้อมูลส่วนบุคคลของสหราชอาณาจักร ว่าได้เตรียมข้อแนะนำและหลักปฏิบัติอะไรต่างๆ ให้กับภาคธุรกิจปรับตัวและเปลี่ยนผ่านอย่างไรบ้าง

Peter บอกว่าหลักการคุ้มครองข้อมูลของ GDPR นั้น ไม่ต่างจากที่กฎหมายคุ้มครองข้อมูล หรือ Data Protection Act (DPA) ที่สหราชอาณาจักรมีอยู่ในปัจจุบัน เพียงแต่เพิ่มหลักการขึ้นมา 2 เรื่อง คือ Security และ Accountability & Governance

อธิบายต่อ (ผมพูดเอง) ก็คือ เดิม DPA นั้นพูดถึงเฉพาะตัวข้อมูลและการประมวลผลข้อมูล แต่ GDPR ยังพูดถึงระบบที่ใช้ประมวลผลข้อมูล (เน้นเชิงเทคนิค – technical measures) และความรับผิดและการบริหารจัดการของผู้ที่เกี่ยวข้อง (เน้นเชิงกระบวนการ – organizational measures)

จริงๆ ข้อคำนึงเหล่านี้ มีอยู่แล้วเงียบๆ ใน DPA แต่ GDPR ระบุให้มันแยกออกมาอย่างชัดเจน

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

แต่ GDPR คิดละเอียดกว่านั้น โดยเฉพาะในบริบทที่ข้อมูลจำนวนมากอยู่ในระบบเครือข่ายและสารสนเทศ คือแม้จะเก็บและใช้อย่างถูกต้องทุกอย่าง แต่ถ้าระบบที่ยุ่งเกี่ยวกับข้อมูลนั้นมีการจัดการที่ไม่ได้มาตรฐาน ไม่มีมาตรการป้องกันที่ควรมี ก็มีความผิดได้

สิ่ง “ใหม่” ที่ถูกพูดถึงในหลักการ Accountability & Governance ของ GPDR ก็คือหลัก data protection by design, data protection by default, และ data protection impact assessment (DPIA) — “ใหม่” ในที่นี้ หมายถึงมันไม่เคยถูกบังคับในกฎหมายมาก่อน

(เรื่อง data protection by design นี่ มีหลายบริษัทที่มาออกงานพูดถึง ตั้งแต่การออกแบบ user experience ที่สนับสนุน security, การทำระบบให้ลด cognitive load เพื่อให้คนทำงานอยู่ในภาวะมีสติ, การออกแบบให้ AI มาช่วยคนตัดสินใจได้ดีขึ้น)

ทั้งหลักการ Security และ Accountability ที่มีใน GDPR เรียกว่าเป็นความพยายามให้เกิดสภาพแวดล้อมที่ลดความเสี่ยงในการรั่วไหลของข้อมูล ไม่ได้มาเน้นเฉพาะการลงโทษหลังข้อมูลรั่วแล้ว นอกจากนี้ ในส่วนของ Security ก็ยังมีการกำหนดมาตรฐานการแจ้งเตือนในกรณีที่พบข้อมูลรั่วไหล (ทาง Article 29 Working Party จะออกแนวปฏิบัติมาภายในปีนี้)

พูดอีกแบบคือจะหวังว่า “เราจะโชคดี” “มันไม่เกิดกับเราหรอก” ไม่ได้ — ต่อให้ข้อมูลยังไม่รั่ว แต่ถ้าพบว่าไม่มีมาตรการที่เพียงพอก็มีความผิด

หน้าที่ของผู้ประมวลผล-ผู้ควบคุมข้อมูลคือ จะต้องสามารถแสดงหลักฐาน (evidence) ให้ได้ว่า ตัวเองได้ทำสิ่งที่ควรทำทั้งหมดแล้ว

ลองคิดถึงกฎหมายเกี่ยวกับความปลอดภัยของอาคาร ที่ต่อให้ไฟยังไม่ไหม้ แต่ถ้าพบว่าไม่มีทางหนีไฟ ไม่มีอุปกรณ์จับควัน-แจ้งเตือน-ดับเพลิง ที่ได้มาตรฐานอย่างเพียงพอ ก็มีความผิดอยู่ดี

ใน GDPR หากมีกรณีข้อมูลรั่วไหล หากผู้ประมวลผล/ผู้ควบคุมข้อมูลสามารถแสดงได้ว่า ได้ทำตามมาตรฐานที่กำหนด ยังมีโอกาสได้รับลดหย่อนโทษลงด้วย

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

<script async="" charset="utf-8" src="http://platform.twitter.com/widgets.js"></script>

โดย bact ณ 7 June 2017 18:03 +0700

19 May 2017

bact

ยากและไม่ค่อยปลอดภัย Facebook Wi-Fi #FAIL @ ห้องสมุด TCDC

วันนี้มีสัมภาษณ์ เลยลองนัดที่ TCDC ใหม่ ตรงไปรษณีย์กลาง บางรัก ช่วงนี้จนถึงสิ้นเดือนพฤษภาคมเขาเปิดให้ใช้ห้องสมุดฟรี

พบว่าการใช้ไวไฟที่นี่วุ่นวายไปหน่อย คือคงตั้งใจดี ทางหนึ่งก็จะได้ยอดเช็กอินเพิ่ม อีกทางก็คงอยากให้ผู้ใช้ล็อกอินได้ง่ายๆ เลยใช้ Facebook Wi-Fi ในการลงทะเบียน (พูดอีกแบบคือ ฝากภาระในการบันทึกผู้เข้าใช้ระบบให้เฟซบุ๊กทำ – จะไม่ทำเลยก็คงไม่ได้ เพราะพ.ร.บ.คอมพิวเตอร์กำหนดให้บันทึกข้อมูลการจราจร-ที่ระบุตัวผู้ใช้ได้)

รวมๆ คือเราพบว่าการล็อกอินไวไฟที่ TCDC ไม่ค่อยเป็นมิตรเท่าไร แถมอาจส่งเสริมพฤติกรรมเสี่ยงด้านความปลอดภัยของข้อมูลส่วนบุคคล โพสต์นี้จะบอกว่าทำไม ปัญหาน่าจะอยู่ตรงไหน และน่าจะแก้ไขยังไงได้บ้าง (ใครใช้ Facebook Wi-Fi ก็อาจจะเจอปัญหาแบบเดียวกันนี้ได้ ไม่เฉพาะ TCDC – เคยเจอร้านกาแฟบางร้านก็ใช้)

มั่นใจว่าไม่ได้เจอปัญหานี้อยู่คนเดียว เพราะระหว่างที่นั่งทำงานอยู่ที่นั่นตั้งแต่ประมาณ 12:40 จนถึงราว 17:00 ได้ยินโต๊ะรอบๆ ถามกันเป็นระยะถึงเรื่องต่อไวไฟ กดตรงไหน ทำไมต่อไม่ได้

บางส่วนอาจจะเกี่ยวกับ UI (เช่น พอ CSS ไม่โหลด ตำแหน่งของแบบฟอร์มที่จะต้องกรอกก็สับสน) แต่ยังมีส่วน UX ด้วย ที่ประสบการณ์ตั้งแต่ต้นจนจบกว่าจะต่อเน็ตได้มีอุปสรรคพอสมควร ซึ่งถ้ายังยืนยันจะใช้ Facebook Wi-Fi อยู่ คงต้องหาทางไปตั้งค่าให้ถูกต้องและรองรับผู้ใช้ที่มีความต้องการหรือข้อจำกัดแตกต่างกันไป

นี่คือเครือข่ายไวไฟที่พบที่บริเวณห้องสมุดชั้น 5 ของ TCDC (จับภาพหน้าจอมาเมื่อ 19 พ.ค. 2560 ประมาณ 14:30)

TCDC wifi list

Guest@TCDC เป็นเครือข่ายสำหรับผู้ใช้ทั่วไป ส่วน Member@TCDC นั้นสำหรับสมาชิก (บุคคลทั่วไป 1,200 บาท/ปี นักศึกษา 600 บาท/ปี) เนื่องจากเรายังไม่ได้เป็นสมาชิก ก็ลองเลือก Guest@TCDC

ซึ่งก็เหมือนกับการเข้าใช้เครือข่ายไวไฟสาธารณะทั่วไป ที่เราคาดได้ว่าจะมีหน้าจอล็อกอินขึ้นมา ให้ใส่ชื่อหรือรหัสเพื่อเข้าใช้ ของ Guest@TCDC ก็จะเด้งหน้าจอนั้นขึ้นมา เพียงแต่มันจะแสดงคำเตือนนี้มาคั่นก่อน

Cannot verify identity of the log in page

ซึ่งหมายความว่า เว็บเบราว์เซอร์ของเรา ไม่สามารถตรวจสอบได้ว่า หน้าเว็บสำหรับการล็อกอินซึ่งอ้างว่าอยู่ที่หมายเลขไอพี 172.16.170.13 นั้น อยู่ที่หมายเลขไอพีดังกล่าวจริงๆ หรือไม่ เนื่องจากใบรับรอง (certificate) ที่เว็บเบราว์เซอร์ได้รับจากหน้าจอล็อกอิน เป็นใบรับรองที่ไม่ได้รับความน่าเชื่อถือ

ถ้ากด “Show Certificate” เพื่อดูรายละเอียดก็จะพบว่า เป็นใบรับรองที่ออกโดย Root Certificate Authority (Root CA – หน่วยงานออกใบรับรองระดับบนสุด) ที่ชื่อว่า cmx.cisco.com และจะหมดอายุวันที่ 12 ตุลาคม 2560 เวลา 01:59:08 (UTC+7) แต่เว็บเบราว์เซอร์ของเรา ไม่เชื่อถือ Root CA รายนี้ มันก็เลยขึ้นคำเตือน

เครือข่ายไวไฟ Member@TCDC ก็พบปัญหาเดียวกัน

ถ้าอยากจะใช้งานเครือข่ายไวไฟ ก็จำเป็นต้องไปให้ถึงหน้าล็อกอินให้ได้ จะไปให้ถึงหน้าล็อกอิน ก็ต้องยอมกด “Continue” ไป ทั้งๆ เราไม่แน่ใจว่ามันปลอดภัยหรือไม่ หรือจะเกิดอะไรขึ้นหลังจากนี้

พอกด Continue ไปแล้ว จะเจอหน้าจอให้ “เช็กอินบน Facebook เพื่อรับการเข้าถึงอินเทอร์เน็ตฟรี”

แต่หน้าจอเช็กอิน/ล็อกอินนี้ จะสับขาหลอกนิดหน่อย เพราะช่องล็อกอินที่เราเห็นเด่นๆ มันไม่ใช่อันที่จะต้องใช้ เราต้องเลื่อนหน้าลงไปอีก ถึงจะเจอฟอร์มที่ใช่ (ปัญหาอาจจะมาจากการที่ CSS ไม่ยอมโหลดด้วย – แต่ลองทั้งมือถือและเดสก์ท็อปก็เป็นเหมือนกัน)

เลื่อนหน้าจอล็อกอินลงมาหน่อย จะเจอคำว่า “หากต้องการเช็กอิน ให้สมัครใช้งาน Facebook วันนี้ หรือคลิกที่ลิงก์ ‘ข้ามการเช็กอิน’ ข้างล่างนี้” ให้มองหาลิงก์ “เข้าสู่ระบบ” (มันจะอยู่ติดกับลิงก์ “สมัครใช้งาน” เลย วรรคก็ไม่ยอมเว้น) พอคลิกที่ลิงก์ “เข้าสู่ระบบ” มันจะนำเราไปที่หน้าล็อกอินที่ถูกต้อง

(ลิงก์ “ข้ามการเช็กอิน” นั้นไม่สามารถคลิกได้ – ส่วนช่องที่เขียนว่า “ป้อนรหัส Wi-Fi” นั้นก็ใช้ไม่ได้ สอบถามเจ้าหน้าที่ TCDC แล้ว ไม่มีการออกรหัสให้ใช้กับช่องนี้)

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

ถ้ามาถึงหน้าจอนี้ หมายถึงใกล้สำเร็จแล้ว แต่เราจะเจอปัญหากับใบรับรองเหมือนกับที่เราเจอไปแล้วทีหนึ่ง ตรงนี้เว็บเบราว์เซอร์จะแจ้งว่ามันไม่สามารถยืนยันได้ว่าหน้าจอนี้ที่อ้างว่ามาจากหมายเลขไอพี 1.1.1.1 นั้นเป็นอย่างที่อ้างจริงๆ ถ้าเราเชื่อใจ อยากไปต่อ ก็ให้กด “Continue” อีกทีหนึ่ง

บนมือถือ (iOS) จะเป็นแบบนี้

Canno Verify Server Identity "1.1.1.1"

ถ้ากด “Continue” ก็จะมีหน้าจอให้เช็กอิน ประกาศให้โลกรู้ว่าเรามาอยู่ที่ TCDC แล้วนะ พอเราเช็กอินเสร็จ ก็จะใช้อินเทอร์เน็ตได้แล้ว

สรุป

พบว่าการเข้าใช้เครือข่ายไวไฟ Guest@TCDC นั้นเป็นประสบการณ์ที่ยากลำบากมาก โดยปัญหาที่พบคือ

ข้อเสนอแนะ

ใครมีโอกาสก็มาลองใช้งานดูครับ TCDC ใหม่ ทางเข้าห้องสมุดอยู่ชั้น 5 หลังจากนี้ถ้าไม่ใช่สมาชิก ก็ใช้บริการได้ โดยจ่ายค่าบริการรายวัน 100 บาท/วัน มีโต๊ะทำงาน มีปลั๊กไฟ มีไวไฟ (ถ้าเข้าได้) ถูกกว่าไปนั่งร้านกาแฟอีก (ถ้าไม่รวมค่ารถ :p) นอกจากนี้ยังมีส่วนนิทรรศการ Maker Space และส่วนอื่นๆ อีก

อ้อ นอกจากที่กรุงเทพ ที่เชียงใหม่ก็มี TCDC นะ และที่ขอนแก่นก็กำลังจะเปิด (ตอนนี้มี mini TCDC อยู่ในมหาวิทยาลัยขอนแก่นอยู่แล้ว)

โดย bact ณ 19 May 2017 09:47 +0700

12 May 2017

bact

OTT (Over the Top) คืออะไร?

“Over the Top” หรือ OTT เป็นศัพท์ในวงการโทรคมนาคมและกระจายภาพและเสียง มีความหมายโดยทั่วไปถึงเนื้อหาหรือบริการที่ถูกส่งผ่านโครงข่ายที่ไม่ได้ถูกออกแบบมาให้ทำสิ่งดังกล่าวตั้งแต่ต้น ด้วยเหตุนี้ OTT จึงถูกเรียกในภาษาทั่วไปว่า “value added” ซึ่งหมายถึงเนื้อหาหรือบริการที่สร้าง “มูลค่าเพิ่ม” จากเนื้อหรือบริการพื้นฐานที่โครงข่ายถูกออกแบบมาแต่แรก

เรื่อง OTT จะเห็นบ่อยขึ้นช่วงนี้ตามสื่อ เนื่องจากกสทช.มีแนวคิดจะเข้ามากำกับบริการมูลค่าเพิ่มเหล่านี้ โดยยกประเด็น เช่น การจัดเก็บภาษี การกำกับเนื้อหา และการแข่งขัน “ที่เป็นธรรม” (ระหว่างผู้ประกอบกิจการที่ต้องมีใบอนุญาตและไม่ต้องมีใบอนุญาต)

ตัวอย่างของ OTT

ตัวอย่างหนึ่งของ OTT คือ “เนื้อหา OTT” (Over-the-top content) ซึ่งในบริบทของกิจการกระจายภาพและเสียง หมายถึงภาพ เสียง หรือสื่ออื่นใด ที่ส่งผ่านโครงข่ายอื่นใดที่มิใช่โครงข่ายกระจายภาพและเสียง เช่น บริการภาพยนตร์ผ่านโครงข่ายอินเทอร์เน็ต

อีกตัวอย่างหนึ่งคือ “Telco-OTT” ซึ่งหมายถึงการให้บริการโทรคมนาคมของผู้ให้บริการรายหนึ่งผ่านโครงข่ายของผู้ให้บริการโทรคมนาคมรายอื่นหรือชนิดอื่น เช่น การให้บริการโทรศัพท์ด้วยเสียงผ่านโครงข่ายไวไฟอินเทอร์เน็ตสาธารณะ

นอกจากนี้การให้บริการอย่างการจ่ายเงินชำระเงินผ่านอินเทอร์เน็ต ซื้อสินค้าบริการผ่านอินเทอร์เน็ต ก็ถูกนับเป็น OTT เช่นกัน

วิธีแบ่งประเภทมีหลายแบบ

เนื่องจาก OTT เป็นการผสานเนื้อหา บริการ และโครงข่ายหลายชนิดเข้าด้วยกัน การแบ่งประเภทของ OTT จึงสามารถแบ่งได้หลายวิธีเพื่อความสะดวกในการพิจารณาประเด็นหนึ่งๆ เช่น

การแบ่ง OTT ตามประเด็นในการกำกับกิจการนั้น เช่นที่ Body of European Regulators for Electronic Communications (BEREC) ซึ่งเป็นองค์การกลางของหน่วยงานกำกับกิจการสื่อสารอิเล็กทรอนิกส์ของสหภาพยุโรป แบ่งบริการ OTT เป็น 3 ประเภทคือ

  1. บริการ OTT ที่ถือเป็น “บริการสื่อสารอิเล็กทรอนิกส์” (electronic communications service – ECS)
  2. บริการ OTT ที่ไม่ถือเป็น ECS แต่มีศักยภาพจะแข่งขันกับ ECS และ
  3. บริการ OTT อื่นๆ

สาเหตุที่ BEREC แบ่งประเภทเช่นนี้ เพราะคำว่า OTT นั้นไม่มีสถานะทางกฎหมายในระดับสหภาพยุโรป และกิจการที่ BEREC กำกับได้ตามกฎหมายนั้นมีเพียงบริการสื่อสารอิเล็กทรอนิกส์ (ECS) เท่านั้น การแบ่งตามสถานะทางกฎหมายที่ BEREC อาจเข้าไปกำกับได้ จึงเป็นการแบ่งขั้นต้นที่สะดวกสำหรับการทำงาน

ดูเพิ่ม

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

Over the Top (1987)

 

โดย bact ณ 12 May 2017 11:48 +0700

8 May 2017

bact

จะเป็นกสทช.ของไทยต้องวัยวุฒิเพียบพร้อม ว่าที่ประธานาธิบดีฝรั่งเศสยังเป็นไม่ได้เลย

“อายุ 39 มีปุ่มนิวเคลียร์ในมือ แต่เป็น กสทช. ไม่ได้นะครับ”
— มิตรสหายท่านหนึ่ง

มาตรา 7 พ.ร.บ.กสทช.ฉบับแก้ไขใหม่ (2560)
ตามพ.ร.บ.กสทช.ฉบับใหม่ ว่าที่ประธานาธิบดีฝรั่งเศสที่เพิ่งได้รับเลือกไปเมื่อวันอาทิตย์ที่ผ่านมา เป็นกรรมการกสทช.ไม่ได้นะครับ

อายุไม่ถึงน่ะ (แน่นอนว่าไม่มีสัญชาติไทยด้วย)

พ.ร.บ.กสทช.ฉบับใหม่ ที่สนช.ผ่านไปเงียบๆ เมื่อ 31 มี.ค. 2560 ขยับอายุขั้นต่ำของกรรมการจาก 35 ปี เป็น 40 ปี (ร่างที่เสนอแก้ไขตอนแรก เสนอไปถึง 45 ปีด้วยซ้ำ)

เอ็มมานูเอล มาครง นี่ 39 ปี (เกิด 2520) วัยวุฒิไม่ถึงครับ

เหมือนกับ ออเดรย์ ถัง รัฐมนตรีดิจิทัลของไต้หวัน ที่ตอนเข้ารับตำแหน่งนี่ 35 ปี (เกิด 2524) แต่ก็วัยวุฒิไม่พอสำหรับประเทศไทยอยู่ดี แล้วอย่าไปพูดถึงตามาร์ก เฟซบุ๊ก ขานั้น 32 ปี (เกิด 2527) ประสบการณ์ไม่ถึงแน่ๆ

#สังคมสูงวัย #ประสบการณ์สูงวิสัยทัศน์ไกล #วางยุทธศาสตร์ประเทศกันถึงสัมปรายภพเลย

ดู ตารางเปรียบเทียบอายุของกรรมการชุดต่างๆ ของไทย

โดย bact ณ 8 May 2017 06:39 +0700

30 April 2017

bact

โลกไม่ได้เป็นศูนย์กลาง วงโคจรไม่ได้เป็นวงกลม และ “วิทยาศาสตร์แย่ๆ” แบบ epicycle

วันก่อนโพสต์ในเฟซ เรื่องการพูดว่าโลกกลมเคยเป็นความผิด (ในเซนส์ว่าอะไรที่เราคิดว่าผิดหรือผิดกฎหมายตอนนี้ มันอาจจะได้รับการพิสูจน์ว่าถูกในวันหน้าก็ได้)

มิตรสหายสองสามท่านเลยมาทักว่า เฮ้ย อารยธรรมมนุษย์เรารู้ว่าโลกกลม (จากการสังเกตธรรมชาติ) มาอย่างน้อยตั้งแต่สมัยกรีกแล้ววววว (แม้ความรู้นี้จะไม่ได้แพร่กระจายอย่างสม่ำเสมอและมีช่วงหายๆ ไปบ้างในยุคกลางในพื้นที่หลุมดำของอารยธรรมตะวันตกอย่างสเปน) ไอ้ที่เป็นความผิด แล้วศาสนจักรจะเล่นงานน่ะ เป็นเรื่อง ดวงอาทิตย์เป็นศูนย์กลาง (heliocentric) ต่างหาก (เพราะมันไปขัดกับการตีความข้อความในไบเบิลที่เขียนว่าโลกนั้นไม่เคลื่อนที่)

ว่าง่ายๆ ว่าผมพูดผิดน่ะแหละ ซึ่งก็ผิดจริงๆ -/\-

เลยไปค้นดูหน่อย ก็พบว่า ทฤษฎีที่ว่าดวงอาทิตย์เป็นศูนย์กลางของระบบดวงดาวบนท้องฟ้านี่ จริงๆ ก็ถูกเสนอมาตั้งแต่สมัยกรีกเหมือนกัน แต่ก็หายๆ ไป จนกระทั่งคริสต์ศตวรรษที่ 16 ที่โคเปอร์นิคัสมาเสนอโมเดลคณิตศาสตร์ ว่ามันทำงานยังไง (บนฐานของข้อมูลที่สังเกตได้จากหอดูดาวในเวียนนา คือช่วงนี้วงการดารา-โหราศาสตร์มันเริ่มก้าวหน้าละ มีเครื่องมือให้สังเกตได้มากขึ้น)

ความสำคัญของโมเดลคณิตศาสตร์ที่โคเปอร์นิคัสคิดขึ้นมาก็คือ มันทำให้ ทฤษฎีดวงอาทิตย์เป็นศูนย์กลาง ไม่ได้เป็นเพียง “การพินิจพิเคราะห์ทางปรัชญา” (philosophical speculation) อีกต่อไป แต่กลายสถานะเป็น “ดาราศาสตร์ที่ใช้เรขาคณิตและมีพลังในเชิงพยากรณ์” (predictive geometrical astronomy)

เอาจริงๆ โมเดลของโคเปอร์นิคัสก็ไม่ได้ทำนายการโคจรของดวงดาวได้แม่นยำกว่าโมเดลของระบบที่มีโลกเป็นศูนย์กลางของปโตเลมี ในเชิงพยากรณ์ทั้งสองโมเดลนั้นมีพลังพอๆ กัน เพียงแต่โมเดลของโคเปอร์นิคัสนั้น “เรียบง่ายกว่า” และ “ทั่วไปกว่า”

ในเรื่องความ “เรียบง่ายกว่า” นี้ ต้องอธิบายถึงสิ่งที่เรียกว่า “epicycle” ก่อน

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

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

วิธีหนึ่งที่นักดารา-โหราศาสตร์สมัยก่อนพยายามแก้ปัญหานี้ ก็คือการเสนอว่า จริงๆ จุดศูนย์กลางของวงโคจรที่ดาวต่างๆ หมุนรอบโลกน่ะ มันไม่ได้อยู่ที่โลกเป๊ะๆ หรอก แต่อยู่ห่างจากโลกไปนิดหนึ่ง เรียกจุดนี้ว่าจุด eccentric (ภาษาไทยเหมือนจะใช้คำว่า “จุดเยื้องศูนย์”)

แต่จุดเยื้องศูนย์มันก็ดูจะใช้ได้ดีเฉพาะกับการโคจรของดวงอาทิตย์รอบโลกเท่านั้น แต่ยังอธิบายข้อมูลความเร็วการโคจรของดาวเคราะห์อื่นๆ ไม่ได้

ก็เลยมีการเสนอแนวคิดเรื่อง “epicycle” ขึ้นมา เพื่อทำให้การโคจรเป็นวงกลมในโมเดลมันอธิบายได้ว่า ทำไมความเร็วในการโคจรของดวงดาวต่างๆ ที่สังเกตได้จากโลก จึงไม่คงที่ เดี๋ยวเคลื่อนเร็ว เดี๋ยวเคลื่อนช้า

คนเสนอแนวคิด epicycle นี้ คือฮิปปาร์คัส ซึ่งเขาก็เป็นคนประมาณค่าระยะห่างระหว่างจุด eccentric กับจุดศูนย์กลางโลกไว้ด้วย ที่ 1/24 ของรัศมีวงโคจรของดวงอาทิตย์รอบโลก

epicycle เป็นวงโคจรวงกลมเล็ก ที่อยู่บนวงโคจรหลักที่เป็นวงกลมใหญ่ (deferent) ที่ดวงดาวจะหมุนรอบอีกที (นึกถึงไม้บรรทัดที่มีวงๆ ให้เอาดินสอไปจิ้มหมุนๆ น่ะครับ ตอนเด็กๆ ใครเคยเล่นมั่ง)

แต่ epicycle เองเพียงลำพัง ก็อธิบายได้เพียงความเร็วที่ดวงอาทิตย์หมุนรอบโลก แต่อธิบายไม่ได้อยู่ดีถึงความเร็วของดาวเคราะห์ที่หมุนรอบโลกช้าเร็วไม่เท่ากันในแต่ละช่วงของวงโคจร

ปโตเลมีเป็นผู้แก้ปัญหานี้ ด้วยการเสนอสิ่งที่เรียกว่า “equant” ซึ่งเป็นจุดที่อยู่อีกฝั่งหนึ่งของจุด eccentric อยู่ตรงข้ามกับจุดศูนย์กลางโลก และห่างจากจุด eccentric เท่ากับจุดศูนย์กลางโลก

ในโมเดลของปโตเลมี ดาวเคราะห์หนึ่งๆ จะอยู่ห่างจากจุด eccentric เท่าๆ กันเสมอไม่ว่าเวลาใด และจะมีความเร็วมุมเมื่อวัดจากจุด equant เท่าๆ กันเสมอไม่ว่าเวลาใด ในแง่นี้ปโตเลมีจึงถือว่าโมเดลยังมีความ uniform

<figure class="wp-caption aligncenter" id="attachment_3532" style="width: 1600px">Eccentrics, Deferents, Epicycles, and Equants<figcaption class="wp-caption-text">โลก, จุด eccentric, จุด equant, และวงโคจร deferent กับ epicycle ของดาวเคราะห์</figcaption></figure>

ปัญหาของ epicycle ก็คือ ยิ่งเราต้องการปรับให้โมเดลมันเข้าใกล้ข้อมูลที่สังเกตได้มากเพียงใด ก็จำเป็นต้องเพิ่ม epicycle เข้าไปในโมเดลมากขึ้นๆ จนคำนวณได้ยากมาก

การเอาศูนย์กลางของโมเดลไปเป็นดวงอาทิตย์แทนโลก ทำให้โคเปอร์นิคัสสามารถลด epicycle ลงไปได้จำนวนหนึ่ง ทำให้โมเดลของโคเปอร์นิคัสมีความ “เรียบง่ายขึ้น” เมื่อเทียบกับโมเดลของปโตเลมี (ไม่ต้องยุ่งกับ equant แล้ว)

 

<figure class="wp-caption aligncenter" id="attachment_3536" style="width: 899px">ระบบแบบปโตเลมี<figcaption class="wp-caption-text">ระบบแบบปโตเลมี ที่มีโลกเป็นศูนย์กลาง วงกลมสีฟ้าคือ epicycle</figcaption></figure> <figure class="wp-caption aligncenter" id="attachment_3537" style="width: 864px">ระบบแบบโคเปอร์นิคัส<figcaption class="wp-caption-text">ระบบแบบโคเปอร์นิคัส ที่มีดวงอาทิตย์เป็นศูนย์กลาง วงกลมสีฟ้าคือ epicycle</figcaption></figure>

 

อย่างไรก็ตาม การที่โคเปอร์นิคัสตัดจุด equant ออกจากโมเดล ด้วยการแทนที่มันด้วย epicycle อีกชุด ก็ทำให้จำนวน epicycle ในโมเดลทั้งสองแบบ ทำไปทำมามีพอๆ กัน (โคเปอร์นิคัสมองว่าการมีจุด equant นั้นไม่สมเหตุสมผลกับแนวความคิดที่ว่าสวรรค์นั้นมีความสมบูรณ์ตามคติแบบอริสโตเติล)

นักดารา-โหราศาสตร์ในสมัยนั้นที่ใช้โมเดลดวงอาทิตย์เป็นศูนย์กลางตามโคเปอร์นิคัส บางส่วนก็เลยยังใช้จุด equant แบบปโตเลมีอยู่ เพราะมันคำนวณง่ายกว่า

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

ระบบดวงอาทิตย์เป็นศูนย์กลางมาได้รับการยอมรับและความนิยมมากกว่าระบบโลกเป็นศูนย์กลางจริงๆ ก็หลังจากที่ โยฮันเนส เคปเลอร์ ได้ปลดล็อกเรื่องความเร็วที่ไม่คงที่ในการโคจร ด้วยการเสนอว่า เฮ้ย ดาวมันไม่ได้โคจรเป็นวงกลม มันโคจรเป็นวงรีต่างหาก พอคิดได้ดังนี้ epicycle กับ equant ก็ไม่จำเป็นอีกต่อไปแล้ว ทำให้การคำนวณพยากรณ์ตำแหน่งดวงดาวซับน้อยลงและแม่นยำขึ้นกว่าเดิมมาก

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

<figure class="wp-caption aligncenter" id="attachment_3534" style="width: 2100px">กฎการเคลื่อนที่ของดาวเคราะห์<figcaption class="wp-caption-text">วงโคจรที่เป็นวงรีของดาวเคราะห์สองดวง</figcaption></figure>

กฎการเคลื่อนที่ของดาวเคราะห์ของเคปเลอร์ (Kepler’s laws of planetary motion) นี้ เป็นพื้นฐานของกฎความโน้มถ่วงสากลของนิวตัน (Newton’s law of universal gravitation) ในเวลาต่อมา

ทุกวันนี้ คำว่า “epicycle” เป็นสแลง หมายถึงการพยายามจะแก้ปัญหาอะไรสักอย่างด้วยการเพิ่มสิ่งที่เป็นปัญหาเข้าไปอีก หรือในบริบททางวิทยาศาสตร์จะหมายถึงการไปบิดไปปรับทฤษฎีให้มันเข้ากับข้อมูลที่มี

นอร์วูด แฮนสัน พิสูจน์ให้เห็นในบทความ The Mathematical Power of Epicyclical Astronomy (1960) [JSTOR] ว่า วงโคจรแบบ epicycle บน deferent นี่สามารถวาดรูปอะไรก็ได้ ขอให้เส้นมันต่อเนื่องและวนซ้ำ (ลองกดดูคลิปข้างล่าง แล้วจะทึ่ง)

<figure class="wp-caption aligncenter" id="attachment_3538" style="width: 843px">The Mathematical Power of Epicyclical Astronomy<figcaption class="wp-caption-text">ภาพจากบทความ The Mathematical Power of Epicyclical Astronomy ของ Norwood Russell Hanson (1960)</figcaption></figure>
<iframe allowfullscreen="true" class="youtube-player" height="402" src="https://www.youtube.com/embed/QVuU2YCwHjw?version=3&amp;rel=1&amp;fs=1&amp;autohide=2&amp;showsearch=0&amp;showinfo=1&amp;iv_load_policy=1&amp;wmode=transparent" style="border:0;" type="text/html" width="660"></iframe>

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

—-
ข้อมูลส่วนใหญ่จาก Eccentrics, Deferents, Epicycles, and Equants และวิกิพีเดีย

(โพสต์ครั้งแรกในเฟซบุ๊ก)

โดย bact ณ 30 April 2017 09:25 +0700

23 April 2017

LookHin

สร้างจาร์วิสแบบ ง่ายๆ โง่ๆ ด้วย Raspberry Pi + Snowboy

ฝันไว้ว่าอยากทำระบบที่สามารถคุยตอบโต้กับคอมพิวเตอร์แบบจาร์วิสใน IRON MAN มานานแล้วครับ แต่ก็ได้แค่ฝันเพราะผมเองก็ไม่มีความสามารถที่จะทำได้ขนาดนั้น แต่เราก็ยังพอจะสร้างจาร์วิสแบบโง่ๆ ด้วยงบประมาณไม่มากขึ้นมาจาก Raspberry Pi ได้เช่นกันครับ โดยสิ่งที่เราต้องมีก็คือ Raspberry Pi + ลำโพง + ไมโครโฟน โดยเราจะใช้โปรแกรมที่ชื่อว่า Snowboy Hotword Detection ข้อดีของเจ้าตัวนี้ก็คือว่ามันฟรีสำหรับ hacker อย่างเรา และสามารถสร้างโมเดลของคำที่ต้องการได้ไม่ยาก ซึ่งเจ้า Snowboy เนี้ยก็มี library ให้ใช้ได้อยู่หลายภาษาตามแต่ถนัดเลยครับ แต่ภาษาที่เราจะใช้เขียนวันนี้จะใช้เป็น Node.js

อย่างแรกเลย เตรียมอุปกรณ์ต่างๆ ให้เรียบร้อย Raspberry Pi + ลำโพง + ไมโครโฟน

Raspberry Pi, Snowboy, Jarvis

ก่อนลงมือทำอย่างอื่นให้ทำการอัพเดทระบบก่อนครับ

sudo apt-get update
sudo apt-get upgrade

จากนั้นทำการติดตั้ง Node.js และติดตั้ง developer tools ต่างๆ ให้พร้อมใช้งาน

curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
sudo apt-get install nodejs
sudo apt-get install sox libmagic-dev libatlas-base-dev
sudo apt-get install build-essential

กำหนด NODE_PATH เพื่อให้เรียกใช้งานโมดูลของ Node.js ที่ติดตั้งแบบ global ได้ เพราะเดียวเราจะติดตั้งโมดูทั้งหมดเป็นแบบ global

export NODE_PATH=/usr/lib/node_modules

เมื่อติดตั้งเสร็จแล้ว ลองเช็คดูก่อนว่าสามารถเรียกใช้คำสั่ง node และ npm ได้ปกติแล้ว ง่ายๆ ก็ลองสั่งให้แสดง version ขึ้นมาดูก่อนเลย

node -v
npm -v

Raspberry Pi, Snowboy, Jarvis

ขั้นตอนถัดไปให้ทำการคอนฟิกและทดสอบลำโพงกับไมโครโฟน แต่ก่อนอื่นเราต้องทราบก่อนว่าทั้งลำโพงและไมโครโฟนมันต่ออยู่ที่ card id และ device id อะไร เพราะเดียวเราต้องใช้ทั้ง card id และ device id ตัวนี้ในการคอนฟิกในขั้นตอนถัดไป

ตรวจสอบหมายเลข card id และ device id ของลำโพง

aplay -l

จากรูปจะเห็นว่ามี card อยู่หลายใบ ให้สั่งเกตุหมายเลข card id และ device id ที่ผมไฮไลท์เอาไว้ด้วยนะครับ ให้เลือกใช้ card id และ device id อันที่ลำโพงเราต่ออยู่ (ข้างหลังมันมีชื่อรุ่นบอก น่าจะพอเดาได้อยู่)

Raspberry Pi, Snowboy, Jarvis

ตรวจสอบหมายเลข card id และ device id ของไมโครโฟน

arecord -l

Raspberry Pi, Snowboy, Jarvis

ทำการสร้างไฟล์ ~/.asoundrc เพื่อกำหนดค่า default ของลำโพงและไมโครโฟนให้ระบบ

nano ~/.asoundrc

โดยให้พิมพ์คำสั่งตามนี้ลงไป จะเห็นว่าในช่องของ playback.pcm ซึ่งก็คือลำโพงของเรา ให้เราใส่ hw:1,0 ซึ่งเป็นหมายเลข card id , device id ในที่นี้ก็คือ card 1, device 0 และสำหรับ capture.pcm ซึ่งเป็นไมโครโฟน ให้เราใส่เป็น hw:1,0 ซึ่งก็คือไมโครโฟนจาก card 1, device 0 (ถ้าหาก card id และ device id ของท่านแตกต่างจากนี้ก็ให้ใส่ให้ตรงกับของตัวเองด้วยนะครับ)

pcm.!default {
  type asym
   playback.pcm {
     type plug
     slave.pcm "hw:1,0"
   }
   capture.pcm {
     type plug
     slave.pcm "hw:1,0"
   }
}

Raspberry Pi, Snowboy, Jarvis

เราสามารถปรับความดังของลำโพงและไมโครโฟนได้โดยใช้คำสั่ง alsamixer (ถ้าท่านใช้ตัวแปลง USB To Sound Adapter เพื่อทำการแปลงสาย USB เป็น 3.5mm เพื่อใช้เสียบลำโพงกับไมโครโฟนแบบผม ก็ให้กด F6 เพื่อเลือก device ก่อนนะครับ)

alsamixer

Raspberry Pi, Snowboy, Jarvis

ทำการทดสอบการบันทึกเสียงจากไมโครโฟน ให้สั่ง rec test.wav และพูดใส่ไมโครโฟนและถ้าต้องการหยุดให้กด CTRL+C

rec test.wav

Raspberry Pi, Snowboy, Jarvis

ลองสั่ง play เสียงที่เราบันทึกไว้เมื่อสักครู่นี้

aplay test.wav

Raspberry Pi, Snowboy, Jarvis

ขั้นตอนถัดไปให้ทำการติดตั้ง snowboy และโมดูลต่างๆ ที่ต้องใช้งาน โดยเราจะติดตั้งทั้งหมดเป็นแบบ global ไปเลยนะครับ

sudo npm install -S -g snowboy
sudo npm install -S -g node-record-lpcm16
sudo npm install -S -g play-sound

ต่อไปเป็นการสร้างโมเดลเสียงของคำที่ต้องการ โดยให้เข้าไปที่ https://snowboy.kitt.ai/dashboard จะเห็นปุ่ม Create Hotword คลิกเลยครับ

Raspberry Pi, Snowboy, Jarvis

ทำการตั้งชื่อและเลือกภาษาให้เรียบร้อย แต่ระบบยังไม่มีภาษาไทยให้เลือกนะ ให้เราเลือกเป็น Other ไปก่อนนะ ผมลองแล้วก็ได้เหมือนกัน

Raspberry Pi, Snowboy, Jarvis

ขั้นตอนถัดไปเป็นการบันทึกเสียง ให้เราบันทึกเสียงของคำที่เราต้องการลงไป 3 ครั้ง

Raspberry Pi, Snowboy, Jarvis

ขั้นตอนสุดท้ายเป็นการทดสอบและดาวน์โหลดโมเดลเสียงของเรา โดยเราจะได้มาเป็นไฟล์ .pmdl ดาวน์โหลดมาเก็บไว้ให้เรียบร้อยครับ

Raspberry Pi, Snowboy, Jarvis

หลังจากติดตั้งโปรแกรมและสร้างไฟล์โมเดลของเสียงเรียบร้อยแล้วให้ทำการดาวน์โหลดโค้ดที่ผมเตรียมไว้ไปทดสอบรันได้เลยครับ Download Showboy Example โดยในโค้ดตัวอย่างจะมีไฟล์ snowboy.js ให้ทำการเปิดโค้ดขึ้นมาดูก่อนเลยครับ จะเห็นว่าในตัวอย่างผมมีโมเดลของคำสั่งเสียงอยู่ 2 ตัวคือ thai-hello.pmdl และ thai-what-is-your-name.pmdl ให้เอาโมเดลเสียงของตัวเองมาแทน 2 ไฟล์นี้นะครับ

snowboy.js

const record = require('node-record-lpcm16');
const Detector = require('snowboy').Detector;
const Models = require('snowboy').Models;
const player = require('play-sound')(opts = {})


const models = new Models();

models.add({
    file: 'thai-hello.pmdl',
    sensitivity: '0.5',
    hotwords: 'Hello'
});

models.add({
    file: 'thai-what-is-your-name.pmdl',
    sensitivity: '0.5',
    hotwords: 'What\'s your name'
});

const detector = new Detector({
    resource: "common.res",
    models: models,
    audioGain: 2.0
});

detector.on('silence', function() {
    //console.log('silence');
});

detector.on('sound', function() {
    //console.log('sound');
});

detector.on('error', function() {
    //console.log('error');
});

detector.on('hotword', function(index, hotword) {
    console.log('Index='+index+', Hotword='+hotword);

    if(index == 1){
      player.play('sound-hello.wav', function(err){
        //console.log('play sound');
      });
    }else if(index == 2){
      player.play('sound-my-name.wav', function(err){
        //console.log('play sound');
      });
    }
});

const mic = record.start({
    threshold: 0,
    verbose: false
});

mic.pipe(detector);

เรียบร้อยแล้วครับ ให้สั่งรัน node snowboy.js และพูดคำสั่งที่เราตั้งไว้ได้เลยครับ

node snowboy.js

Raspberry Pi, Snowboy, Jarvis

หากติดขัดปัญหาใดค้นหาข้อมูลเพิ่มเติมจาก Google และอ่านรายละเอียดได้จากแหล่งอ้างอิงครับ

หมายเหตุ : ในไฟล์ตัวอย่างระบบจะบอกว่าตัวเองชื่ออาร์เรย์ พอดีเพิ่งมาคิดชื่อบทความได้ทีหลังว่าจะใช้จาร์วิส แต่ไม่อยากกลับไปแก้เลยทิ้งไว้อย่างนั้น

อ้างอิง :
https://snowboy.kitt.ai/
http://docs.kitt.ai/snowboy/
https://github.com/kitt-ai/snowboy
https://www.npmjs.com/package/snowboy

โดย LookHin ณ 23 April 2017 02:54 +0700

11 April 2017

Kitt

มหาสงกรานต์ ๒๕๖๐

สงกรานต์ปี 2560 เป็นปี จ.ศ. (2560 – 1181) = 1379 วันเถลิงศก ตรงกับ (1379 * 0.25875) + floor(1379 / 100 + 0.38) – floor(1379/ 4 + 0.5) – floor(1379 / 400 + 0.595) – 5.53375 = 356.81625 + 14 – 345 – 4 – 5.53375 = 16.2825 = วันที่ 16 เมษายน 2560 เวลา 06:46:48 วันสงกรานต์ ตรงกับ 16.02375 – 2.165 = … Continue reading มหาสงกรานต์ ๒๕๖๐

โดย kitty ณ 11 April 2017 05:55 +0700

bact

Visualizing power relations of actors (in Data Protection Bill)

วาดกราฟความสัมพันธ์ระหว่างผู้กระทำ (actor) ในกฎหมาย

This whole week I will participate in Internet Policy and Advocacy: Research Methods Workshop for South and Southeast Asia Actors at National Law University Delhi. (Nice way to spend my Songkran :p)

Shown at the bottom of this post is a presentation that I gave yesterday during the Case Study 1: The Power of Mapping Stakeholders, Decision Makers, and Implementers in Thailand’s Cyber Policy session, where we discussed examples of visualizing bills in graph (noun –verb-> noun), how this method can quickly reveal unbalanced power relations of actors(-to-be), and show why data protection mechanism in the current bill is probably structurally designed to fail.

Of course, the examples only rely on one type of source (written laws). Ideally, incorporating also data from other types of source (actual enforcement, unspoken rules, policy ethnographies, etc.) is encouraged, for a more complete picture.

Examples included Data Protection Committee relationships with National Cybersecurity Committee, Data blocking/removal mechanism from Article 20 of 2017 Computer-related Crime Act, media control after the 2014 Coup (NCPO Announcements and Orders), and the Ministry of ICT under NCPO structure.

Actor --Action-> Actor

<iframe allowfullscreen="allowfullscreen" height="541" mozallowfullscreen="mozallowfullscreen" src="https://www.slideshare.net/slideshow/embed_code/74817898" webkitallowfullscreen="webkitallowfullscreen" width="660"></iframe>

Draw.io is a nice online drawing tool that you may like to try. No installation is required. Graph can also be drawn in a descriptive way using tools like GraphvizGephi and NodeXL.

โดย bact ณ 11 April 2017 04:28 +0700

4 April 2017

bact

คุยกับกระทรวงดิจิทัลเรื่องร่างพ.ร.บ.คุ้มครองข้อมูลส่วนบุคคล

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

เรื่องที่คุยกัน เช่น

และมีอีกบางประเด็นที่ไม่ได้คุยระหว่างประชุม แต่กลับมาค้นเพิ่ม เช่นนิยาม “profiling” ของ GDPR และการพรางข้อมูล (data masking/data obfuscation)

เอกสารนี้รวมความคิดเห็นบางส่วนของผมที่ได้อภิปรายไปเมื่อวาน (4 เม.ย. 2560) และเขียนเพิ่มเติมเพื่อส่งให้กับทางกระทรวงเป็นเอกสารอีกครั้งในวันนี้ (5 เม.ย. 2560) การแบ่งหัวข้ออิงตามคำถามที่กระทรวงถามมา และเพิ่มบางประเด็นที่ผมเห็นว่าแม้ไม่ได้ถามก็ควรอธิบายประกอบไปด้วยเพราะสำคัญ เช่น การออกแบบโครงสร้างคณะกรรมการคุ้มครองข้อมูล ซึ่งผมมองว่าตามร่างปัจจุบันคณะกรรมการจะไม่เป็นอิสระและจะทำงานไม่ได้ดี

ข้อมูลประกอบการนำเสนอความเห็นและข้อเสนอแนะ แนวทางแก้ไขหรือปรับปรุง ร่างพระราชบัญญัติคุ้มครองข้อมูลส่วนบุคคล พ.ศ. …. PDF | OpenDocument Text

ใครมีความคิดเห็นอะไรกับตัวร่าง (ขณะนี้ใช้ร่างฉบับที่สำนักงานคณะกรรมการกฤษฎีกาตรวจพิจารณาแล้ว เรื่องเสร็จที่ 1135/2558ในการพิจารณา) ก็ส่งความคิดเห็นไปได้ที่ คณะทำงานร่างแก้ไขกฎหมาย กระทรวงดิจิทัลเพื่อเศรษฐกิจและสังคม — ทางคณะทำงานแจ้งว่าทางเขามีกำหนดส่งเรื่องออกไปภายในเดือนเมษายนนี้ ก็เหลือเวลาอีกไม่มากแล้วครับ

โดย bact ณ 4 April 2017 23:22 +0700

30 March 2017

LookHin

การสตรีมไฟล์วิดีโอไปยัง Facebook Live และ Youtube Live ด้วย FFmpeg

วันนี้มาทดลองทำการสตรีมไฟล์วิดีโอเพื่อถ่ายถอดสดไปยัง Facebook Live และ Youtube Live กันครับ โดยเราจะใช้ FFmpeg ในการสตรีม ไม่สอนการติดตั้งนะครับน่าจะพอทำเป็น โดยบน Facebook เราจะสตรีมทั้งจากหน้า profile และหน้า page ก่อนนี้เฟสบุคจะมี Publishing Tools ให้เฉพาะกับหน้า page เท่านั้น ถ้าจะสตรีมผ่านหน้า profile เราต้องเขียนโปรแกรมขึ้นมาเพื่อหาค่า Stream Key ซึ่งก็ไม่ได้ยากอะไร แต่ตอนนี้ไม่ต้องเขียนหละเฟสบุคเขาทำให้หมดแล้ว คลิกๆ ไม่กี่ทีก็ได้ Stream Key มาใช้แล้วครับ ส่วนของ Youtube ก็เช่นกัน คลิกๆ ไม่กี่ทีก็ได้ Stream key มาใช้สำหรับสตรีมเช่นกัน

1. การสตรีมวิดีโอไปยัง Facebook Live (Profile Account)
อันนี้เป็นการใช้แอคเค้าเฟสบุคธรรมดาของเรานี้หละครับ ซึ่งปกติเราก็กดถ่ายถอดสดจากมือถือหรือจากคอมพิวเตอร์ได้อยู่แล้ว แต่เดียวเราจะลองถ่ายถอดสดจากไฟล์หนังกันดูครับ เริ่มแรกให้เข้าไปที่ https://www.facebook.com/live/create/ และทำการคลิก Create Live Stream

FFMPEG FACEBOOK YOUTUBE LIVE

เลือก Share on your own Timeline และคลิก Next

FFMPEG FACEBOOK YOUTUBE LIVE

จากนั้นเราจะได้หน้าที่แสดง Server URL และ Stream Key ให้ copy ค่านี้เอาไว้ เดียวเราต้องใช้ในการสตรีม

FFMPEG FACEBOOK YOUTUBE LIVE

เมื่อได้ Stream Key มาแล้ว เราก็มาสั่งสตรีมจาก ffmpeg ได้เลยครับ โดยให้สั่ง

ffmpeg -re -i test.mp4 -acodec libfdk_aac -ac 1 -vcodec libx264 -f flv "rtmp://rtmp-api.facebook.com:80/rtmp/XXXXXXXXXXXXX?ds=1&s_l=1&a=ZZZZZZZZZZZZZZ"

FFMPEG FACEBOOK YOUTUBE LIVE

เรียบร้อยครับ กด Go Live ได้เลย

FFMPEG FACEBOOK YOUTUBE LIVE

2. การสตรีมวิดีโอไปยัง Facebook Live (Page Account)
อันนี้เป็นการใช้แฟนเพจแอคเค้าในการสตรีมนะครับ เพสบุคเขาเตรียมเครื่องมือเอาไว้ให้พร้อมแล้วเช่นกัน โดยเริ่มจากการเข้าไปในหน้าเพจของเราแล้วคลิกที่ Publishing Tools และเลือก Video Library ทางเมนูซ้ายมือ จากนั้นคลิกที่ปุ่ม + Live

FFMPEG FACEBOOK YOUTUBE LIVE

ได้ Stream Key มาแล้ว กด Next

FFMPEG FACEBOOK YOUTUBE LIVE

สั่งสตรีมด้วยคำสั่งต่อไปนี้ อย่าลืมแก้ Stream Key เป็นของตัวเองให้เรียบร้อยนะครับ

ffmpeg -re -i test.mp4 -acodec libfdk_aac -ac 1 -vcodec libx264 -f flv "rtmp://rtmp-api.facebook.com:80/rtmp/XXXXXXXXXX?ds=1&s_l=1&a=ZZZZZZZZZZ"

FFMPEG FACEBOOK YOUTUBE LIVE

กด Go Live เป็นอันเรียบร้อย

FFMPEG FACEBOOK YOUTUBE LIVE

3. การสตรีมวิดีโอไปยัง Youtube Live
อันสุดท้ายเป็นการสตรีมไปยัง Youtube Live ให้เข้าไปที่ https://www.youtube.com/live_dashboard ให้เลื่อนลงมาล้างสุดจะเห็นหัวข้อ ENCODER SETUP ให้ทำการกด Reveal ระบบจะแสดง Stream name/key โดยในส่วนของ Share คือ Link ที่ใช้สำหรับดูไลฟ์จริง ส่งตัวนี้ให้เพื่อนได้เลยครับ ส่วนพารามิเตอร์ตัวอื่นๆ อย่างเช่นการใส่ภาพ thumbnail ก็ลองไปซนดูกันต่อเองครับ

FFMPEG FACEBOOK YOUTUBE LIVE

จากนั้นนำ Stream name/key ที่ได้มาสั่งให้ FFmpeg สตรีมไปยัง Youtube Live โดยใช้คำสั่งต่อไปนี้

ffmpeg -re -i test.mp4 -acodec libfdk_aac -ac 1 -vcodec libx264 -f flv "rtmp://a.rtmp.youtube.com/live2/XXXX-XXXXX-XXXXX-XXXXX"

FFMPEG FACEBOOK YOUTUBE LIVE

เรียบร้อยไลฟ์ได้แล้วครับ สำหรับข้อมูลเพิ่มเติมดูได้จากอ้างอิงด้านล่างนะครับ

FFMPEG FACEBOOK YOUTUBE LIVE

เพิ่มเติม
หากต้องการสตรีมจากกล้อง webcam ที่ต่ออยู่กับ Raspberry Pi สามารถใช้คำสั่งได้ดังนี้

ffmpeg -f video4linux2 -s 426x240 -r 30 -b 2500k -i /dev/video0 -acodec libfdk_aac -ac 1 -vcodec libx264 -f flv "rtmp://rtmp-api.facebook.com:80/rtmp/XXXXXXXXXXXXX?ds=1&s_l=1&a=ZZZZZZZZZZZZZZ"

หรือสามามารถใช้คำสั่ง avconv ดังต่อไปนี้

avconv -f video4linux2 -s 426x240 -r 30 -b 2500k -i /dev/video0 -f flv "rtmp://rtmp-api.facebook.com:80/rtmp/XXXXXXXXXXXXX?ds=1&s_l=1&a=ZZZZZZZZZZZZZZ"

หรือหากต้องการสตรีมจาก RTSP อื่นๆ ไปยัง Facebook Live หรือ Youtube Live สามารถใช้คำสั่งได้ดังนี้

ตัวอย่างนี้จะสตรีมจาก RTSP อื่นไปยัง Facebook Live

ffmpeg -re -i "rtsp://192.168.1.108/rtsp/live" -acodec libfdk_aac -ac 1 -vcodec libx264 -f flv "rtmp://rtmp-api.facebook.com:80/rtmp/XXXXXXXXXXXXX?ds=1&s_l=1&a=ZZZZZZZZZZZZZZ"

อันนี้ใช้สำหรับสตรีมจากกล้อง CCTV ที่ติดในบ้านไปยัง Facebook สังเกตว่าต้องเราต้องเพิ่ม -i input-sound.mp3 เข้าไปด้วยเพื่อเพิ่มเสียงเข้าไป เพราะถ้าไม่มีเสียงส่งไปด้วย Facebook จะไม่ยอมไลฟ์ให้

ffmpeg -re -i "rtsp://user:password@192.168.1.108:554/cam/realmonitor?channel=1&subtype=1" -i input-sound.mp3 -acodec libfdk_aac -ac 1 -vcodec libx264 -f flv "rtmp://rtmp-api.facebook.com:80/rtmp/XXXXXXXXXXXXX?ds=1&s_l=1&a=ZZZZZZZZZZZZZZ"

อ้างอิง:
https://www.facebook.com/live/create/?step=landing
https://www.youtube.com/live_dashboard
https://ffmpeg.org/ffmpeg.html
https://www.facebook.com/facebookmedia/get-started/live

โดย LookHin ณ 30 March 2017 00:46 +0700

23 March 2017

bact

กฎหมายคุ้มครองข้อมูลไทย จะเดินตามโมเดลไหนดี: สหภาพยุโรป หรือ เอเปค?

เวลาคุยกันว่า ประเทศไทยควรจะเลือกเดินตามหลักการคุ้มครองข้อมูลส่วนบุคคลของ EU (สหภาพยุโรป) หรือ APEC (ความร่วมมือทางเศรษฐกิจเอเชีย-แปซิฟิก) ก็มักจะมีคำอธิบายว่า ของ EU นั้นเน้นเรื่องสิทธิมนุษยชน แต่ของ APEC มองเรื่องเศรษฐกิจนะ (แล้วโน้มน้าวโดยนัยว่า ไทยน่าจะมองเรื่องเศรษฐกิจก่อน ตอนนี้เศรษฐกิจแย่)

ผมก็เคยอธิบายแบบเร็วๆ อย่างนั้นเหมือนกันนะ คือในแง่ที่มามันก็น่าจะทำนองนั้น

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

เราไม่จำเป็นต้องเลือกอย่างใดอย่างหนึ่ง สิทธิมนุษยชนกับเศรษฐกิจทั้งสองอย่างนี้ไปด้วยกันได้ โดยเฉพาะเศรษฐกิจดิจิทัลที่มันต้องตั้งอยู่บนฐาน “ความไว้เนื้อเชื่อใจกัน”

ถ้าเอาเศรษฐกิจอย่างเดียวไม่สนสิทธิมนุษยชนเลย ลองดูอุตสาหกรรมอาหารทะเลสิ ตอนนี้เป็นยังไง พอจะโดนแบนจริงๆ ก็ต้องรีบมาทำให้มันได้มาตรฐานอยู่ดี ตลาดที่เสียไปแล้วบางส่วนก็เสียไปเลย

การมีมาตรฐานด้านสิทธิที่ดี ก็เพื่อให้คู่ค้าของเราไว้ใจเรา เชื่อใจเรา ว่าเราให้ความสำคัญกับคุณค่าที่เขาให้ความสำคัญ มันแยกกันไม่ขาด

….

อีกประเด็นคือ ของ EU ที่เราคุยกันเนี่ย อันนึงคือ General Data Protection Regulation (Regulation (EU) 2016/679) กับอีกอันคือ Directive (EU) 2016/680 ซึ่งทั้งคู่เพิ่งออกมาเมื่อปีที่แล้ว (2016 และจะมีผลบังคับใช้ในปี 2018)

ในขณะที่ APEC Privacy Framework ออกเมื่อปี 2005 (เริ่มร่างปี 2003 adopted ปี 2004 แต่ finalized ปี 2005)

ตอนปี 2005 นี่โลกเทคโนโลยีสารสนเทศเป็นอย่างไรบ้าง?

คือหยิบมือถือของเราขึ้นมาดูนี่ แทบไม่มีอะไรที่มีมาก่อนปี 2005 เลย หรือถ้ามีก็เปลี่ยนสภาพไปจนจำไม่ได้แล้ว พวกคอนเซปต์อย่าง cloud อะไรนี่ สมัยนั้นยังไม่มีการใช้อย่างแพร่หลายในทางการค้าเลย (เมื่อก่อนเรียกในชื่ออื่น เช่น utility computing)

ซึ่งพอเป็นแบบนี้ มันก็ลำบากอยู่เหมือนกัน ที่จะคาดหวังให้กรอบกฎหมายจากปี 2005 อย่าง APEC Privacy Framework มันจะมาเห็นประเด็นอะไรในปัจจุบันแบบละเอียดๆ คือสมัยนั้นมันยังไม่มี (เอาจริงๆ มันก็พอมี เช่น APEC Cross-border Privacy Enforcement Arrangement จากปี 2010 แต่เราไม่ยอมอ้างกัน ไปอ้างแต่ของเก่า)

ในขณะที่ตอนร่าง General Data Protection Regulation ของ EU มันก็มีกรณีศึกษาอะไรให้สรุปเป็นบทเรียนเยอะแล้ว โดยเฉพาะจากอุตสาหกรรมอินเทอร์เน็ตและการประมวลผลข้อมูลที่มันเปลี่ยนไปอย่างมากในทศวรรษที่ผ่านมา เขาเลยปรับปรุงออกมาแบบนี้

ถ้าไทยจะมีกฎหมายใหม่ ก็ควรคิดถึงอนาคตไหม ไม่ใช่เอาวิธีคิดจากเมื่อ 12 ปีที่แล้วมาใช้ ประกาศปุ๊บ ล้าสมัยทันที เสียเวลาไหม

 

ภาพประกอบ: Nokia 9300i จาก Nokia Museum

โดย bact ณ 23 March 2017 10:21 +0700

ออกแบบหน่วยงานคุ้มครองข้อมูลที่มีประสิทธิภาพ: บทเรียนจากสหภาพยุโรป

สรุปบางส่วนจากรายงานศึกษาเปรียบเทียบ Data Protection in the European Union: the role of National Data Protection Authorities (Strengthening the fundamental rights architecture in the EU II) ของ European Union Agency for Fundamental Rights [พ.ค. 2010]

วิธีปฏิบัติที่ดีที่สุด (best practices) สำหรับหน่วยงานคุ้มครองข้อมูล (Data Protection Authority) ว่าด้วยโครงสร้างขององค์กร, อำนาจ, ทรัพยากร, และความร่วมมือกับองค์กรอื่น

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

โครงสร้างและความเป็นอิสระของหน่วยงานคุ้มครองข้อมูล

อำนาจในการกำหนดระเบียบปฏิบัติของหน่วยงานคุ้มครองข้อมูล

ทรัพยากร

ความร่วมมือระหว่างหน่วยงาน

 

เรื่องที่เกี่ยวข้อง: ออกแบบอำนาจ: อ่านโครงสร้างคณะกรรมการในกฎหมายไทย

โดย bact ณ 23 March 2017 10:00 +0700

17 March 2017

LookHin

เขียนโปรแกรมอัพโหลดข้อมูลไปเก็บไว้ที่ Google Drive

พอดีผมทำ Google Drive API และเอาขึ้น Github เอาไว้ โดยสามารถดาวน์โหลดได้จาก Google Drive API บทความนี้จะเขียนอธิบายวิธีใช้นิดหน่อย จุดประสงค์ของการทำ API ชุดนี้ก็เพื่อจะทำโปรแกรมสำหรับอัพโหลดไฟล์จาก server ไปเก็บไว้ยัง Google Drive โดยอัตโนมัติ เพื่อทำการ backup ข้อมูล โดยใน API สามารถที่จะแสดงรายชื่อไฟล์และโฟลเดอร์, สร้างโฟลเดอร์ใหม่, ลบไฟล์และโฟลเดอร์ และอัพโหลดไฟล์เข้าไปยังโฟลเดอร์ที่กำหนดไว้ได้ หากใครต้องการเพิ่มความสามารถอื่นเข้าไป ก็สามารถอ่านวิธีเรียกใช้งาน API ได้จาก Reference ด้านล่างบทความนะครับ

ในการเรียกใช้งาน Service ของ Google API เราต้องทำการร้องขอ Access Token ไปยัง Server ของทาง Google เพื่ออนุญาตให้แอพที่เราสร้างสามารถเข้าถึง Service ที่เราระบุเอาไว้ได้ ซึ่งเมื่อเราได้ Access Token มาแล้วเราสามารถที่จะใช้ Access Token ตัวนี้ในการเรียกใช้ API ต่างๆ ได้ ซึ่งในบทความนี้เราจะทำการเรียกใช้ Google Drive API

Google Drive API

มาลองทดลองทำจริงเลยดีกว่าครับ เริ่มแรกเลยให้ทำการดาวน์โหลดโค้ดทั้งหมดจาก Github ลงมาก่อน https://github.com/LookHin/google-drive-api จากนั้นทำการเปิดใช้งาน Google Drive API โดยคลิกเข้าไปที่ Enable Google Drive API จากนั้นเลือกสร้างโปรเจคใหม่ หรือเลือกโปรเจคเก่าที่เรามีอยู่แล้วก็ได้

Google Drive API

คลิก Create credentials และเลือก OAuth client ID

Google Drive API

ในช่อง Application type ให้เลือกเป็น Other และช่อง Name ให้ใส่เป็นชื่อที่เราต้องการ และคลิก Create

Google Drive API

หลังจากคลิก Create แล้วระบบจะแสดง Client Id และ Client secret ขึ้นมาให้ ให้เรา copy รหัสทั้ง 2 ตัวนี้ไปใส่ในไฟล์ authorize.php และ example.php

$strClientId = "YOUR_CLIENT_ID";
$strClientSecret = "YOUR_CLIENT_SECRET";

Google Drive API

ทำการ Authorize โดยเรียก authorize.php จากบราวเซอร์ เช่น http://YOUR_SERVER/google-drive/authorize.php และทำการคลิก Allow เพื่อทำการอนุญาติให้แอพที่เราสร้างสามารถเข้าถึงข้อมูลใน Google Drive ได้

Google Drive API

หลังจากคลิก Allow แล้วระบบจะแสดง Refresh Token ขึ้นมาให้ ให้ทำการ copy รหัสตัวนี้ไปใส่ในไฟล์ example.php

$strRefreshToken = "YOUR_REFRESH_TOKEN";

Google Drive API

เพียงเท่านี้โปรแกรมของเรา ที่เราเขียนไว้ในไฟล์ example.php ก็พร้อมที่จะทำงานได้แล้วครับ แต่ก่อนอื่นมารู้จักกับ File Id และ Folder Id ที่ใช้ภายใน Google Drive กันก่อน ในระบบของ Google Drive จะอ้างอิงถึงไฟล์และโฟลเดอร์ต่างๆ ผ่านทาง Id ฉะนั้นเวลาเราจะสร้างโฟลเดอร์ใหม่ หรือทำการอัพโหลดเข้าไปในโฟลเดอร์ต่างๆ เราต้องรู้ก่อนว่าโฟลเดอร์นั้นมี Id เป็นอะไร โดยวิธีที่ง่ายที่สุดก็คือเปิดเข้าไปที่ Google Drive และคลิกเลือกไปที่โฟลเดอร์ที่ต้องการ เราจะเห็น Id ของโฟลเดอร์นั้นๆ แสดงเป็น URL ดังรูป

Google Drive API

ตัวอย่าง: จากตัวอย่างของโค้ด ผมทำตัวอย่างการแสดงไฟล์ สร้างโฟลเดอร์ ลบไฟล์และโฟลเดอร์ และอัพโหลดไฟล์ไว้ให้แล้ว ลองเล่นกันดูครับ

setAccessTokenFromRefreshToken($strRefreshToken);

// List File From Root Folder
$arrFile = $obj->ListFileAndFolder("root");
print_r($arrFile);

// # List File From Folder Id
//$arrFile = $obj->ListFileAndFolder("_PARENT_FOLDER_ID_");
//print_r($arrFile);

// # Create Folder In Root Folder
//$obj->CreateFolder("root", "_NEW_FOLDER_NAME_");

// # Create Folder In Parent Folder
//$obj->CreateFolder("_PARENT_FOLDER_ID_", "_NEW_FOLDER_NAME_");

// # Delete File & Folder
//$obj->Delete("_FILE_OR_FOLDER_ID_");

// # Upload File To Root Folder
// $arrResult = $obj->Upload("root", "no-face.png");
// print_r($arrResult);

// # Upload File To Parent Folder
// $arrResult = $obj->Upload("_PARENT_FOLDER_ID_", "no-face.png");
// print_r($arrResult);

?>

อ้างอิง :
https://github.com/LookHin/google-drive-api
https://developers.google.com/identity/protocols/OAuth2WebServer
https://developers.google.com/drive/v3/reference/files
https://developers.google.com/drive/v3/web/resumable-upload

โดย LookHin ณ 17 March 2017 11:07 +0700

12 March 2017

Kitt

Google Cloud Platform Free Tier

Google recently provide the free tier on their Google Cloud Platform (GCP). The free tier will be free forever (but what Google offered are subjected to changes). Also included in the free tier is $300 credit for 12 months (I think this was 2 months – good !) I applied, created Google Compute Engine (GCE) f1-micro instance, … Continue reading Google Cloud Platform Free Tier

โดย kitty ณ 12 March 2017 09:04 +0700

Vultr’s $2.5 / month server instance

Vultr has recently upgrade all instances . While $5/month has been upgraded from 1 CPU / 768 MB / 15 GB  to 1 CPU / 1 GB / 25 GB, Vultr also introduced the new smallest server instance – 1 CPU / 512 MB / 20 GB at $2.5/month. So, I have choices:  keep paying $5/month … Continue reading Vultr’s $2.5 / month server instance

โดย kitty ณ 12 March 2017 08:34 +0700

Yet another leap second added

235960 – 23:59:60 – the leap second added. UTC (based on solar mean)  – TAI (based on atomic clock) = -37 seconds Happy New Year 2017 UTC

โดย kitty ณ 12 March 2017 08:33 +0700

กบ CoE #2

ผมกับกบ CoE#2 สนิทกันประมาณนึง ด้วยกบจบจากสาธิตมอดินแดง เป็นพี่โรงเรียนเดียวกับส้ม กบจะเรียกผมว่าพี่เสมอ ไม่เคยเรียกผมว่าอาจารย์ กบชอบเล่นเกม โค้ดเก่ง คิดเก่ง พลิกแพลงเก่ง แต่ .. เรียนไม่เก่ง กบใช้เวลาเรียนหลายปีกว่าจะจบด้วยเกรด 2.0 กว่า ๆ ด้วยความที่เรียนนาน เข้าคลาสเรียนกับน้อง ๆ เลยเป็นที่รู้จักของน้อง ๆ รุ่นหลังอีกหลายรุ่น ถ้าจำไม่ผิดคน กบเข้าไปทำงานแรก ๆ ทำงานได้ดีโดยเจ้านายไม่รู้ว่าเกรดมันห่วย วันที่เจ้านายรู้ว่ากบจบด้วยเกรดห่วย ๆ จึงเกิดประโยคที่ว่า “มี วศ.คอม.มข. เกรด 2.0 แบบคุณอีกไหม ?” ผมเจอกบครั้งสุดท้ายหลายปีก่อน กบแวะมาที่ภาคฯ ถือเกมมาให้เล่น ก็ยังได้มานั่งเล่นเกมกันเหมือนสมัยอยู่ห้องโปรเจค ตัดมาอีกทีก็มารู้ข่าวเรื่องอาการเนื้องอกในสมองของกบ ช่วงปลายมกราฯ ที่ผ่านมา กบอาการทรุดลงไปอีก เพื่อน ๆ น้อง ๆ บางคนพอทราบก็ไปเยี่ยม/นัดกันว่าจะไปเยี่ยมที่บ้าน เมื่อวาน น้องไปสบายแล้ว ใจหายว่ะ

โดย kitty ณ 12 March 2017 08:33 +0700

6 March 2017

LookHin

การสร้าง LINE Bot ด้วย LINE Messaging API (Official API)

ก่อนหน้านี้ผมเคยลองทำ LINE Bot เล่นบ้างอยู่เหมือนกัน แต่ตอนนั้น LINE เขายังไม่มี Official API ออกมาให้ ทำให้เราต้องแอบเล่นผ่าน Unofficial API ที่มีคนแกะออกมาจากตัวโปรแกรมของไลน์อีกที ข้อดีคือมันใช้กับ Account ธรรมดาของเราได้ แต่ด้วยความที่มันไม่ใช่ Official API ก็ไม่มีอะไรการันตีให้เราได้ว่ามันจะทำงานสมบูรณ์ หลังๆ มานี้ LINE เขาเอาใจ Developer มากขึ้น เขามี Official API ออกมาให้ใช้งานแล้ว แต่ว่าจะใช้งานกับ Account ธรรมดาไม่ได้ ต้องใช้กับ account ที่เป็น LINE@ เท่านั้น ซึ่งเราสมัครใช้งานได้ฟรีๆ อยู่แล้ว

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

มาเริ่มกันเลย ในการสร้าง LINE Bot ให้เราล๊อกอินเข้าไปที่ LINE Business Center และทำการกรอกข้อมูลและลงทะเบียนให้เรียบร้อย อันนี้ทำเองนะครับ พอดีผมไม่ได้ print screen หน้าจอเอาไว้ เข้าไปทำอีกรอบไม่ได้ ฮาาา

เมื่อลงทะเบียนเสร็จแล้วให้เข้าไปที่เมนู Service -› Messaging API และคลิกที่ปุ่ม Start using Developer Trial

LINE Bot

ทำการตั้งชื่อบอท เลือกรูปภาพ และกรอกข้อมูลอื่นๆ ให้เรียบร้อย จากนั้นกดปุ่ม OK ด้านล่าง

LINE Bot

ตรวจสอบข้อมูลต่างๆ ให้เรียบร้อยแล้วกด Apply

LINE Bot

เมื่อสร้างเรียบร้อยแล้วให้คลิกที่ LINE@ Manager

LINE Bot

จากนั้นกดที่ปุ่ม “ใช้ API” และกด “ยืนยัน” (อ้าว ภาษาไทยได้ไงหว่า)

LINE Bot

จะเห็นว่าตอนนี้เราสามารถใช้งาน API ได้ 2 ฟังชั่นคือ REPLY_MESSAGE และ PUSH_MESSAGE โดยสามารถดูรายละเอียดการใช้งานทั้ง 2 ฟังชั่นนี้ได้จาก REPLY_MESSAGE และ PUSH_MESSAGE คลิกเข้าไปดูจะเห็นว่าเขียนไม่ยากครับ แค่รอรับและส่งข้อมูลกลับไปกลับมาเท่านั้น

ในหน้านี้จะเห็นว่าด้านขวามือมีชื่อของบอทของเราอยู่ พร้อมกับ LINE@ ID ของบอท เราสามารถแอ็ดเฟรนจาก ID นี้เลยก็ได้ หรือจะใช้ QR Code ในขั้นตอนถัดไปก็ได้ครับ และในส่วนของการตั้งค่าให้เลือก webhook เป็น “อนุญาต” และเลือก Bot เข้าร่วมกลุ่มแชท, ข้อความตอบรับอัตโนมัติ, คำทักทายเริ่มต้นสำหรับการเพิ่มเพื่อนใหม่ เป็น “ไม่อนุญาต” ทั้งหมด แต่ถ้าหากใครจะลองเปิดไว้ก็ได้นะครับ ทาง LINE เขามีระบบตอบรับข้อความอัตโนมัตไว้ให้อยู่แล้ว แทบไม่ต้องทำอะไรเพิ่มเลย เมื่อเลือกเสร็จแล้วกด “บันทึก” เมื่อกดบันทึกเรียบร้อยแล้วให้กดที่ LINE Developers ต่อได้เลยครับ เดียวเราต้องไปใส่ URL ของ webhook ในหน้านั้นอีกที

LINE Bot

ในหน้านี้จะเห็นว่ามี QR Code เราสามารถใช้ QR Code ตัวนี้เพื่อทำการแอ็ดเฟรนกับบอทได้เลยครับ หรือจะแอ็ดโดยใช้ LINE@ ID จากหน้าที่แล้วก็ได้ แต่ ID มันสุ่มมาให้อาจจะพิมพ์ตามยากหน่อย และในหน้าเดียวกันจะเห็นว่าในช่อง Webhook URL ยังไม่มีค่าอะไร ให้กด Edit

LINE Bot

ทำการใส่ Webhook URL ของเราลงไปครับ URL ตรงนี้จะเป็น URL ที่ใช้รับข้อความจาก LINE โดยจะต้องเป็น HTTPS เท่านั้นนะครับ

LINE Bot

หลังจากที่เราใส่ Webhook URL เข้าไปแล้ว ขั้นตอนถัดไปเป็นขั้นตอนการหา Access Token เพื่อเอาไปใช้กับโปรแรกมของเรา ให้คลิกเข้าไปที่ ISSUE ระบบก็จะแสดง Access Token ขึ้นมาให้

LINE Bot

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


หลังจากเขียนโค้ดและอัพโหลดขึ้นเซิฟเวอร์เรียบร้อยก็ลองทักบอทของเราได้เลยครับ มันตอบคำถามได้บ้างหละ

LINE Bot

ขึ้นตอนถัดไปเราจะทำระบบ Push message ฟังชั่นนี้เอาไว้ทำระบบแจ้งเตือนต่างๆ เช่นการแจ้งเตื่อนผู้บุกรุกจากอุปกรณ์ IoT หรือแจ้งเตือนราคาน้ำมัน ราคาทองอะไรก็แล้วแต่ โดยเราต้องใช้ ID ของผู้รับจากขั้นตอนที่แล้วในการส่ง เราอาจจะเก็บ User ID ลง Databsae เพื่อเอามาไว้ใช้ทีหลังอะไรก็แล้วแต่นะครับ แต่สำหรับโค้ดตัวอย่างนี้ผมจะใส่ User Id ลงไปตรงๆ (แก้ ACCESS_TOKEN และ USER_ID ให้เรียบร้อยและลองรันได้เลยครับ)


หลังจากตรงนี้ไป ก็ไปต่อยอดกันเอาเองครับ แล้วแต่จินตนาการกันเช่นเคย

อ้างอิง :
https://developers.line.me/messaging-api/getting-started
https://devdocs.line.me/en/

โดย LookHin ณ 6 March 2017 13:31 +0700

1 March 2017

Kitt

Tokyo Marathon 2017

การท่องเที่ยวแห่งประเทศไทย พาผู้จัดงานมาราธอนในเมืองไทยไปร่วมงาน Tokyo Marathon Expo 2017 ที่ญี่ปุ่นเพื่อช่วยประชาสัมพันธ์เชิญชวนนักวิ่งญี่ปุ่นและต่างชาติไปวิ่งที่ประเทศไทย โดยนำผู้จัด Khon Kaen International Marathon, Chiang Mai, Laguna Phuket, Pattaya, BDMS Bangkok, Amari Charity ไปร่วมงาน ระหว่างวันที่ 23 – 26 กุมภาพันธ์ 2017 Tokyo Marathon เป็นหนึ่งในหก World Marathon Majors (Berlin, Boston, Chicago, London, New York, Tokyo) เป็นรายการ tier สูงสุดแล้วสำหรับนักวิ่งมาราธอน ถ้านับงานมาราธอนใหญ่ของโลกนอกจากหกรายการ majors นี้ก็จะมีอีกเพียงสองรายการเท่านั้นคือ IAAF World Championships in Athletics และ Summer Olympic Games Tokyo Marathon เป็น majors … Continue reading Tokyo Marathon 2017

โดย kitty ณ 1 March 2017 12:04 +0700

24 February 2017

Neutron

rlm_raw - FreeRADIUS module

เรื่องนี้ เกี่ยวข้องกับ FreeRADIUS [1] ซึ่งคนที่เคยติดตั้ง และใช้งาน จะรู้ว่า FreeRADIUS จะมีฝั่ง Server และ Client โดยทั้งสองฝั่งจะถือ กุญแจ (Shared Secret) เดียวกัน โดยที่ Server จะใช้ IP Address ของ Client ในการเลือก กุญแจ ออกมาเทียบ

ปัญหาที่เกิดขึ้นคือ การใช้ FreeRADIUS เป็น Server ให้กับ Client ที่มี IP ไม่แน่นอน อย่างเช่น พวกที่มาจาก xDSL, FTTx เราจะไม่สามารถกำหนด Shared Secret ให้กับ Client นั้น ๆ ได้ นอกจากทุก Client จะถือกุญแจเดียวกัน ร่วมกันหลาย ๆ ราย

การใช้กุญแจร่วมกัน ก็อาจจะเป็นทางออก แต่ผมหาข้อมูลไปต่อ ว่าพอจะมีวิธีอื่น ๆ ที่รัดกุมกว่านี้ไหม ก็ไปเจอ [2] ที่พูดถึง rlm_raw และ dynamic_clients ซึ่งเราสามารถที่จะเอาข้อมูลจาก attribute ที่ client ส่งมา เพื่อไปใช้ประกอบกับการเลือก กุญแจ ออกมาเทียบได้ แต่ทว่า rlm_raw (original) ค่อนข้างเก่า และดึงมาใช้ตรง ๆ กับ FreeRADIUS 3.0.x ไม่ได้

ผมจึงเขียน rlm_raw [3] ขึ้นมาใหม่ โดยดู original เป็นแนวทาง และปรับมาใช้ libradius ซึ่งทำให้ code ที่เขียนใหม่ สะอาด และกระชับ กว่า code เดิมมาก

จาก ตัวอย่าง ใน README จะเห็นได้ว่า ผมสามารถ ที่จะใช้ค่า จาก attribute "NAS-Identifier" เพื่อไปเลือก secret ออกมาจาก redis server เพื่อมาตั้งค่า Client ใหม่ให้ FreeRADIUS ได้

Happy Hacking!

[1] http://freeradius.org/
[2] http://jakehe.blogspot.com/2014/07/freeradius-installation.html
[3] https://github.com/neutronth/rlm_raw

โดย neutron ณ 24 February 2017 07:59 +0700

22 February 2017

LookHin

การดักจับข้อมูลที่วิ่งเข้าออกบน HTTP/HTTPS จากแอพในมือถือ Android โดยใช้ Burp Suite

บทความนี้จะแสดงตัวอย่างการดักจับข้อมูลจากแอพในมือถือ Android ที่รับส่งไปยังเซิฟเวอร์ทั้งบน HTTP และ HTTPS โดยเราจะทดสอบกับแอพของไปรษณีย์ที่ใช้สำหรับตรวจสอบสถานะการส่งพัสดุ Thailand Post Track & Trace เพื่อให้เห็นว่ามีการส่งข้อมูลอะไรออกไปที่เซิฟเวอร์บ้าง โดยในการทดลองนี้จะทำกับแอพที่ใช้ certificate ของระบบเท่านั้น ส่วนแอพอย่างของ facebook หรือ instagram เขาจะมี certificate ของตัวเองที่ฝั่งมากับแอพทำให้เราไม่สามารถหลอกโปรแกรมได้ หรืออาจจะยืนยัน CA ว่าเป็น CA จริงหรือไม่ผ่านทาง DNS อีกที (ผมเข้าใจว่าอย่างนั้นนะ อันนี้ไม่แน่ใจ เดียวผมไปหาข้อมูลเพิ่มเติมมาก่อน)

ในการทดลองการดักจับข้อมูลครั้งนี้ เราจะให้ทั้งคอมฯ และมือถือต่ออยู่ใน Wi-Fi เน็ทเวิร์คเดียวกัน โดยเราจะใช้ Burp Suite Free Edition ซึ่งสามารถหาดาวน์โหลดได้จาก Burp Suite Free Edition เป็นโปรแกรมที่ทำหน้าที่เป็น proxy แต่ผมไม่ลงวิธีการติดตั้งนะครับตัวใครตัวมัน

หลังจากติดตั้งเรียบร้อยแล้ว ให้เปิดโปรแกรม Burp Suite Free Edition และเข้าไปที่แท็บ Proxy -› Options และเลือก Add เพื่อตั้ง proxy ใหม่

burp suite proxy

ทำการกำหนด Bind to port เป็น 8089 (ปกติก็คงเป็น 8080 แต่พอดีผมใช้มันไปทำอย่างอื่นแล้ว) และเลือก Bind to address เป็น All interfaces เมื่อใส่ค่าทุกอย่างเรียบร้อยก็คลิก OK

burp suite proxy

Windows Firewall จะขึ้นมาถามยืนยันการใช้งานพอร์ทให้กด Allow access

burp suite proxy

ถ้าในช่อง Running ในส่วนของ proxy ที่เราสร้างไว้ยังไม่ถูกติ๊กเป็นเครื่องหมายถูก ก็ติ๊กให้มันทำงานด้วยครับ

burp suite proxy

และในแท็บ Intercept ให้เลือก Intercept เป็น Off

burp suite proxy

จากนั้นมาที่มือถือ Android โดยให้เข้าไปที่ Setting -› Wi-Fi กดค้างที่ Wi-Fi ที่เราต่อเอาไว้แล้วเลือก Modify network

burp suite proxy

เลือก Show Advanceed options ติ๊กเลือก Show advance options และเลือก Proxy เป็น Manual และใส่ค่าต่างๆ ดังนี้

Proxy hostname = ให้ใส่ IP ของเครื่องคอมฯ ที่เราติดตั้ง Burp Suite ไว้
Proxy port = ใส่หมายเลข port ที่เรากำหนดไว้ใน Burp Suite

จากนั้นกด Connect

burp suite proxy

ขั้นตอนถัดไปคือการติดตั้ง CA Certificate ของ Burp Suite ลงในเครื่อง Android ให้เราพิมพ์ URL http://burp บนบราวเซอร์ของ Android และคลิกที่ปุ่ม CA Certificate เพื่อทำการดาวน์โหลด เมื่อทำการดาวน์โหลดมาแล้วจะได้ไฟล์ชื่อ cacert.der ให้ทำการเปลี่ยนนามสกุลของไฟล์เป็น cacert.cer

burp suite proxy

ทำการติดตั้ง CA Certificate โดยเข้าไปที่ Setting -› Advanced settings -› Security และเลือก Install from SD card

burp suite proxy

เลืกไฟล์ cacert.cer และทำการตั้งชื่อ Cartificate name

burp suite proxy

ที่หน้า Setting -› Advanced settings -› Security คลิกที่แท็บ Trusted credentials และเลือกแท็บ User จะเห็นว่ามี CA Certificate ใหม่ของเราติดตั้งไว้แล้ว เป็นอันเสร็จเรียบร้อย

burp suite proxy

ต่อไปมาเริ่มทำการทดสอบกันเลยครับ ว่ามันสามารถดักข้อมูลที่วิ่งผ่าน HTTP/HTTPS ได้จริงไหม โดยให้เปิดบราวเซอร์และพิมพ์ url ที่เป็น HTTPS ลงไป ในตัวอย่างก็เทสจากเว็บผมเองนี้หละ จะเห็นว่า HTTPS ก็ยังเป็นสีเขียวอยู่

burp suite proxy

กลับมาดูที่หน้า Burp Suite ในแท็บ HTTP history จะเห็นว่ามีข้อมูลที่วิ่งไปยังเว็บของเราแล้ว

burp suite proxy

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

burp suite proxy

กลับมาดูที่หน้า HTTP history จะเห็นว่ามีข้อมูลวิ่งที่ยังเซิฟเวอร์ของไปรษณีย์ไทยแล้วครับ (อ้าว มี username กับ password ติดมาด้วย อันนี้ไม่ได้ตั้งใจ อยู่นอกเหนือจากที่ผมคิดไว้ ฮาาา)

burp suite proxy

โดย LookHin ณ 22 February 2017 15:14 +0700

20 February 2017

Kitt

Intel® Optimized LINPACK Benchmark on Debian and Ubuntu

Got a chance to grab 8 dedicated servers. All of them are identical configuration. Intel Xeon E5-2660 2.20 GHz – 8 Core / 16 Threads 16GB (DDR3) Memory 240GB (SSD) Storage 1 Gbps Network Port And I put Debian on 2 of them and Ubuntu 2 of them. Since I use these servers for computation, I tested … Continue reading Intel® Optimized LINPACK Benchmark on Debian and Ubuntu

โดย kitty ณ 20 February 2017 21:43 +0700

CPU overloaded by kidle_inject ?

As it’s named, kidle_inject is a process to inject idleness to processors. On a good day, this will keep idle your processors, lower processor temperature, and save your battery. On a bad day, it will consume your processor somewhat like 50%+ on all cores, slow down your laptop, and drain your battery. But, you can … Continue reading CPU overloaded by kidle_inject ?

โดย kitty ณ 20 February 2017 21:42 +0700

14 February 2017

LookHin

การดาวน์โหลดวิดีโอจาก youtube, udemy, facebook โดยใช้ youtube-dl และ ffmpeg

เรื่องนี้สุ่มเสี่ยงที่จะผิดกฏหมาย ถึงแม้จะนำมาใช้งานส่วนตัวผมก็ไม่แน่ใจนัก แต่อย่างน้อยเรามาตกลงกันก่อนว่าเราจะดาวน์โหลดแค่งานที่เป็นสาธารณะ และศึกษาการใช้งานทูลนี้เท่านั้น (ตัดความรับผิดชอบเรียบร้อย) บทความนี้จะแสดงตัวอย่างการดาวน์โหลดวิดีโอจากเว็บต่างๆ อย่างเช่น youtube, udemy, facebook นะครับ โดยเราจะใช้โปรแกรม youtube-dl ในการดาวน์โหลด และใช้ ffmpeg ในการแปลงฟอร์แมตของไฟล์ จริงๆ ตัว youtube-dl มันก็มีให้ใส่พารามิเตอร์ให้เลือกฟอร์แมตของไฟล์นะครับ แต่สุดท้ายมันก็ไปเรียกใช้ ffmpeg ต่ออยู่ดี ซึ้งขั้นตอนในการแปลงฟอร์แมตเนี้ยก็ใช้เวลานานพอสมควร งั้นผมเลยแยกขั้นตอนการดาวน์โหลดและการแปลงฟอร์แมตของไฟล์วิดีโอออกจากกัน โดยเริ่มจากดาวน์โหลดวิดีโอมาก่อน จากนั้นค่อยมาทำการแปลงฟอร์แมตของไฟล์อีกที

ในขั้นตอนการติดตั้งจะแนะนำเฉพาะบน Windows เท่านั้นนะครับ สำหรับผู้ที่ใช้ Linux น่าจะมีพื้นฐานมากกว่าอยู่แล้ว และขั้นตอนการติดตั้งก็ไม่ยากนักคิดว่าคงทำกันได้หมด

ติดตั้ง youtube-dl โดยให้เข้าไปดาวน์โหลดที่ https://rg3.github.io/youtube-dl/ ให้คลิกไปที่เมนู Download และเลือก youtube-dl.exe หลังจากดาวน์โหลด ให้นำไปไว้ที่ c:\youtube-dl\

ติดตั้ง FFmpeg โดยเข้าไปที่ https://ffmpeg.org/download.html และเลือก Windows Packages จะมีลิงค์ไปหน้าดาวน์โหลดสำหรับ Windows ที่ https://ffmpeg.zeranoe.com/builds/ เมื่อดาวน์โหลดมาแล้วให้ unzip และนำไปไว้ที่ c:\ffmpeg\

youtube-dl-ffmpeg

จากนั้นทำการคอนฟิก Enviroment Variable Path ของ windows โดยให้เข้าไปที่ Control Panel -› System and Security -› System -› Advanced system Setting และเลือกที่ Enviroment Variables

youtube-dl-ffmpeg

ในส่วนของ System variables ให้เลือกไปที่ Path และเลือก Edit

youtube-dl-ffmpeg

ทำการเพิ่ม path ของ youtube-dl และ ffmpeg เข้าไปดังรูป

youtube-dl-ffmpeg

เมื่อเรียบร้อยแล้วให้ลองเปิด command และพิมพ์คำสั่งดังต่อไปนี้ เพื่อตรวจสอบ version กันก่อน ถ้าทุกอย่างเรียบร้อย น่าจะขึ้นประมาณนี้

youtube-dl --version
ffmpeg -version

youtube-dl-ffmpeg

และก่อนใช้งานทุกครั้งเราควรสั่ง youtube-dl -U เพื่อทำการ update โปรแกรมให้เป็น version ใหม่สุดอยู่เสมอ

youtube-dl-ffmpeg

สำหรับการดาวน์โหลดวิดีโอจาก youtube เราสามารถโหลดได้ทั้งแบบเป็น playlist และที่เป็นวิดีโอเดี่ยวๆ โดยสามารถใช้คำสั่งได้ดังต่อไปนี้

แบบเป็น playlist

youtube-dl --no-check-certificate --ignore-errors "https://www.youtube.com/playlist?list=PL6B3937A5D230E335"

แบบแยกเป็นรายวิดีโอ

youtube-dl --no-check-certificate "https://www.youtube.com/watch?v=YE7VzlLtp-4"

สำหรับ facebook ก็สามารถโหลดได้เช่นกันโดยใช้คำสั่งดังต่อไปนี้

youtube-dl --no-check-certificate "https://www.facebook.com/DevExp/videos/1378097708883662/"

และสำหรับวิดีโอที่เราซื้อคอร์สออนไลน์ไว้บน udemy เราสามารถโหลดทั้งคอร์สมาได้ โดยใช้คำสั่งดังต่อไปนี้

youtube-dl -u username -p password -o "%(chapter_number)s-%(chapter)s/%(autonumber)s-%(title)s.%(ext)s" "https://www.udemy.com/java-tutorial/"

ในกรณีที่ดาวน์โหลดวิดีโอลงมาแล้ว ไฟล์ที่ได้อาจจะเป็นไฟล์ .mkv หรือนามสกุลอื่นๆ เราสามารถทำการแปลงฟอร์แมตของไฟล์ได้โดยใช้ ffmpeg โดยให้สร้างโฟลเดอร์ใหม่ขึ้นมาก่อน ในที่นี้ผมจะตั้งชื่อโฟลเดอร์ว่า new-mp4 เอาไว้เก็บไฟล์ที่ได้จากการแปลง และใช้คำสั่งสำหรับการแปลงเป็น mp4 ดังนี้

ffmpeg -i old-video-file.mkv -vcodec libx264 -profile:v high -acodec aac ./new-mp4/new-video-file.mp4

หรือหากว่าต้องการแปลงทั้งโฟลเดอร์ให้ใช้คำสังดังต่อไปนี้

FOR /F "tokens=*" %G IN ('dir /b *') DO ffmpeg -i "%G" -vcodec libx264 -profile:v high -acodec aac "./new-mp4/%~nG.mp4"

อ้างอิง: https://github.com/rg3/youtube-dl/blob/master/README.md

โดย LookHin ณ 14 February 2017 12:18 +0700

9 February 2017

LookHin

การเขียนโปรแกรมเพื่อวิเคราะห์รูปภาพโดยใช้ Google Cloud Vision API

Google Cloud Vision สามารถวิเคราะห์ภาพได้ 6 รูปแบบคือ Label, Text, Face, Landmark, Logo, Image Properties ขั้นตอนการวิเคราะห์คือเราต้องทำการ อัพโหลดภาพขึ้นไปที่ Cloud Vision API จากนั้นเราจะได้ค่ากลับมาเป็น JSON ง่ายมากบอกเลย! เราอาจจะเอาความรู้จากบทความนี้มาทำแอพเล่นก็ได้ เช่นว่า ให้ผู้เข้าร่วมกิจกรรมทำการอัพโหลดรูปขึ้นมา และให้ระบบตรวจสอบว่าเป็นภาพอะไร แล้วเอาค่าที่ได้มาทำเป็นแคปชั่นหรือแฮชแทก แล้วอัพโหลดรูปนั้นขึ้นไปที่ Instagram (ดูวิธีการได้จากบทความที่แล้ว) อะไรประมาณนั้น แล้วแต่จะจินตนาการเช่นเคย

ในการใช้งานแบบฟรีเราสามารถอัพโหลดได้ 4MB ต่อภาพ และใช้งานได้ฟรี 1,000 หน่วยต่อเดือน (หน่วยในทีนี้ผมเข้าใจว่าหมายถึงจำนวนการร้องขอการตรวจสอบ เช่นถ้า 1 ภาพเราต้องการให้ตรวจสอบทั้ง Text และ Landmark ก็จะนับเป็น 2 หน่วย) ถ้ามากกว่านั้นก็ต้องเสียตังค์ (ก็สมเหตุสมผล ใช้มากก็ต้องใช้เงินแก้ปัญหาไป)

ขั้นตอนการสมัครเข้าใช้งาน Google Cloud Vision API ให้เข้าไปที่ Cloud Platform Console และคลิกที่ปุ่ม CREATE PROJECT

Google Cloud Vision API

ตั้งชื่อโปรเจคและใส่ข้อมูลต่างๆ ให้เรียบร้อย

Google Cloud Vision API

จากนั้นทำการเปิดใช้งาน Cloud Vision API โดยคลิกที่ลิงค์นี้และเลือกโปรเจคที่เราสร้างไว้เมื่อสักครู่ Enable Cloud Vision API

Google Cloud Vision API

ขั้นตอนถัดไปให้สร้าง API Key โดยให้คลิกเข้าไปที่เมนูรูปแฮมเบอร์เกอร์ด้านซ้ายมือและเลือกไปที่ API Manager และคลิกไปที่เมนู Credentials จากนั้นให้ทำการคลิกที่ Create Credentials และเลือกเป็น API Key

Google Cloud Vision API

หลังจากนั้นเราจะได้ API Key มาชุดหนึ่ง ให้กด RESTRICT KEY และก็กด Save ในหน้าถัดไปเลยครับ

Google Cloud Vision API

หลังจากได้ API Key มาแล้ว เราก็มาถึงขั้นตอนการเขียนโปรแกรมหละ ให้ดาวน์โหลดตัวอย่างรูปภาพและโค้ดที่ผมเตรียมไว้ลงไปก่อนครับ google-cloud-vision-api.zip (รูปตัวอย่างผมขโมยมาจากเน็ท ฮาา) เมื่อโหลดมาแล้วจะเห็นไฟล์ google-cloud-vision.php อันนี้เป็นตัวอย่างโค้ดที่ผมเตรียมไว้ให้ ให้ทำการเปลี่ยน API_KEY เป็นของตัวเองนะครับ


จากนั้นสั่งรันโค้ด เราจะได้ค่าผลลัพธ์กลับมาเป็น JSON เป็นอันเรียบร้อย

Google Cloud Vision API

อ้างอิง : https://cloud.google.com/vision/docs/

โดย LookHin ณ 9 February 2017 16:52 +0700

8 February 2017

LookHin

การอัพโหลดรูปภาพและวิดีโอขึ้น Instagram โดยใช้ PHP

ปกติแล้ว Instagram ไม่มี API ให้เราทำการอัพโหลดรูปภาพและวิดีโอขึ้นหรอกนะครับ ตัว Official API ของทาง Instagram ทำได้แค่ดึงข้อมูลรูปภาพและรายละเอียดที่เราอัพขึ้นไปแล้วเท่านั้น หากเราต้องการจะทำการอัพโหลดรูปหรือวิดีโอขึ้นไป เราต้องทำการ reverse engineering ต้องแกะดูเองว่าข้อมูลจากแอพที่ส่งไปที่เซิฟเวอร์มันรับส่งกันยังไง ถ้าเป็นอย่างแอพทั่วๆไป ที่เขาไม่ได้เน้นเรื่องความปลอดภัยมาก เราก็อาจจะใช้วิธีดักแพคเก็จของข้อมูล และเขียนโปรแกรมจำลองวิธีการรับส่งข้อมูลขึ้นมาเอง เพื่อทำการโพสข้อมูลไปที่เซิฟเวอร์ปลายทางก็ได้

แต่สำหรับกรณีของ instagram นี้ยากหน่อย เพราะเขาทำการ encrypt ข้อมูลด้วย secret key ที่อยู่ภายในแอพก่อนแล้วค่อยทำการส่งข้อมูลนั้นออกมา การหา secret key และวิธีเข้ารหัสอะไรนี้ผมเองก็ทำไม่เป็นหรอกนะ แต่พอดีว่าผมไปเห็นโค้ดของคนอื่นใน Github ที่เขาแกะข้อมูลทุกอย่างไว้หมดแล้ว แต่โค้ดเขาเยอะมาก มากเกินความต้องการของเรา ผมเลยเอาโค้ดของเขามารีไรท์ใหม่ และตัดให้เหลือแค่ส่วนที่ตัวเองต้องการใช้งาน นั้นคืออัพโหลดรูปปละวิดีโอ การแกะโค้ดคนอื่นก็ดีครับได้ทบทวนความรู้ตัวเองไปด้วย ถ้าใครสนใจอยากดูโค้ดของเขาก็เข้าไปดูได้ครับ โค้ดเขาอยู่ที่นี้ Instagram’s private API

บทความนี้สั้นๆ นะครับ แค่จะโชว์โค้ด และเดโมการอัพโหลดรูปและวิดีโอขึ้น instagram ให้ดู ส่วนการทำงานของโค้ดว่ามันทำงานยังไงก็ไปอ่านเอาเองครับ ไม่น่ายากเกินความพยายาม โดยคลาสที่ผมเขียนขึ้นมาใหม่จะไม่มีส่วนของการ crop รูปภาพ และแปลง format ของวิดีโอนะครับ ให้ไปทำกันเอาเอง โดยวิดีโอที่ผมทดสอบจะเป็น MP4 (H264)

มาเริ่มเลย อย่างแรกเข้าไปเอาซอสโค้ดและตัวอย่างทั้งหมดมาจาก Github ที่ผมแก้ไขโค้ดและเอาขึ้นไว้ที่ https://github.com/LookHin/instagram-photo-video-upload-api

เมื่อโหลดมาหมดแล้วจะเห็นว่ามีไฟล์ทั้งหมดอยู่ 5 ไฟล์ดังนี้

example.php //ตัวอย่างโปรแกรม
instagram-photo-video-upload-api.class.php //คลาสที่เรียกใช้งาน
square-image.jpg //ตัวอย่างรูปภาพ ขอให้เป็นภาพสี่เหลี่ยมจัตุรัสนะครับ
square-thumb.jpg //ตัวอย่างรูปภาพ thumbnail ที่จะใช้กับวิดีโอ ขอให้เป็นภาพสี่เหลี่ยมจัตุรัสเช่นกัน
test-video.mp4 //ตัวอย่างวิดีโอ เป็นไฟล์ MP4 (H264)

เปิดไฟล์ example.php ขึ้นมา จะเห็นมีอยู่แค่ไม่กี่บรรทัด คือใช้เท่านี้จริงๆ ส่วนการทำงานเบื่องหลังจะอยู่ในไฟล์ instagram-photo-video-upload-api.class.php ทั้งหมด อย่างแรกเลยให้ทำการแก้ไข YOUR_IG_USERNAME และ YOUR_IG_PASSWORD เป็น username และ password ที่เราใช้ในการ login เข้า instagram ถ้าได้แก้ไขเรียบร้อยแล้วก็สั่งรันได้เลยครับ (ผมทดสอบบน PHP 5.6 และ PHP 7)

include_once("instagram-photo-video-upload-api.class.php");

// Upload Photo
$obj = new InstagramUpload();
$obj->Login("YOUR_IG_USERNAME", "YOUR_IG_PASSWORD");
$obj->UploadPhoto("square-image.jpg", "Test Upload Photo From PHP");

// Upload Video
$obj = new InstagramUpload();
$obj->Login("YOUR_IG_USERNAME", "YOUR_IG_PASSWORD");
$obj->UploadVideo("test-video.mp4", "square-thumb.jpg", "Test Upload Video From PHP");

เมื่อสั่งรันแล้ว เราจะได้รูปภาพและวิดีโอตัวอย่างไปขึ้นที่ Instagram ของเราแล้วครับ

instagram upload photo video

โดย LookHin ณ 8 February 2017 17:14 +0700

Thep

Dell Inspiron 5468 with Debian Power

TL;DR แล็ปท็อปใหม่ของผม Dell Inspiron 5468 ใช้ CPU Intel Core i5-7200U, RAM 4 GB และ SSD 256 GB ติดตั้ง Ubuntu มาพร้อม นำมาติดตั้ง Debian Sid แบบ dual boot ใช้การได้ดี ยกเว้นมีปัญหา Wi-Fi, ไม่ชินกับปุ่ม PgUp/PgDn/Home/End, และเสียงไม่ออกหูฟังโดยอัตโนมัติเมื่อเสียบ

หลังจากที่ใช้แล็ปท็อปเก่ามาได้ร่วม 6 ปี จนเริ่มออกอาการหลายอย่าง เช่น ร้อนจนดับบ่อย เล่นวิดีโอได้ไม่เกิน 5 นาที เรื่อง video call ไม่ต้องพูดถึงเลย และล่าสุดคือปุ่ม power เริ่มรวน เปิดติดบ้างไม่ติดบ้าง ต้องแก้ปัญหาด้วยวิธีแปลก ๆ เช่น ลองถอดแบตแล้วเสียบปลั๊กไปเรื่อย ๆ จนกว่าจะกดติด ก็คิดว่าคงได้เวลาซื้อแล็ปท็อปใหม่เสียที (ด้วยแรงสนับสนุนของคุณภรรยา)

Spec ที่ต้องการ

สี่อย่างนี้ ผมใช้เป็นตัว screen เบื้องต้น แล้วค่อยไปเช็กอย่างอื่นเป็นรายตัวไป เช่น RAM, ฮาร์ดดิสก์, พอร์ตต่าง ๆ ฯลฯ

Dell Inspiron 5468

ตัดฉับมาตอนที่ผมหิ้วเครื่องออกจากร้าน มันคือ Dell Inspiron 5468 โดยมี spec ดังนี้:

รายละเอียดอื่น ๆ ดูได้จาก Dell แต่ในรุ่นนี้ มี CPU ให้เลือกสองแบบ คือรุ่น Core i5 และรุ่น Core i7 ราคาต่างกันอยู่ 3,000 บาท โดยรุ่น Core i5 นั้น ได้ SSD ขนาด 256 GB ในขณะที่รุ่น Core i7 ได้ HDD ขนาด 1 TB (5400 RPM) ผมเลือกรุ่น Core i5 เพราะ SSD เลยทีเดียว

รายละเอียดอื่น ๆ

dump ข้อมูลที่เป็นประโยชน์สำหรับผู้ที่จะซื้อมาใช้กับลินุกซ์ดังนี้ (จัดบรรทัด output เล็กน้อยเพื่อให้อ่านง่าย):

$ lscpu

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    2
Core(s) per socket:    2
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 142
Model name:            Intel(R) Core(TM) i5-7200U CPU @ 2.50GHz
Stepping:              9
CPU MHz:               797.772
CPU max MHz:           3100.0000
CPU min MHz:           400.0000
BogoMIPS:              5424.00
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              3072K
NUMA node0 CPU(s):     0-3
Flags:                 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca
  cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx
  pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl
  xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl
  vmx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe
  popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch
  epb intel_pt tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1
  avx2 smep bmi2 erms invpcid mpx rdseed adx smap clflushopt xsaveopt xsavec
  xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp

$ lspci

00:00.0 Host bridge: Intel Corporation Device 5904 (rev 02)
00:02.0 VGA compatible controller: Intel Corporation Device 5916 (rev 02)
00:14.0 USB controller: Intel Corporation Sunrise Point-LP USB 3.0 xHCI
  Controller (rev 21)
00:14.2 Signal processing controller: Intel Corporation Sunrise Point-LP
  Thermal subsystem (rev 21)
00:15.0 Signal processing controller: Intel Corporation Sunrise Point-LP Serial
  IO I2C Controller #0 (rev 21)
00:15.1 Signal processing controller: Intel Corporation Sunrise Point-LP Serial
  IO I2C Controller #1 (rev 21)
00:16.0 Communication controller: Intel Corporation Sunrise Point-LP CSME HECI
  #1 (rev 21)
00:17.0 SATA controller: Intel Corporation Sunrise Point-LP SATA Controller
  [AHCI mode] (rev 21)
00:1c.0 PCI bridge: Intel Corporation Device 9d10 (rev f1)
00:1c.4 PCI bridge: Intel Corporation Sunrise Point-LP PCI Express Root Port #5
  (rev f1)
00:1c.5 PCI bridge: Intel Corporation Sunrise Point-LP PCI Express Root Port #6
  (rev f1)
00:1f.0 ISA bridge: Intel Corporation Device 9d58 (rev 21)
00:1f.2 Memory controller: Intel Corporation Sunrise Point-LP PMC (rev 21)
00:1f.3 Audio device: Intel Corporation Device 9d71 (rev 21)
00:1f.4 SMBus: Intel Corporation Sunrise Point-LP SMBus (rev 21)
01:00.0 Display controller: Advanced Micro Devices, Inc. [AMD/ATI] Topaz XT
  [Radeon R7 M260/M265 / M340/M360 / M440/M445] (rev 83)
02:00.0 Network controller: Qualcomm Atheros QCA9377 802.11ac Wireless Network
  Adapter (rev 31)
03:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8101/2/6E PCI
  Express Fast/Gigabit Ethernet controller (rev 07)

$ lsusb

Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 007: ID 0cf3:e009 Atheros Communications, Inc. 
Bus 001 Device 005: ID 0bda:0129 Realtek Semiconductor Corp. RTS5129 Card
  Reader Controller
Bus 001 Device 003: ID 0bda:5684 Realtek Semiconductor Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

$ lsscsi

[0:0:0:0]    disk    ATA      INTEL SSDSC2KF25 D07N  /dev/sda 
[1:0:0:0]    cd/dvd  HL-DT-ST DVD+-RW GU90N    A1C1  /dev/sr0 

Ubuntu hardware certification ระบุว่า Ubuntu ที่ติดตั้งมาจากโรงงานมีปัญหา hibernate ไม่ได้ และ Bluetooth 4.0 HID ไม่ทำงาน แต่ก็รายงาน wireless adaptor เป็น Intel Wireless 3165 ในขณะที่ในเครื่องจริง ๆ เป็น Qualcomm Atheros QCA9377

เตรียมพาร์ทิชัน

เครื่องมาพร้อมกับ Ubuntu 16.04 LTS ติดตั้งไว้ โดยแบ่งพาร์ทิชันดังนี้:

$ fdisk -l /dev/sda

Disk /dev/sda: 238.5 GiB, 256060514304 bytes, 500118192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt

Device         Start       End   Sectors   Size Type
/dev/sda1       2048   1026047   1024000   500M EFI System
/dev/sda2    1026048   7317503   6291456     3G Microsoft basic data
/dev/sda3    7317504 483756031 476438528 227.2G Linux filesystem
/dev/sda4  483756032 500117503  16361472   7.8G Linux swap

สองพาร์ทิชันแรก (sda1, sda2) ใช้สำหรับ UEFI boot พาร์ทิชันที่สาม (sda3) เป็น Ubuntu 16.04 LTS โดยเมานท์กับ / เพียงจุดเดียว และที่ท้ายดิสก์เป็นพาร์ทิชัน swap 7.8 GB (ประมาณสองเท่าของ RAM 4 GB)

หากจะติดตั้ง Debian โดยลบ sda3 ทิ้งไปเลยก็ย่อมได้ แต่เห็นว่า Ubuntu image ที่ติดตั้งมาจากโรงงานอาจพอมีประโยชน์สำหรับอ้างอิงอาการต่าง ๆ ที่อาจพบในอนาคต ระหว่าง config จากโรงงานกับที่เราติดตั้งเอง และอาจใช้ลอกการบ้านในกรณีที่มีปัญหากับฮาร์ดแวร์ได้ จึงตัดสินใจว่าจะหดพาร์ทิชัน Ubuntu แล้วสร้างพาร์ทิชันใหม่สำหรับ Debian และ /home

วิธีการที่ใช้คือ:

  1. ดาวน์โหลด Debian Installer จากหน้าโครงการ Debian-installer โดยผมเลือก Current daily snapshot สำหรับ amd64
  2. เขียน installer image โดยเสียบ USB flash drive เปล่า แล้วตรวจหา device file ของมันด้วยคำสั่ง dmesg แล้วไล่หาดูอุปกรณ์ล่าสุดใน log ซึ่งในกรณีของผมมันคือ /dev/sdb จากนั้นก็สั่งเขียน:
    # dd if=debian-testing-amd64-netinst.iso of=/dev/sdb
    
  3. เตรียม firmware โดยดาวน์โหลด firmware tarball จาก Debian cdimage มารอไว้เพื่อเขียนลง flash drive โดยจากขั้นตอนที่แล้ว ISO image ที่เขียนลงไปจะทำให้ใน flash drive จะมี 2 partition เกิดขึ้น พาร์ทิชันแรกใช้สำหรับบูต Debian installer และเราจะเขียน firmware ลงในพาร์ทิชันที่สอง โดยอาจจะแตก tarball ทั้งหมดลงไปเลย:
    # mount /dev/sdb2 /mnt
    # tar xzf firmware.tar.gz -C /mnt
    # umount /mnt
    
    หรือเลือกเฉพาะที่ต้องใช้สำหรับเครื่องนี้ คือ firmware-atheros และ firmware-realtek:
    $ tar xzf firmware.tar.gz
    # su
    Password:
    # mount /dev/sdb2 /mnt
    # cp firmware-atheros*.deb firmware-realtek*.deb /mnt
    # umount /mnt
    
  4. บูต Installer โดย disable secure boot เสียก่อน (ผมไม่แน่ใจว่า Debian installer สามารถบูตใน secure mode ได้หรือเปล่า แต่เนื่องจากผมมีเวลาไม่มาก จึงรวบรัดตัดตอน และเครื่อง Dell นี้ก็สามารถปิด secure boot ได้ โดยกด F12 ขณะเปิดเครื่องแล้วเซ็ต boot mode เป็น legacy mode คือ UEFI with secure boot OFF จากนั้นก็เซ็ต boot order ให้บูตจาก USB drive ก่อน internal HDD) เมื่อบูตเข้า Debian installer แล้ว ก็ตอบคำถามไปเรื่อย ๆ จนเสร็จขั้น load installer components แล้วหยุดอยู่แค่นั้น
  5. resize พาร์ทิชัน Ubuntu โดยกด Alt-F2 เพื่อไปที่ console ที่ 2 แล้วกด Enter เพื่อเข้า Busybox shell แล้วเริ่ม resize partition sda3 ตามขั้นตอนที่แนะนำใน หน้านี้ คือ:
    1. check file system
      # fsck /dev/sda3
      
    2. ปิด journal เพื่อเปลี่ยนพาร์ทิชัน ext4 ให้เป็น ext2
      # tune2fs -o ^has_journal /dev/sda3
      
    3. check file system อีกครั้งเพื่อจัดระเบียบบล็อคต่าง ๆ
      # e2fsck -f /dev/sda3
      
    4. resize file system ใน sda3
      # resize2fs /dev/sda3 15G
      
    5. resize ตัวพาร์ทิชัน sda3 ด้วย fdisk
      # fdisk /dev/sda
      
      โดยขั้นตอนที่ต้องทำคือ:
      1. ลบพาร์ทิชัน sda3 ด้วยคำสั่ง d
      2. เพิ่มพาร์ทิชัน sda3 กลับคืนด้วยขนาดใหม่ ด้วยคำสั่ง n
      3. เขียนตารางพาร์ทิชันลงดิสก์ ด้วยคำสั่ง w
      4. ออกจาก fdisk ด้วยคำสั่ง q

จากนี้ ระบบก็พร้อมแล้วสำหรับติดตั้ง Debian GNU/Linux สามารถกด Alt-F5 เพื่อกลับไป console ติดตั้งเพื่อทำงานต่อได้ หรือจะรีบูตเข้า installer อีกรอบเพื่อความแน่ใจก็ตามแต่

Debian GNU/Linux

เพื่อไม่ให้บล็อกนี้ยาวเกินไป ผมขอข้ามรายละเอียดการติดตั้ง Debian เอาเป็นว่า ผมเลือกติดตั้ง Xfce desktop เครื่องนี้จึงเป็นเครื่องที่ปลอด GNOME ยิ่งกว่าเครื่องก่อนที่อาจจะยังมีแพกเกจของ GNOME ตกค้างอยู่บ้างระหว่างย้ายมา Xfce

การใช้งานนับว่ารวดเร็วปรู๊ดปร๊าดกว่าเครื่องก่อนอย่างมโหฬาร SSD ทำให้อ่าน-เขียนดิสก์ได้เร็วแบบลื่นหัวแตก ความรู้สึกเหมือนสมัยใช้ RAM disk บน DOS ยังไงยังงั้น ใช้ aptitude upgrade/install/remove โปรแกรมได้สนุกสนาน ไม่ต้องรอนาน โหลด Firefox พร้อมประวัติและ bookmark ต่าง ๆ ที่ import มาจากเครื่องเก่าเสร็จภายใน 3 วินาที บ้าไปแล้ว! และเครื่องก็แทบไม่ร้อนเลยแม้จะเล่นวิดีโอยาว ๆ ทำให้พัดลมระบายความร้อนแทบไม่ได้ทำงานเลย นาน ๆ จะได้ยินสักครั้ง เป็นการใช้คอมพิวเตอร์ที่เงียบสนิทจนน่าตกใจ เมื่อเทียบกับเครื่องเก่า

ปัญหาที่พบ

ก่อนที่จะลงรายละเอียดที่เป็นความชอบส่วนตัว ผมขอบันทึกปัญหาที่พบเสียก่อน:

ส่วนอื่น ๆ เช่น webcam, bluetooth ยังไม่ได้ทดสอบครับ ไว้ถ้ามีโอกาสค่อยว่ากันอีกที

การปรับแต่งซอฟต์แวร์

หัวข้อนี้เป็นการปรับแต่งซอฟต์แวร์สำหรับให้ตัวผมเองในอนาคตอ่าน ในกรณีที่ต้องเซ็ตเครื่องทำงานเครื่องใหม่

นอกจาก Xfce ปกติแล้ว ผมติดตั้งแพกเกจต่อไปนี้ของ GNOME เพิ่มเติม:

รายการปรับแต่งซอฟต์แวร์

สรุป

โดยรวมแล้ว ผมพอใจกับเครื่องใหม่นี้มาก มันทำให้งานผมเสร็จได้เร็วขึ้น โดยปัจจัยหลักคือ SSD ที่ทำให้ไม่ต้องรอ I/O นาน นอกจากนี้ยังพอใจกับความร้อนที่น้อย การรองรับของลินุกซ์ที่เพียงพอต่อความต้องการ มียกเว้นแค่สองเรื่องที่ค่อนข้างร้ายแรง คือ Wi-Fi ที่หลุดบ่อยเมื่อใช้กับ access point ที่มีการเปลี่ยนแบนด์วิดท์เป็นระยะ (กับ access point บางตัวไม่มีปัญหานี้) และปุ่ม Home/End/PgUp/PgDn ที่ต้องกด Fn ร่วมด้วย (external keyboard ช่วยได้ แต่ก็ต้องฝึกใช้ปุ่มแล็ปท็อปให้เคยชินเพื่อความคล่องตัวในการใช้งานนอกสถานที่ด้วย)

โดย Thep (noreply@blogger.com) ณ 8 February 2017 08:43 +0700

6 February 2017

LookHin

การเขียนโปรแกรมลงบน Sonoff WiFi Smart Switch (ESP8266)

ภายในของ Sonoff WiFi Smart Switch ก็เป็น ESP8266 ที่ต่อกับรีเลย์เพื่อใช้ควบคุมการเปิดปิดของวงจรไฟฟ้า โดยสามารถใช้งานกับไฟบ้านที่แรงดัน 90-250v AC(50/60Hz) รับกระแสได้สูงสุด 10A เพียงพอสำหรับการเอามาใช้สำหรับเปิดปิดหลอดไฟทั่วๆ ไป ราคาประมาณ 280-300 บาท ซึ่งทางผู้ผลิตเขาก็มีแอพชื่อ eWeLink เอาไว้ให้เราโหลดมาใช้ควบคุมตัวสวิตซ์ตัวนี้ได้อยู่แล้วแหละ แต่ว่ามันก็ใช้แค่เปิดปิดกับตั้งเวลาได้เท่านั้น ซึ่งไม่ได้ตรงกับความต้องการของเรา ความต้องการของเราคือต้องการทำให้หลอดไฟจุดทุกในบ้านสามารถควบคุมได้ผ่านระบบควบคุมกลางคือ Raspberry Pi 3 (แต่ในบทความนี้จะพูดถึงแค่การเขียนโปรแกรมลงบน ESP8266 ของ Sonoff WiFi Smart Switch เท่านั้นนะครับ)

หลังจากไปหาซื้อมาแล้วก็แกะกล่อง ใช้ไขขวงดันๆ เดียวมันก็หลุดออกมาครับ (หลุดพร้อมประกัน)

Sonoff WiFi Smart Switch (ESP8266)

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

GPIO14
GND
TX
RX
VCC 3.3V

Sonoff WiFi Smart Switch (ESP8266)

เมื่อบัดกรีขาต่างๆ เรียบร้อยแล้ว ให้ทำการต่อ Sonoff กับ USB To UART เพื่อทำการเขียนโปรแรกมลงไป โดยให้ต่อขาต่างๆ ดังนี้

[Sonoff] --> [USB To UART]
VCC --> VCC (3.3V)
RX --> TX
TX --> RX
GND -->GND

Sonoff WiFi Smart Switch (ESP8266)

หลังจากต่อวงจรเสร็จเรียบร้อยให้ทำการกดสวิตซ์สีดำค้างเอาไว้ และเสียบสาย USB เข้ากับคอมพิวเตอร์เพื่อทำการโปรแกรม (ต้องกดค้างก่อนเสียบสายด้วยนะครับ สำคัญมากๆ) โดยให้เขียนโค้ดต่างๆ ดังนี้

โดยให้ใส่ SSID และ Password ของ WI-FI ของเราลงไป และเราจะเขียนโปรแรกมให้ฟิกค่า IP ของอุปกรณ์เอาไว้เพื่อความสะดวกในการเรียกใช้งาน (คงไม่สะดวกแน่ๆ ถ้าจะให้มันรับ DHCP เข้ามา) ดาวน์โหลดโค้ดตัวอย่าง

const char* ssid = "WIFI_SSID";
const char* password = "WIFI_PASSWORD";

const IPAddress ip(192, 168, 1, 100); // IP ของอุปกรณ์ตัวนี้ 192.168.1.100
const IPAddress subnet(255, 255, 255, 0);
const IPAddress gt(192, 168, 1, 1);
#include <esp8266wifi.h>
#include <esp8266webserver.h>

const char* ssid = "WIFI_SSID";
const char* password = "WIFI_PASSWORD";

const IPAddress ip(192, 168, 1, 100);
const IPAddress subnet(255, 255, 255, 0);
const IPAddress gt(192, 168, 1, 1);

const int SwitchPin = 12; // GPIO12
int SwitchValue = HIGH;

ESP8266WebServer server(80);

void handleNotFound(){
  //server.send(404, "text/plain", "404 Not Found");

  if(SwitchValue == HIGH) {
    server.send(200, "text/plain", "ON");
  }else{
    server.send(200, "text/plain", "OFF");
  }

  delay(1000);
}

void setup(void){

  // Set Output PIN
  pinMode(SwitchPin, OUTPUT);
  digitalWrite(SwitchPin, SwitchValue);

  // Connect WiFi
  WiFi.mode(WIFI_STA);
  WiFi.config(ip, gt, subnet);
  WiFi.begin(ssid, password);

  // Wait for connection
  while(WiFi.status() != WL_CONNECTED){
    delay(1000);
  }

  server.on("/", [](){
    if(SwitchValue == HIGH) {
      server.send(200, "text/plain", "ON");
    }else{
      server.send(200, "text/plain", "OFF");
    }

    delay(1000);
  });

  server.on("/ON", [](){
    SwitchValue = HIGH;

    server.send(200, "text/plain", "ON");
    digitalWrite(SwitchPin, SwitchValue);
    delay(1000);
  });

  server.on("/OFF", [](){
    SwitchValue = LOW;

    server.send(200, "text/plain", "OFF");
    digitalWrite(SwitchPin, SwitchValue);
    delay(1000);
  });

  server.onNotFound(handleNotFound);

  server.begin();
}

void loop(void){
  server.handleClient();
}

เพื่อความสะดวกในการนำไปติดตั้งใช้งานจริง เราจะหาแม่เหล็กกระดุมมาติดกับฐานของบอร์ทเอาไว้ เพื่อจะได้เอาไปติดกับโคมไฟเพดานง่ายๆ หน่อย แม่เหล็กขนาดนี้หาซื้อได้จากคลองถมนะครับ ตัวละ 15 บาท แต่ถ้าใครไม่มีก็หาวิธีติดเอาเอง เอากาวสองหน้าก็ได้

Sonoff WiFi Smart Switch (ESP8266)

หลังจากอัพโหลดโปรแกรมเรียบร้อยแล้ว ให้ทำการประกอบทุกอย่างลงกล่องให้เหมือนเดิมและนำไปใช้งานได้ (ที่สำคัญให้ต่อสาย L กับ N ให้ถูกทั้งขาเข้าและขาออกด้วยนะครับ)

Sonoff WiFi Smart Switch (ESP8266)

ทดสอบสั่งเปิดปิดไฟ โดยเปิดบราวเซอร์และพิมพ์ IP ของ Sonoff WiFi Smart Switch ที่เราคอนฟิกไว้ตอนเขียนโปรแกรม ดังนี้

http://192.168.1.100/ON
http://192.168.1.100/OFF

ก่อนจบ: ข้อเสียอย่างหนึ่งของ Sonoff Smart Switch คือว่ามันใช้ Relay ธรรมดา ทำให้เวลาเปิดปิดวงจรจะมีเสียงนิดหน่อย ถ้าเป็นไปได้ผมว่าจะหา Solid State Relay มาเปลี่ยนอยู่ //แต่ก็แพง

โดย LookHin ณ 6 February 2017 00:11 +0700

5 February 2017

bact

เอกสาร ม.409 สัมมนาทางมานุษยวิทยา 2/2559

ทำเอกสารประกอบวิชาสัมมนาเทอมนี้ จะอัปโหลดรายการบรรณานุกรมที่ WordPress.com มันไม่ให้ (.rdf .xml .zip .txt ไม่ได้สักกะอัน) เลยต้องมาฝากไว้ในบล็อกตัวเอง

TU AN409 2/2559 Bibliography

โดย bact ณ 5 February 2017 12:39 +0700