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 GMT

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 GMT

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 GMT

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 GMT

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 กันก่อน ถ้าทุกอย่างเรียบร้อย น่าจะขึ้นประมาณนี้

1
2
youtube-dl --version
ffmpeg -version

youtube-dl-ffmpeg

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

youtube-dl-ffmpeg

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

แบบเป็น playlist

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

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

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

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

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

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

1
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 ดังนี้

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

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

1
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 GMT

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 เป็นของตัวเองนะครับ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<?php
 
// Google Cloud Vision API
$strUrl = "https://vision.googleapis.com/v1/images:annotate?key=API_KEY";
 
$arrHeader = array();
$arrHeader[] = "Content-Type: application/json";
 
 
$objImgData = file_get_contents("test.jpg");
$objImgBase64 =  base64_encode($objImgData);
 
$arrPostData = array();
$arrPostData['requests'][0]['image']['content'] = $objImgBase64;
 
$arrPostData['requests'][0]['features'][0]['type'] = "LABEL_DETECTION";
$arrPostData['requests'][0]['features'][0]['maxResults'] = "5";
 
$arrPostData['requests'][0]['features'][1]['type'] = "FACE_DETECTION";
$arrPostData['requests'][0]['features'][1]['maxResults'] = "5";
 
$arrPostData['requests'][0]['features'][2]['type'] = "TEXT_DETECTION";
$arrPostData['requests'][0]['features'][2]['maxResults'] = "5";
 
$arrPostData['requests'][0]['features'][3]['type'] = "LANDMARK_DETECTION";
$arrPostData['requests'][0]['features'][3]['maxResults'] = "5";
 
$arrPostData['requests'][0]['features'][4]['type'] = "LOGO_DETECTION";
$arrPostData['requests'][0]['features'][4]['maxResults'] = "5";
 
$arrPostData['requests'][0]['features'][5]['type'] = "IMAGE_PROPERTIES";
$arrPostData['requests'][0]['features'][5]['maxResults'] = "5";
 
 
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$strUrl);
curl_setopt($ch, CURLOPT_HTTPHEADER, $arrHeader);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($arrPostData));
curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$result = curl_exec($ch);
curl_close ($ch);
 
print $result;
 
?>

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

Google Cloud Vision API

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

โดย LookHin ณ 9 February 2017 16:52 GMT

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 ไฟล์ดังนี้

1
2
3
4
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)

1
2
3
4
5
6
7
8
9
10
11
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 GMT

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 09:41 GMT

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 เผื่อว่าเราอยากต่อเซ็นเซอร์อะไรเพิ่มเติม) โดยถ้ามองจากด้านบนจะมีตำแหน่งของขาต่างๆ ดังนี้

1
2
3
4
5
GPIO14
GND
TX
RX
VCC 3.3V

Sonoff WiFi Smart Switch (ESP8266)

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

1
2
3
4
5
[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 เข้ามา) ดาวน์โหลดโค้ดตัวอย่าง

1
2
3
4
5
6
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);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#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 GMT

5 February 2017

bact

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

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

TU AN409 2/2559 Bibliography

โดย bact ณ 5 February 2017 12:39 GMT

30 January 2017

LookHin

การสร้าง Telegram Bot สำหรับส่งข้อมูลแจ้งเตือนจาก ESP8266

บทความนี้จะแสดงตัวอย่างการสร้าง Telegram Bot สำหรับส่งข้อมูลแจ้งเตือนจากอุปกรณ์ไฟฟ้าที่ควบคุมด้วย ESP8266 อาจจะนำไปประยุกต์ใช้สำหรับทำวงจรแจ้งเตือนเมื่อมีผู้บุกรุกด้วยการนำ ESP8266 ไปต่อกับเซ็นเซอร์วัดระยะทางด้วยคลื่นอัลตราโซนิค (Ultrasonic Distance Sensor) หรือเซ็นเซอร์อินฟราเรด (PIR Sensor) ซึ้งถ้ามีผู้บุกรุกก็จะให้ส่งข้อความแจ้งเตือนมายัง Telegram หรือจะนำไปต่อกับเซ็นเซอร์ตรวจจับควันก็แล้วแต่จินตนาการ

ขั้นตอนการทำก็แบ่งออกเป็น 2 ขั้นตอนใหญ่ๆ คือ
1. สร้าง Telegram Bot
2. เขียนโปรแกรมบน ESP8266 เพื่อส่งข้อความมายัง Telegram ของเรา (ในบทความนี้จะใช้ ESP-01 และใช้สวิตซ์เป็นอินพุต ในการใช้งานจริงให้เปลี่ยนจากสวิตซ์ไปเป็น PIR Sensor หรือหากว่าต้องการรับอินพุตที่เป็น Analog ให้เปลี่ยนไปใช้ ESP-07 หรือ ESP-12 ที่มีขา ADC มาให้นะครับ)

สำหรับการสร้าง Telegram Bot ให้เราทำการเพิ่ม @BotFather เป็นเพื่อนกับเราก่อน ซึ่งเราจะต้องสั่งให้ @BotFather สร้างบอทให้เรา (ไม่เข้าใจเหมือนกันว่าทำไมเขาไม่ให้ทำผ่านหน้าเว็บ แต่เขาให้ทำในนี้ก็ทำไปครับ)

TelegrameBot Allert From ESP 8266

เมื่อเพิ่ม @BotFather เป็นเพื่อนแล้ว เราจะเห็นคำสั่งต่างๆ ขึ้นมาให้เราใช้งาน ลองพิมพ์ /help ระบบจะแสดงคำสั่งต่างๆ ขึ้นมาให้

TelegrameBot Allert From ESP 8266

ทีนี้ให้เราสร้าง Bot โดยใช้คำสั่ง /newbot ซึ่งระบบจะให้เราใส่ชื่อที่จะใช้เรียกบอทของเรา และให้ใส่ username ของบอท ซึ่งตรง username นี้จะต้องไม่ซ้ำกับคนอื่นและจะต้องลงท้ายด้วย bot เท่านั้น (ตัวอย่างผมจะใช้ชื่อบอทว่า SmartHomeABC123 และใช้ username ว่า SmartHomeABC123Bot) เมื่อสร้างเสร็จแล้วระบบจะแสดง Access Token ขึ้นมาให้เรา Token ตัวนี้จะใช้สำหรับการส่งข้อความนะครับ จดไว้ๆ

TelegrameBot Allert From ESP 8266

จากนั้นให้เราทำการเพิ่มบอท @SmartHomeABC123Bot เป็นเพื่อนของเราก่อน และลองทักมันไปสัก 1 ครั้ง จะเห็นว่าไม่มีอะไรขึ้นมา ไม่ต้องตกใจ อ่านข้อต่อไปครับ สิ่งที่เราต้องการไม่ได้ให้มันตอบกลับ แต่เราต้องการ ID ของเราเอง เพื่อใช้ในการส่งข้อความกลับ

TelegrameBot Allert From ESP 8266

จากนั้นให้พิมพ์คำสั่งนี้ที่ browser หรือหากใครใช้ CURL เป็นก็ตามสะดวก ออ อย่าลืมเปลี่ยนตรงคำว่า <ACCESS_TOKEN> เป็น Access Token ของบอทตัวเองด้วยนะครับ

https://api.telegram.org/bot<ACCESS_TOKEN>/getUpdates

สำหรับฟอร์แมตของคำสั่งจะเป็น https://api.telegram.org/bot<ACCESS_TOKEN>/API_COMMAND นะครับ สามารถอ่านข้อมูลเพิ่มเติมได้ว่าเราสามารถสั่งอะไรได้บ้างจาก Link นี้ครับ https://core.telegram.org/bots/api

หลังจากสั่ง /getUpdates เราจะได้ข้อมูลของข้อความและ id ของผู้ส่ง ซึ่งเดียวเราจะใช้ id ตรงนี้ในการนำไปใช้ในการส่งข้อความจาก ESP8266 ต่อไป (ถ้าสั่ง /getUpdates แล้วไม่มีข้อมูลอะไรขึ้น ให้ลองพิมพ์ข้อความทักบอทของเราไปอีกรอบ บาททีเราอาจจะเว้นช่วงนานไปจนข้อความนั้นหมดอายุไปก่อน)

TelegrameBot Allert From ESP 8266

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

1
curl -X POST https://api.telegram.org/bot<ACCESS_TOKEN>/sendMessage -d text="test test" -d chat_id="<YOUR_CHAT_ID>" -k

TelegrameBot Allert From ESP 8266

เย้ๆ ส่งข้อความได้แล้ว

TelegrameBot Allert From ESP 8266

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

อย่ากแรกต่อวงจรตามนี้ก่อน โดยให้ต่อ ESP-01 เข้ากับ USB To UART เพื่อทำการเขียนโปรแกรมลงไป และต่อสวิตซ์แบบ pull-up เข้ากับขา GPIO-2 ส่วนรายละเอียดอื่นๆ ตามนี้ครับ

1
2
3
4
5
6
7
8
[ESP-01] --> [USB To UART]
RX --> TX
TX --> RX
VCC --> VCC (3.3v)
CH_PD --> VCC (3.3v)
GNC --> GND
GPIO-0 --> GND
GPIO-2 --> ต่อ pull-up กับสวิตซ์

TelegrameBot Allert From ESP 8266

เขียนโค้ดบน Arduino และทำการ upload sketch เข้าไปที่ ESP-01 ที่เราต่อวงจรเตรียมเอาไว้ เมื่อเรียบร้อยแล้วก็ทดสอบกดสวิตซ์ ระบบจะทำการส่งข้อความมาหาเราที่ Telegram ของเราแล้วครับ (Download Source Code)

โดยจากโค้ดให้แก้บรรทัดดังต่อไปนี้ โดยให้ใส่ค่าต่างๆ ตามที่เราได้มาจากขั้นตอนก่อนหน้านี้นะครับ

1
2
3
4
const char* ssid = "WIFI_SSID";
const char* password = "PASSWORD123";
const String AccessToken = "<YOUR_ACCESS_TOKEN>";
String PostData = "text=แจ้งเตือน: สวิตซ์บน ESP8266 ถูกกด&chat_id=<YOUR_CHAT_ID>";
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
 
// WIFI SSID & Password
const char* ssid = "WIFI_SSID";
const char* password = "PASSWORD123";
 
// Telegram Server API
const int httpsPort = 443;
const char* host = "api.telegram.org";
const String AccessToken = "<YOUR_ACCESS_TOKEN>";
 
const int SwitchPin = 2; // GPIO2
int SwitchOldStatus = HIGH;
int SwitchNewStatus = HIGH;
 
void setup(void){
  Serial.begin(9600);
 
  pinMode(SwitchPin, INPUT);
 
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
 
  // Wait for connection
  while(WiFi.status() != WL_CONNECTED){
    delay(500);
  }
}
 
void loop(void){
 
  // Read Data From Switch
  SwitchNewStatus = digitalRead(SwitchPin);
 
  if(SwitchNewStatus == LOW && SwitchNewStatus != SwitchOldStatus){
 
    String PostData = "text=แจ้งเตือน: สวิตซ์บน ESP8266 ถูกกด&chat_id=<YOUR_CHAT_ID>";
 
    WiFiClientSecure client;
    Serial.print("connecting to ");
    Serial.println(host);
 
    if (!client.connect(host, httpsPort)) {
      Serial.println("connection failed");
      return;
    }
 
    // POST
    client.print(String("POST ") + "/bot" + AccessToken + "/sendMessage HTTP/1.1\r\n" +
             "Host: " + host + "\r\n" +
             "User-Agent: ESP8266-Notification\r\n" +
             "Content-Type: application/x-www-form-urlencoded\r\n" +
             "Cache-Control: no-cache\r\n" +
             "Content-Length: " + String(PostData.length()) + "\r\n" +
             "\r\n" +
             PostData);
 
    // Header
    Serial.println("-------Response Header-------");
    while (client.connected()) {
      String line = client.readStringUntil('\n');
      if (line == "\r") {
        break;
      }
 
      Serial.println(line);
    }
 
    // Body
    Serial.println("-------Response Body-------");
    String body = client.readStringUntil('\n');
    Serial.println(body);
 
  }
 
  SwitchOldStatus = SwitchNewStatus;
  delay(500);
}

หลังจากทำการ upload sketch ให้ลองเปิด Serial Monitor ขึ้นมาดู Log และทดสอบกดสวิตซ์ดูได้เลยครับ จะเห็นว่ามีข้อมูลถูกส่งออกไปยัง API ของ Telegram แล้ว

TelegrameBot Allert From ESP 8266

ขั้นต่อไปก็เอาไปใช้งานจริง ให้ถอดตัว USB To UART ที่เราใช้ upload sketch ออกและต่อวงจรดังรูป

1
2
3
4
5
[ESP-01] --> [Battery]
VCC --> VCC (3.3v)
CH_PD --> VCC (3.3v)
GNC --> GND
GPIO-2 --> ต่อ pull-up กับสวิตซ์

TelegrameBot Allert From ESP 8266

หมายเหตุ: ปกติผมจะส่งข้อมูลจากเซ็นเซอร์ไปยัง Raspberry Pi ที่ทำหน้าที่ควบคุมทั้งระบบก่อน แล้วค่อยส่งจาก Raspberry Pi ออกไปยัง service อื่นๆ ข้างนอกอีกทีนะครับ เพราะถ้าต้องมาแก้ไขข้อความหรือเปลียน Access Token ผมคงแก้ไขจากฝั่งของ Raspberry Pi น่าจะง่ายกว่ามานั้ง upload sketch ใหม่

โดย LookHin ณ 30 January 2017 00:12 GMT

11 January 2017

Thep

Long Time No Thanks

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

อย่างไรก็ดี ผมก็ขอถือโอกาสนี้ ขอบคุณย้อนหลัง 11 เดือน สำหรับผู้ที่ได้ หย่อนสตางค์ลงหมวก เพื่อสนับสนุนงานพัฒนาซอฟต์แวร์เสรีของผม ดังนี้:

ขอขอบคุณสำหรับการสนับสนุนที่ผ่านมาของทุกท่านครับ ขอให้ทุกท่านมีความสุขความเจริญในหน้าที่การงาน มีสุขภาพแข็งแรง คิดสิ่งใดก็ขอให้สมความปรารถนานะครับ

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

ช่วงที่ผ่านมา งานซอฟต์แวร์เสรีของผมก็ยังอยู่ใน maintenance mode เช่นเคย โดยเป็นการดูแลโครงการต่าง ๆ ของ TLWG ซึ่งขณะนี้ได้ ย้าย ไปที่ GitHub แล้ว และ release รุ่นปรับปรุงออกมาเรื่อย ๆ ตามโอกาส ดังข่าวประกาศต่าง ๆ ที่เว็บ LTN ดังกล่าว พร้อมทั้งอัปโหลด แพกเกจ เข้า Debian ตามปกติ

ส่วนงานแปล ก็ยังคงอัปเดตคำแปลของ Xfce ใน development snapshot และตรวจทานคำแปลของ GNOME ตามที่โอกาสจะอำนวย ซึ่งก็เรียกได้ว่าไม่ได้ active เท่าเมื่อก่อน แต่ก็ยังไม่เลิกทำนะครับ

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

โดย Thep (noreply@blogger.com) ณ 11 January 2017 05:47 GMT

1 January 2017

Kitt

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 ณ 1 January 2017 01:23 GMT

27 December 2016

bact

Hacking Team RCS กับการดู “ข้อมูลเข้ารหัส” โดยไม่ต้องถอดรหัส

(ต่อเนื่องจากโพสต์นี้และโพสต์นี้ในเฟซบุ๊ก)

แม้จะยังไม่แน่ชัดว่าอุปกรณ์ชื่อ “SSLX-GEO” และ “SSLX-T200” ที่ทางกลุ่ม “พลเมืองต่อต้าน Single Gateway” พบในระบบที่อ้างว่าเป็นของกองทัพบกนั้นคืออะไร และทางกองทัพบกก็ได้ปฏิเสธข้อมูลดังกล่าวแล้ว

แต่เมื่อปีที่แล้ว มีเอกสารอีกชุดใน Wikileaks เป็นอีเมลและเอกสารส่งสินค้าของบริษัท Hacking Team ที่ระบุว่ามีการส่งสินค้า ติดตั้ง และทดสอบระบบส่งโปรแกรมฝังตัวเพื่อเข้าควบคุมเครื่องปลายทางที่ชื่อ Remote Control System (RCS) Galileo ในประเทศไทย เมื่อเดือนพฤษภาคม 2558

—-

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

พูดอีกอย่าง แม้ RCS จะไม่ได้ถอดรหัส แต่มันทำให้การเข้ารหัสหมดความหมาย

เมื่อ RCS เข้าควบคุมเครื่องได้แล้ว ก็แน่นอนว่าจะสามารถดูข้อมูลอื่นๆ ในเครื่องได้ด้วย ไม่เฉพาะข้อมูลการสื่อสาร

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

—-

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

1) ข้อมูลที่อยู่นิ่งๆ ในเครื่อง หรือ ข้อมูล ณ จุดพัก (data at rest)

2) ข้อมูลที่วิ่งไปมาระหว่างเครื่อง 2 เครื่อง หรือ ข้อมูลระหว่างเดินทาง (data in transit)

—-

การเข้ารหัสการสื่อสารด้วย SSL (Secure Sockets Layer) หรือ TLS (Transport Layer Security) นั้นเป็นการเข้ารหัสข้อมูลประเภทที่ 2 (ข้อมูลระหว่างเดินทาง) เพื่อให้ข้อมูลที่ส่งจากปลายทางหนึ่งไปยังอีกปลายทางหนึ่งมีความปลอดภัย ไม่สามารถถูกดูได้โดยเครื่องที่ต้องผ่านระหว่างทาง (ระบบอินเทอร์เน็ตทำงานคล้ายระบบไปรษณีย์ในแง่ที่ว่ากว่าข้อมูลจะถึงจุดหมาย ต้องฝากส่งกันหลายต่อหลายทอด)

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

เมื่อการดักและถอดรหัสข้อมูลประเภทที่ 2 (ข้อมูลระหว่างเดินทาง) ทำได้ยาก อีกวิธีที่จะดูข้อมูลได้ก็คือ พุ่งเป้าไปยังข้อมูลประเภทที่ 1 (ข้อมูล ณ จุดพำนัก) แทน

—-

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

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

—-

อ่านความสามารถส่วนหนึ่งของ RCS และรายละเอียดเกี่ยวกับอีเมลสอบถามและการติดตั้งทดสอบในประเทศไทยเมื่อพฤษภาคม 2558 — ระบบนี้อาจจะเกี่ยวหรือไม่เกี่ยวกับคำสั่งกระทรวงไอซีทีที่ 163/2557 ตั้งคณะทำงานทดสอบระบบเฝ้าติดตามออนไลน์ เมื่อ 15 ธ.ค. 2557

—-

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

และในกรณีข้อมูลการสื่อสารที่เป็นการสื่อสาร 2 ฝั่งนั้น แม้ปลายทางอีกฝั่งจะไม่ติดเชื้อ RCS แต่เนื่องจากข้อมูลการสื่อสาร (เช่นการแชต) นั้นมีการแลกเปลี่ยนรู้เท่ากันทั้ง 2 ฝั่ง ก็แปลว่าตัว RCS ก็จะรู้ข้อมูลการสื่อสารของอีกฝั่งได้ด้วย (เฉพาะที่มีการแลกเปลี่ยนกับเครื่องที่ติดเชื้อ)

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

—-

สิ่งที่พอจะสบายใจได้บ้าง (หรืออาจจะไม่ก็ได้นะ) ก็คือ

1) RCS นั้นจะต้องทำอย่างเจาะจงเป้าหมาย (ส่วนเป้าหมายจะมีได้กี่เป้าหมายนั้น ก็แล้วแต่ทรัพยากร)

2) RCS ฝังตัวที่เครื่องเป้าหมายโดยอาศัยรูรั่วของแอปและระบบปฏิบัติการ (exploits) ถ้าเราหมั่นอัปเดตระบบปฏิบัติการและแอปเสียหน่อย (ใครใช้ระบบรุ่นเก่าๆ ที่โดนผู้ผลิตลอยแพแล้วก็เสียใจด้วย) ไม่ติดตั้งแอปน่าสงสัย และใช้เน็ตอย่างระมัดระวัง ไม่คลิกลิงก์มั่ว ไม่เปิดไฟล์แนบแปลกๆ (RCS Agent สามารถติดมากับไฟล์เช่น PDF, PowerPoint, Word) ก็พอจะปลอดภัยระดับหนึ่ง

ภาพหน้าจอจากเอกสาร RCS Certificates Case Study (หน้า 1-5) ของ Hacking Team

RCS Exploit Portal
RCS Exploit Portal

คำถาม-ข้อกังวลที่ต้องตอบ

คำถามเร็วๆ ตอนนี้คือ 

1) ใครเป็นคนควบคุมระบบนี้? ใช้อำนาจตามกฎหมายใด?

2) กลไกอะไรจะตรวจสอบการใช้อำนาจจากระบบนี้ เป็นกลไกที่ทำงานได้จริงไหม?

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

4) ในซอร์สโค้ดที่หลุดออกมา มีการตั้งชื่อไฟล์ปลอมๆ ที่บ่งถึงรูปโป๊เด็ก เช่น “childporn.avi” และ “pedoporno.mpg” ซึ่งแม้อาจจะเป็นเรื่องตลกในกลุ่มโปรแกรมเมอร์ของ Hacking Team แต่ก็ทำให้เราเห็นถึงความเป็นไปได้ในการ “สร้างพยานหลักฐาน” – เรื่องนี้น่าห่วงมากๆ

วิดีโอโฆษณาของ Hacking Team

วิดีโอสาธิต RCS Galileo บน Windows

โดย bact ณ 27 December 2016 02:42 GMT

25 December 2016

Kitt

Ubuntu 16.10 Kernel 4.8.0 boot time

I don’t really know when, I suspect around 4.8.0-30 or a bit earlier that kernel boot time has noticeably increased. There is a bug/regression report on launchpad Quick fix ? Try 4.9 mainline ppa. Results from my systemd-analyze: 4.8.0-32 = 12.331s 4.9 = 5.041s

โดย kitty ณ 25 December 2016 17:11 GMT

LookHin

การติดตั้งและใช้งาน Tor แบบ Expert Bundle และทำเป็น Service ของ Windows พร้อมทั้งเปลี่ยนเส้นทางทุก 1 นาที

จริงๆ ผมเคยเขียนเรื่องการใช้งาน Tor ไปแล้ว 2 ครั้ง มาดูอีกทีเป็นช่วงเดือนเดียกันนี้ด้วย คือเดือนธันวาคมปี 2013 “ติดตั้งและใช้งาน Tor + Provoxy เพื่ออำพรางตัว” และธันวาคมปี 2014 “ติดตั้งและใช้งาน Tor + Vidalia บน Linux Mint เมื่อ ธันวาคม 2014” ที่ผ่านมาผมติดตั้งและใช้งานผ่าน Vidalia มาตลอดเพราะใช้งานง่ายดี แต่ตอนนี้ทางโครงการเขาเอา Vidalia ออกแล้ว และเหลือให้เฉพาะ Tor Browser ซึ่งก็เป็น Tor รวม Firefox Browser มาด้วยนั้นหละ แต่แบบนี้มีคนสอนใช้งานเยอะแล้ว เดี๋ยวเราข้ามไปติดตั้งกันแบบ Expert Bundle และทำมันเป็น Service ของ Windows และปรับเปลี่ยนคอนฟิกนิดหน่อยเพื่อให้มันเปลี่ยนเส้นทางทุกๆ 1 นาที

อย่างแรกก็เข้าไปดาวน์โหลดโปรแกรมกันก่อน ให้เลือกโหลดตัว Expert Bundle นะครับ

https://www.torproject.org/download/download.html.en

tor-expert

เมื่อโหลดมาแล้วให้ทำการ unzip และเอาไฟล์ที่ได้ไปวางไว้ที่ c:\Tor\ (จริงๆ วางที่ไหนก็ได้นะตามสะดวก)

tor-expert

จากนั้นทำการสร้างคอนฟิกไฟล์ ชื่อ torrc ไว้ที่โฟลเดอร์ C:\Tor\Data\Tor\

tor-expert

โดยใส่คอนฟิกไป 1 ตัวคือ MaxCircuitDirtiness 60 ค่านี้คือสั่งให้เปลี่ยนเส้นทางใหม่ทุกๆ 60 วินาที ค่าปกติจะเป็น 10 นาที แต่อันนี้เราต้องการให้เปลี่ยนเร็วขึ้นหน่อย (หน่วยวินาที) (แต่ค่าปกติที่ผมใช้คือ 5 นาที)

1
MaxCircuitDirtiness 60

tor-expert

จากนั้นทำการรัน tor ให้เป็น Service ของ Windows โดยใช้คำสั่ง tor –service install –options -f “C:\Tor\Data\Tor\torrc” โดยให้เปิด Command Prompt และเลือกรันเป็น Administrator

tor-expert

จากนั้นสั่งเพิ่ม Service Tor เข้าไปในระบบ

1
2
cd c:\Tor\Tor
tor --service install --options -f "C:\Tor\Data\Tor\torrc"

tor-expert

จากนั้นเข้าไปดูใน Service ของ Windows หน่อยหนึ่งว่ามี Tor Win32 Service ขึ้นมาแล้วหรือยัง เราสามารถสั่ง Stop และ Start service จากหน้านี้ก็ได้

tor-expert

หรือหากต้องการสั่ง Start และ Stop service ก็สามารถสั่งผ่านทาง command line ได้โดยใช้คำสั่งดังนี้ครับ

1
2
tor --service stop
tor --service start

tor-expert

และหากต้องการลบ Service ของ Tor ออกจากระบบก็ให้ใช้คำสั่ง

1
tor --service remove

เท่านี้หละครับ เราติดตั้ง Tor แบบ Beginner Expert เรียบร้อยแล้ว ต่อไปถ้าจะให้โปรแกรมอื่นๆ เข้ามาใช้งาน Tor เราก็แค่ไปกำหนดให้โปรแกรมนั้นวิ่งมาใช้งาน Tor ผ่าน SOCKS5 ที่พอร์ต 9050 หรือหากโปรแกรมของคุณไม่สามารถใช้งาน proxy ผ่าน SOCKS5 ได้ ก็ให้ติดตั้ง Privoxy ให้ฟอร์เวิร์ดพอร์ตมาที่ HTTP อีกทีก็ได้ครับ ผมเคยเขียนวิธีไว้แล้วเมื่อปลายปี 2013 “ติดตั้งและใช้งาน Tor + Provoxy เพื่ออำพรางตัว

ขั้นต่อไปเรามาติดตั้ง Google Chrome plugin เพื่อเอาไว้สลับเส้นทางว่าเราจะใช้ Tor หรือว่าไม่ใช้ โดยผมเลือกใช้ plugin ตัวนี้นะครับ “Proxy SwitchyOmega” โดยเมื่อติดตั้งเสร็จแล้วจะมีไอคอนกลมๆ ขึ้นทางขวามือ ให้คลิกแล้วเลือกไปที่ Options

tor-expert

ให้คลิกเลือกไปที่ Profile :: proxy แล้วตั้งค่าตามนี้ และกดปุ่ม Apply changes ด้านซ้ายมือเป็นอันเรียบร้อย

1
2
3
Protocal = SOCKS5
Server = 127.0.0.1
Port = 9050

tor-expert

เวลาที่เราจะใช้งาน Tor ก็ให้คลิกไปที่รูปวงกลมทางขวาแล้วเลือกไปที่ proxy หรือถ้าหากต้องการกลับมาใช้แบบไม่ผ่าน Tor ก็คลิกเลือกไปที่ Direct

ทีนี้ก่อนจบ เราก็มาทดสอบดู IP ที่เราได้กันหน่อยว่ามันเปลี่ยนทุกๆ 1 นาทีจริงไหม โดยเปิดเข้าไปที่ https://check.torproject.org/ แล้วลองจับเวลาดูเองนะครับ ว่าทุกๆ 1 นาที เราได้ IP ใหม่มาหรือยัง ถ้าต้องการเปลี่ยนระยะเวลาก็เข้าไปแก้ไขที่ไฟล์ torrc แล้วเปลี่ยนเป็นค่าที่ต้องการแล้วสั่ง restart service ก็เรียบร้อย

tor-expert

ขอให้ทุกคนปลอดภัย

ข้อมูลอ้างอิง : https://www.torproject.org/docs/tor-manual.html.en

โดย LookHin ณ 25 December 2016 04:07 GMT

9 December 2016

Kitt

เรามาเป็นแอดมินได้ไง

tl;dr ไม่รู้เหมือนกัน 55+ ปี 3 วิชา Computer Networks สอน TCP/IP (อ.ยืน อ.เขมทัต อ.ปรีดา ม.เกษตร) ประกอบกับที่ภาคคอมคณะไรสักอย่างได้รับเครื่อง SUN SPARCStation 5 มาจากมูลนิธิ Hitachi เครื่องนี้ต่ออินเทอร์เน็ตผ่าน MODEM + leased line ไปที่ศูนย์คอมพิวเตอร์ ผมกับเพื่อนไม่กี่คนมี account บนเครื่องนี้ telnet จาก PC ไปหัดใช้คำสั่ง UNIX ใช้อินเทอร์เน็ตได้ (pine, talk, gopher, inn, irc (#thai #siam …)) .. ตอนนั้นเป็นของใหม่ ของแพง(มาก) มีโอกาสได้ใช้ก็ตื่นตาตื่นใจ ปี 4 เพื่อนคนนึงทำโปรเจคเกี่ยวกับอินเทอร์เน็ต ขอเครื่อง 486 มาลง BSD ได้แผ่นติดตั้ง … Continue reading เรามาเป็นแอดมินได้ไง

โดย kitty ณ 9 December 2016 02:17 GMT

7 December 2016

Kitt

เรามาเขียนโค้ดได้ไง

ปี 2529 อยู่ ม.2 ไม่เคยเล่นเกม ไม่เคยใช้โปรแกรมสำเร็จรูป แตะคอมพิวเตอร์ครั้งแรกก็หัดโค้ดเลย มันคือเครื่อง VTech Laser 200 (https://en.wikipedia.org/wiki/VTech_Laser_200) ROM เป็น BASIC interpreter สมัยนั้นเรียกของพวกนี้ว่า home computer ก็ไม่แน่ใจว่าเครื่องนี้เป็นของใคร แต่มันวางอยู่ที่บ้านที่ไปอาศัยอยู่ช่วงนั้น หัดจากคู่มือของเครื่อง (ภาษาอังกฤษ) หนังสือตัวอย่างโปรแกรมที่แถมมา จนเขียน BASIC เป็น ม.ปลาย ที่โรงเรียนสอนภาษา Logo .. ช่วงนั้นมีเครื่อง PC ที่บ้านแล้ว รับจ้างเขียนโปรแกรม พิมพ์รายงาน ป.ตรี รับจ้างเขียน inventory ให้ รพ.ศรีนครินทร์ (Clipper/Netware) โปรเจคจบเขียน C/C++ เป็นโปรแกรมบน Windows ป.โท ระหว่างเรียนเขียน C, C++, CLIPS, LISP, Prolog, OCaml, Smalltalk, … Continue reading เรามาเขียนโค้ดได้ไง

โดย kitty ณ 7 December 2016 20:10 GMT

6 December 2016

Kitt

€2.99/mo. Scaleway VC1S

Same tools, same OS as $5/month: DigitalOcean vs Vultr dd write bs=4k count=10k 100k 1M 403 398 184 MB/s dd read bs=4k 2.0 GB/s sysbench --test=cpu --cpu-max-prime=10000 run 17.9875 sec. stress-ng --cpu 1 --cpu-method all -t 30 94.22 ops/sec The disk performance is comparable to those of DO/Vultr. But, even equipped with 2 x 64-bit x86 processor, … Continue reading €2.99/mo. Scaleway VC1S

โดย kitty ณ 6 December 2016 09:22 GMT

5 December 2016

Kitt

Password authentication must die .. soon.

Password authentication depends on user input. To make it safe, one of the requirement is that you need to do it safely and quickly enough and hope that nobody could catch what you type on the keyboard. Nowadays, we can’t hope such. With naked eyes, we can simply read gestures, types, presses most of people … Continue reading Password authentication must die .. soon.

โดย kitty ณ 5 December 2016 09:32 GMT

AlphaGo and the future of AI.

The Go match between AI and pro is very interesting. I’m a fan of igo/weiqi/baduk. I used to play constantly, and was rated SDK (single-digit kyu). Also, as a computer scientist, Go is the only board game that the best human can defeat the best AI. Well, not anymore. AlphaGo, with deep/machine learning, was well-trained, and … Continue reading AlphaGo and the future of AI.

โดย kitty ณ 5 December 2016 09:32 GMT

Graylog Extractor for Fortigate Firewall

I’ve been using Graylog in production for awhile. It’s a great log analysis tool, backed by elasticsearch. Conceptually, graylog is pretty much like splunk. I consolidate approximately 170-200 million log messages to graylog everyday. So, I need to optimize them well enough. Few days ago, I started to use Fortigate extractors from a git repo. It … Continue reading Graylog Extractor for Fortigate Firewall

โดย kitty ณ 5 December 2016 09:32 GMT

ceph

วันนี้ ceph เดี้ยง สืบพบว่ามาจาก monitor node 2 ใน 3 ตัว ..  ทั้งสองตัว เป็น VM connect ได้ daemon running  แต่ disk ของตัว host เป็น read-only .. พอ monitor พยายามบันทึกข้อมูลลง disk ไม่ได้มันก็ค้าง พอ monitor ค้าง ceph cluster ทั้งก้อนหยุดทำงาน ได้ใช้ท่า troubleshooting: stop monitor / dump monmap / ลบ monitor node ที่ใช้งานไม่ได้ออกไปจาก monmap / inject monmap ตัวใหม่เข้า monitor node ที่ใช้งานได้ restart monitor … Continue reading ceph

โดย kitty ณ 5 December 2016 09:16 GMT

do-release-upgrade and PHP7

16.04.1 ออกมาได้ประมาณหนึ่งสัปดาห์ 14.04 ก็เริ่มจะ upgrade กันได้ วันนี้สั่ง do-release-upgrade เรียบร้อยดี ลง PHP7 เพิ่ม / เอา PHP5 ออก / แก้ไข socket path = เว็บกลับมาปกติ ง่ายเกินไปนะ :P

โดย kitty ณ 5 December 2016 09:16 GMT

$5/month: DigitalOcean vs Vultr

Tools: dd, sysbench, stress-ng. I know,  you’d say they are NOT benchmark tools. I don’t care, I just need quick tests. Here we go: dd write bs=4k count=10k 100k 1M do: 350 465 424 MB/s vultr: 699 538 466 MB/s dd read bs=4k do: 475 MB/s vultr: 2.7 GB/s sysbench --test=cpu --cpu-max-prime=10000 run do:  14.2562 … Continue reading $5/month: DigitalOcean vs Vultr

โดย kitty ณ 5 December 2016 07:44 GMT

28 November 2016

bact

ปลาดาวออฟฟิศ

วันนี้พี่นุสรณ์โพสต์ ขอเก็บไว้หน่อย 14 ปีละ

Pladao Office Credits

ตอนนั้นนอกจากทำ spec ทำ test case ตรวจคำแปล UI ก็ยังเขียนเอกสารด้วย โชคดีมีคนเก็บไว้บ้าง วันนี้ลองกูเกิล “Pladao Office” ก็เจอ

ข้อมูลทั่วไป
http://ftp.ji-net.com/pladao/2.0/readme.html

โดย bact ณ 28 November 2016 04:48 GMT

The Crown

เข้าใจว่า The Crown ในชื่อซีรีส์ มันไม่ใช่มงกุฎ แต่หมายถึงหน่วยทางการเมือง เป็น Crown เดียวกับ Crown ใน Crown prosecutor (อัยการ, ทำนองเดียวกับ public prosecutor), Crown Estate (UK) หรือ Crown Property Bureau (สำนักงานทรัพย์สินส่วนพระมหากษัตริย์ ของไทย)

The Crown เป็นแนวคิดที่เริ่มพัฒนาในอังกฤษ เพื่อแยกอำนาจของกษัตริย์ (crown) ออกมาจากตัวกษัตริย์ (monarch)

การแบ่งแยกในเชิงแนวคิดนี้สำคัญสำหรับ Commonwealth realm ด้วย เพราะในทางบุคคล แม้จะเป็นกษัตริย์คนเดียวกัน (แง่เลือดเนื้อ-กายภาพ) แต่ในทางอำนาจ ถือว่าเป็นอำนาจคนละอำนาจกันในแต่ละประเทศ (เป็นอลิซาเบ็ธเดียวกัน แต่เป็นคนละควีนกันในแคนาดาและออสเตรเลีย)

เวลาอ้างอำนาจในทางปกครอง ไม่ว่าจะฝ่ายบริหาร นิติบัญญัติ หรือตุลาการ จะอ้างไปที่ crown ไม่ใช่ monarch
เช่น ในการฟ้องคดีที่รัฐเป็นผู้ฟ้อง แม้จะเขียนว่า Rex/Regina (ราชา/ราชินี) v … แต่เวลาอ่านออกเสียงจะอ่านว่า The Crown v …

….

อันนี้คิดต่อเฉยๆ ว่า การพยายามนำแนวคิด The Crown มาใช้ในไทย หลังเปลี่ยนแปลงการปกครอง แต่พอไม่มีรูปคำมารองรับ (ไม่มีคำที่ใช้แทนคำว่า crown ได้ตรงๆ) ก็ทำให้แนวคิดมันไม่มีที่อยู่ที่แข็งแรงรึเปล่า

Crown Property Bureau หรือ สำนักงานทรัพย์สินส่วนพระมหากษัตริย์ ในตอนแรกของไทยพยายามแยกทรัพย์สินตรงนี้ออกมาจากจากทรัพย์สินส่วนพระองค์ แรกๆ รัฐบาลก็มีอำนาจจัดการส่วนนี้จริง แต่ทำไปทำมา กลายเป็นดินแดนที่คนทั่วไปเชื่อว่าเป็นของกษัตริย์ (monarch แบบมีเลือดเนื้อ) ในแบบที่ในทางปฏิบัติ รัฐบาลเข้าไปยุ่งได้ยากแล้ว

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

โดย bact ณ 28 November 2016 04:26 GMT

18 November 2016

bact

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

ช่วงที่ผ่านมา นั่งดูร่างกฎหมายจำนวนหนึ่ง อย่างร่างพ.ร.บ.คอมพิวเตอร์ ร่างพ.ร.บ.คุ้มครองข้อมูลส่วนบุคคล และร่างพ.ร.บ.กสทช. ก็เลยผ่านตาพวกที่มา คุณสมบัติ สัดส่วน ของคณะกรรมการนั่นนี่ตามกฎหมาย เลยขอโน๊ตที่สังเกตเห็นไว้ตรงนี้หน่อย จำนวนนึงเคยเขียนไว้บนเฟซบุ๊กแล้ว [1] [2] แต่อันนี้มาเขียนเพิ่ม และจะได้หาได้ง่ายๆ ด้วย เฟซบุ๊กมันหายาก (เขียนค้างมาจะสามเดือน เพิ่งจะเสร็จ…)

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

ประเภทและที่มาของกรรมการ

กรรมการในคณะกรรมการนี่มีที่มาหลายได้แบบ เช่น

กรรมการที่ไม่ได้ทำงานเต็มเวลาให้กับคณะกรรมการ

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

อย่างกรณีคณะกรรมการคุ้มครองข้อมูลส่วนบุคคล ในร่างพ.ร.บ.คุ้มครองข้อมูลส่วนบุคคล (ฉบับจากปี 2558 ที่ผ่านการตรวจจากสำนักงานคณะกรรมการกฤษฎีกาแล้ว) ก็มีกรรมการโดยตำแหน่งและกรรมการผู้ทรงคุณวุฒิทั้งหมด ไม่มีกรรมการที่ทำงานเต็มเวลาเลย กระทั่งคนที่มารับตำแหน่งเลขานุการกรรมการเอง ก็ยังเป็นเลขานุการให้กับคณะกรรมการการรักษาความมั่นคงปลอดภัยไซเบอร์แห่งชาติอีกด้วย (เลขาธิการสำนักงานคณะกรรมการการรักษาความมั่นคงปลอดภัยไซเบอร์แห่งชาติเป็นเลขานุการของทั้งสองคณะกรรมการนี้โดยตำแหน่ง)

ตรงนี้ไม่ได้บอกว่ากรรมการที่ไม่ได้ทำงานเต็มเวลาไม่ดี แต่คงต้องพิจารณาอย่างน้อย 2 เรื่อง คือ 1) ภาระงาน 2) ความเป็นอิสระในการทำงาน — ถ้าคณะกรรมการไหนมีภาระงานเยอะและจำเป็นต้องมีความเป็นอิสระสูง กรรมการที่ทำงานได้เต็มเวลาและไม่ได้ผูกอยู่กับหน่วยงานอื่นก็น่าจะเหมาะกว่าเพราะมีเวลาทำงานได้เต็มที่มากกว่า และการตัดสินใจก็น่าจะทำได้เต็มที่มากกว่าด้วย ไม่ต้องเกรงใจใคร

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

สัดส่วนตัวแทน-การขัดกันของผลประโยชน์-การแยกบทบาทผู้กำกับกิจการ

นอกจากนี้ก็ยังมีประเด็นความเหมาะสมในการปฏิบัติหน้าที่ด้วย เช่นจะมีการขัดกันของผลประโยชน์ (conflict of interest) ไหม คือถ้าคณะกรรมการนี้ออกแบบมาเพื่อเป็น ผู้ตัดสินไกล่เกลี่ยคดี หรือเป็นผู้กำกับดูแล (regulator) ก็ไม่ควรจะเอาคนที่เป็นผู้ถูกกำกับมาเป็น ไม่งั้นก็จะเหมือนเอาผู้เล่นมาเป็นกรรมการเสียเอง ก็อาจจะไม่เป็นธรรมกับผู้เล่นอื่น

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

อย่างไรก็ตาม การกำหนดคุณสมบัติในแง่ที่มา-สัดส่วนตัวแทน อาจไม่จำเป็นต้องเป็น “กรรมการโดยตำแหน่ง” ก็ได้ เช่นอาจระบุกว้างๆ ให้มีภาคเอกชนที่เกี่ยวข้องกี่คนหรืออย่างน้อยกี่คนก็ได้ เช่นในร่างพ.ร.บ.คอมพิวเตอร์ ฉบับ 30 ก.ย. 2559 ที่ยังอยู่ในระหว่างพิจารณา มาตรา 20/1 ที่มีการตั้งคณะกรรมการกลั่นกรองข้อมูลคอมพิวเตอร์ วรรคสองระบุว่า “ให้รัฐมนตรีแต่งตั้งคณะกรรมการกลั่นกรองข้อมูลคอมพิวเตอร์ตามวรรคหนึ่งอย่างน้อยหนึ่งคณะ โดยแต่ละคณะให้มีจำนวนห้าคน ซึ่งสองในห้าต้องมาจากผู้แทนภาคเอกชนที่เกี่ยวข้องและให้ได้รับค่าตอบแทนตามที่คณะรัฐมนตรีกำหนด”

ความรู้และประสบการณ์

สำหรับการกำหนดคุณสมบัติด้านความรู้หรือประสบการณ์ของกรรมการ กฎหมายบางฉบับอาจจะระบุลงไปเลยว่า ต้องการกรรมการที่มีความเชี่ยวชาญด้านไหนๆ กี่คน (เช่น ให้มีกรรมการด้านกฎหมาย 1 คน ด้านผู้บริโภค 1 คน ด้านวิศวกรรม 1 คน) ในขณะที่กฎหมายบางฉบับอาจจะเขียนรวมๆ (เช่น ให้มีกรรมการด้านกฎหมาย ด้านผู้บริโภค ด้านวิศวกรรมรวม 3 คน แบบนี้ก็เป็นไปได้ว่า อาจจะได้นักกฎหมายด้านการคุ้มครองผู้บริโภคมา 1 คน [กฎหมาย+ผู้บริโภค] และวิศวกรอีก 2 คน)

ตัวอย่างเช่น ในมาตรา 6 ของพ.ร.บ.องค์กรจัดสรรคลื่นความถี่และกำกับกิจการวิทยุกระจายเสียงวิทยุโทรทัศน์ และกิจการโทรคมนาคม หรือ พ.ร.บ.กสทช. ฉบับปี พ.ศ. 2553 (ฉบับที่ใช้อยู่ปัจจุบันนี้) จะเขียนแจกแจงเลย ว่าในคณะกรรมการกสทช. จะกรรมการด้านใดจำนวนกี่คน

มาตรา 6 พ.ร.บ.กสทช. พ.ศ. 2553
มาตรา 6 พ.ร.บ.กสทช. พ.ศ. 2553

 

ในขณะที่ในร่างมาตรา 6 ใหม่ที่กำลังแก้ไขอยู่ เขียนว่าอยากให้มีด้านใดบ้าง และเขียนให้จำนวนคณะกรรมการทั้งหมดแบบรวมๆ 7 คน

มาตรา 6 ร่างพ.ร.บ.กสทช. (ฉบับที่สคก.ตรวจพิจารณาแล้ว - 2558)
มาตรา 6 ร่างพ.ร.บ.กสทช. (ฉบับที่สคก.ตรวจพิจารณาแล้ว – 2558)

 

อีกตัวอย่างเช่น ในมาตรา 7 ของร่างพ.ร.บ.คุ้มครองข้อมูลส่วนบุคคล ระบุว่าให้มี “กรรมการผู้ทรงคุณวุฒิ จำนวนห้าคน ซึ่งคณะรัฐมนตรีแต่งตั้งจากผู้มีความรู้ ความเชี่ยวชาญ และประสบการณ์เป็นที่ประจักษ์ในด้านการคุ้มครองข้อมูลส่วนบุคคล ด้านการคุ้มครองผู้บริโภค ด้านเทคโนโลยีสารสนเทศและการสื่อสาร ด้านสังคมศาสตร์ ด้านกฎหมาย ด้านสุขภาพ หรือด้านอื่นที่เกี่ยวข้องและเป็นประโยชน์ต่อการคุ้มครองข้อมูลส่วนบุคคล” คือมีความเชี่ยวชาญอยู่ 6 ด้านเป็นอย่างน้อยที่เขียนไว้ แต่มีกรรมการ 5 คน ก็อาจจะตีความได้สองแบบคือ 1) ให้หากรรมการที่เชี่ยวชาญมากกว่าหนึ่งสาขา 2) อาจจะไม่จำเป็นก็ได้ที่จะต้องมีความเชี่ยวชาญให้ครบ 6 ด้านนี้ในคณะกรรมการ (หรือกรรมการโดยตำแหน่งอาจจะมีใครเชี่ยวชาญเรื่องที่ขาดไปก็ได้?)

มาตรา 7 ร่างพ.ร.บ.คุ้มครองข้อมูลส่วนบุคคล (ฉบับที่สคก.ตรวจพิจารณาแล้ว - 2558)
มาตรา 7 ร่างพ.ร.บ.คุ้มครองข้อมูลส่วนบุคคล (ฉบับที่สคก.ตรวจพิจารณาแล้ว – 2558)

 

เรื่องน่าสนใจอีกอันก็คือ ในกรณีที่ต้องการนักวิชาการ บางกฎหมายจะกำหนดว่าให้คัดเลือกจากอาจารย์ที่มาจากมหาวิทยาลัยของรัฐ เช่นในร่างพ.ร.บ.คอมพิวเตอร์ ฉบับ 17 ส.ค. 2559 (ร่างฉบับนี้เก่าแล้ว ปัจจุบันหน้าตาที่มาเปลี่ยนไปแล้ว ยกมาเป็นตัวอย่างเท่านั้น) มาตรา 20/1 ที่มีการตั้งคณะกรรมการกลั่นกรองข้อมูลคอมพิวเตอร์ มีตอนหนึ่งเขียนว่า “ผู้ทรงคุณวุฒิซึ่งมีความรู้ความเชี่ยวชาญด้านการสื่อสารมวลชนที่รัฐมนตรีแต่งตั้งจากอาจารย์มหาวิทยาลัยของรัฐหนึ่งคน” แบบนี้อาจารย์มหาวิทยาลัยเอกชนก็อดไป หรือแม้จะระบุแค่เพียง “อาจารย์” ก็อาจทำให้คนที่มีความรู้เรื่องนั้นแต่ไม่ได้อยู่ในภาคการศึกษาหมดสิทธิ์เช่นกัน

มาตรา 20/1 ร่างพ.ร.บ.คอมพิวเตอร์
มาตรา 20/1 ร่างพ.ร.บ.คอมพิวเตอร์ (30 ก.ย. 2559)

กรรมการเฉพาะกิจ

สำหรับ “กรรมการเฉพาะกิจ” คณะกรรมการบางชุดอาจอนุญาตให้มีการเชิญบุคคลภายนอกที่ปกติไม่ใช่กรรมการมาเป็นกรรมการเฉพาะการประชุมหนึ่งๆ ที่เห็นว่าน่าจะเป็นประโยชน์ด้วยก็ได้ ตัวอย่างเช่น ในพ.ร.บ.สภาความมั่นคงแห่งชาติ พ.ศ. 2559 ที่ในมาตรา 6 วรรค 3 พูดถึง “สมาชิกเฉพาะกิจ” ที่มีฐานะเหมือนสมาชิกปกติ “เฉพาะการประชุมที่ได้รับเชิญ”

มาตรา 6 พ.ร.บ.สภาความมั่นคงแห่งชาติ พ.ศ. 2559
มาตรา 6 พ.ร.บ.สภาความมั่นคงแห่งชาติ พ.ศ. 2559

อายุของตัวกรรมการ

สิ่งหนึ่งที่ร่างพ.ร.บ.กสทช.ที่ตอนนี้อยู่ในสภา เปลี่ยนแปลงไปจากพ.ร.บ.ฉบับปี 2553 ที่ใช้อยู่ในปัจจุบัน ก็คือ ช่วงอายุ ที่จะเป็นกรรมการกสทช.ได้ จากปัจจุบัน 35-70 ปี เปลี่ยนเป็น 45-65 ปี ซึ่งก็นึกเหตุผลไม่ออก

ลองดูเกณฑ์อายุของสมาชิกคณะกรรมการอื่นๆ ได้เป็นตารางนี้

กรรมการ / คณะกรรมการ อายุไม่ต่ำกว่า อายุไม่เกิน
กรรมการ คณะกรรมการกิจการกระจายเสียง กิจการโทรทัศน์และกิจการโทรคมนาคมแห่งชาติ (ร่าง) 45 65
กรรมการผู้ทรงคุณวุฒิ คณะกรรมการดิจิทัลเพื่อเศรษฐกิจและสังคมแห่งชาติ (ร่าง) 65
กรรมการ คณะกรรมการคุ้มครองข้อมูลส่วนบุคคล (ร่าง)
กรรมการผู้ทรงคุณวุฒิ คณะกรรมการคุ้มครองผู้บริโภค
กรรมการ คณะกรรมการสิทธิมนุษยชนแห่งชาติ 35
กรรมการผู้ทรงคุณวุฒิ คณะกรรมการพัฒนาการบริหารงานยุติธรรมแห่งชาติ 35
กรรมการ คณะกรรมการนโยบายองค์การกระจายเสียงและแพร่ภาพสาธารณะแห่งประเทศไทย 35
กรรมการผู้ทรงคุณวุฒิ คณะกรรมการการมาตรฐานแห่งชาติ 25
กรรมการผู้ทรงคุณวุฒิ คณะกรรมการกำกับการให้บริการด้านนิติวิทยาศาสตร์ 35
กรรมการ คณะกรรมการกิจการกระจายเสียงและกิจการโทรทัศน์ (2543) 35 70
กรรมการ คณะกรรมการกิจการโทรคมนาคมแห่งชาติ (2543) 35 70
กรรมการ คณะกรรมการกิจการกระจายเสียง กิจการโทรทัศน์และกิจการโทรคมนาคมแห่งชาติ (2553) 35 70
กรรมการ คณะกรรมการการเลือกตั้ง (ร่างรธน.)
กรรมการ คณะกรรมการป้องกันและปราบปรามการทุจริตแห่งชาติ (ร่าง)

โดยรวมที่พบคือ ส่วนมากจะกำหนดอายุขั้นต่ำที่ 35 ปี และไม่ได้กำหนดว่าอายุห้ามเกินเท่าไร กฎหมายที่มีกำหนดเพดานอายุจะเป็นพวกกฎหมายไอซีที

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

ที่งงๆ คือ ตัวร่างพ.ร.บ.กสทช.กับร่างพ.ร.บ.ดิจิทัลฯ ก็มาไล่ๆ กันในรัฐบาลเดียวกัน แต่ทำไมเกณฑ์เรื่องนี้ต่างกัน คืออันแรกกำหนดอายุ 45 ปี อันหลังกำหนด 35 ปี เลยจะอธิบายว่าเป็นเรื่องอาวุโส ประสบการณ์ ก็อธิบายไม่ได้เต็มที่นัก เพราะคณะกรรมการกสทช.เองก็ต้องทำตามนโยบายของคณะกรรมการดิจิทัลฯอีกที (ซึ่งเป็นไปได้ที่กรรมการในคณะกรรมการดิจิทัลจะอายุน้อยกว่า)

และทำไปทำมา อายุกับประสบการณ์ สัมพันธ์กันแค่ไหน ประสบการณ์ 1 ปีในช่วง 1990-2000 กับประสบการณ์ 1 ปีในช่วง 2001-2010 เกี่ยวข้องกับเทคโนโลยีในปี 2020 เท่ากันไหม ที่สุดคือ มันโอเคแค่ไหนกับการกำหนดเกณฑ์อายุตายตัวขนาดนั้นในกฎหมาย

Audrey Tang รัฐมนตรีดิจิทัลของไต้หวันที่เพิ่งเข้ารับตำแหน่งไม่นานนี้ เธอพัฒนาเว็บค้นหาเนื้อเพลงจีนตั้งแต่อายุ 15 ปี ทำงานในบริษัทซอฟต์แวร์ตั้งแต่อายุ 19 ปี เป็นผู้จัดการโครงการโอเพนซอร์สอย่าง Perl เขียนซอฟต์แวร์สเปรดชีตออนไลน์เจ๋งๆ อย่าง EtherCalc เปิดบริษัทของตัวเองหลายแห่ง เป็นที่ปรึกษาให้กับบริษัทแอปเปิล ได้รับการยอมรับทั้งจากภาครัฐ ภาคเอกชน นักพัฒนาซอฟต์แวร์ และนักกิจกรรมสังคม แต่คุณสมบัติไม่น่าจะมาเป็นกสทช.ของไทยได้ในชุดหน้า เนื่องจากวันที่รับตำแหน่งเธออายุเพียง 35 ปี ไม่ถึงเกณฑ์ 45 ปี ของร่างพ.ร.บ.กสทช.ฉบับใหม่ … นี่ มาร์ก ซักเคอร์เบิร์ก ก็ไม่ได้เหมือนกัน ตอนนี้อายุแค่ 32 ปี

วาระดำรงตำแหน่ง

วาระการดำรงตำแหน่งของกรรมการจะถูกกำหนดไว้ในกฎหมายด้วย เช่น ถ้าเป็นกรรมการโดยตำแหน่ง ก็มาและไปตามตำแหน่งนั้นๆ ถ้าเป็นกรรมการที่สรรหามาก็อาจกำหนดให้ดำรงตำแหน่งวาระละ 3 ปี 4 ปี 5 ปี แล้วแต่ นอกจากนี้ยังอาจกำหนดด้วย ว่ากรรมการจะพ้นวาระเมื่อใด เช่น เมื่อตาย ลาออก ถูกถอดถอน ละเมิดกฎ หรืออายุเกิน

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

นอกจากนี้ ยังสามารถออกแบบให้การสรรหากรรมการเข้าสู่คณะกรรมการมีลักษณะเหลื่อมกันได้ด้วย ดังเช่น พ.ร.บ.องค์การกระจายเสียงและแพร่ภาพสาธารณะแห่งประเทศไทย พ.ศ. 2551 หรือพ.ร.บ.ไทยพีบีเอส ในมาตรา 23 วรรค 2 ออกแบบวาระของกรรมการนโยบายเอาไว้น่าสนใจดี

มาตรา 23 พ.ร.บ.ไทยพีบีเอส พ.ศ. 2551
มาตรา 23 พ.ร.บ.ไทยพีบีเอส พ.ศ. 2551

 

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

ไม่รู้ว่าการออกแบบแบบนี้มีที่มายังไง แต่เห็นว่ามันอาจจะทำหน้าที่ได้อย่างน้อย 3 อย่าง

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

2) ช่วยให้คณะกรรมการ “สดใหม่” อยู่เสมอ “อัปเดต” สมาชิกของคณะกรรมการได้ถี่ขึ้น แทนที่จะต้องรอให้ครบทุก 4 ปี แล้วอัปเดตรวดเดียว ก็สามารถอัปเดตเป็นขยักได้ทุก 2 ปี ตรงนี้ก็น่าจะช่วยให้หน้าตาของกรรมการสอดคล้องกับโจทย์ของสังคม ณ เวลานั้นมากขึ้น

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

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

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

อย่างไรก็ตาม การเพิ่มความหลากหลายในความคิดเห็นของกรรมการ-ลดโอกาสการครองงำโดยผู้สรรหากลุ่มเดียว ไม่ได้ทำได้ด้วยการทำให้การเข้าสู่วาระเหลื่อมกันเพียงอย่างเดียว แต่อาจใช้วิธีอื่นได้ด้วย เช่นการออกแบบอำนาจในการแต่งตั้ง การพ้นวาวระ และการถอดถอนกรรมการ ดังเช่นในกรณี ศาลสูงสุดแห่งสหรัฐอเมริกา (Supreme Court of the United States)  ที่ประกอบด้วยสมาชิก 9 คน (ประธาน 1 คน ตุลาการสทบอีก 8 คน) ประธานาบดีแห่งสหรัฐอเมริกามีอำนาจแต่งตั้งสมาชิกศาลสูงสุด (เสนอชื่อและให้สภารับรอง) แต่ไม่มีอำนาจถอดถอน สมาชิกศาลสูงสุดจะอยู่ในวาระไปตลอดชีวิตหรือจนกว่าจะลาออก ซึ่งในทางปฏิบัติ เนื่องจากสมาชิกจะตายไม่พร้อมกันและตายในช่วงประธานาธิบดีที่อาจจะมาจากคนละพรรคการเมือง ส่งผลให้สมาชิกของศาลสูงสุดมีความหลากหลายในทางอุดมการณ์การเมือง

โครงสร้างอำนาจ: คณะกรรมการรายงานต่อใคร ใครสั่งคณะกรรมการได้ ใครสรรหา-แต่งตั้ง-ถอดถอนกรรมการได้

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

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

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

ตัวอย่างเช่น กรณีผู้พิพากษาศาลฎีกาของสหรัฐอเมริกา (Supreme Court of the United States) ประธานาธิบดีมีอำนาจเสนอชื่อ (nominate) จากนั้นวุฒิสภาจะรับรอง (confirm) เพื่อแต่งตั้ง แต่เมื่อผู้พิพากษาคนนั้นรับตำแหน่งแล้ว ก็จะอยู่ในตำแหน่งไปตลอดชีวิต ไม่มีใครมีอำนาจถอดถอนได้ แม้แต่ประธานาธิบดี (เชื่อว่าเพื่อให้การทำงานไม่ถูกแทรกแซง)

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

เช่น มาตรา 18 พ.ร.บ.องค์การกระจายเสียงและแพร่ภาพสาธารณะแห่งประเทศไทย พ.ศ. 2551 ก็กำหนดให้มีคณะกรรมการสรรหา 15 คน มาจากสมาคมสื่อ สภานักวิชาการสื่อ เอ็นจีโอ สภาทนายความ สสส. และปลัดกระทรวง โดยระบุชื่อตำแหน่งและชื่อหน่วยงานลงในกฎหมายเลย — ซึ่งก็ถามได้เหมือนกัน ว่าทำไมต้องเป็นองค์กรเหล่านี้ด้วย ถ้าต่อไปมีองค์กรอื่นหรือบุคคลอื่นที่น่าจะเหมาะสมกว่า ทำไมเขาถึงมามีส่วนร่วมสรรหาด้วยไม่ได้

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

เนื่องจากงานของรัฐสมัยใหม่มีความซับซ้อนข้ามประเด็นข้ามความรับผิดชอบมากขึ้น อีกทั้งรัฐยังมีแนวโน้มจะลงมือทำเองน้อยลง และผันตัวไปเป็นผู้อำนวยการ (facilitator) หรือผู้กำกับกิจการ (regulator) มากขึ้น จำนวนคณะกรรมการต่างๆ จึงมีมากขึ้นเรื่อยๆ การสรรหาคณะกรรมการก็มากขึ้นตาม ประเทศอย่างสหราชอาณาจักรต้องการให้กระบวนการสรรหาเหล่านี้เป็นไปด้วยมาตรฐานที่สม่ำเสมอ โปร่งใสตรวจสอบได้ และมีความรับผิดต่อสาธารณะ ก็เลยจัดการให้มีหน่วยงานที่มาทำหน้าที่กำกับการสรรหาแต่งตั้งอีกที ชื่อว่า “คณะกรรมการเพื่อการแต่งตั้งตำแหน่งสาธารณะ” (Commissioner for Public Appointments) โดยคณะกรรมการนี้จะไม่ทำการสรรหาแต่งตั้งเอง แต่จะเป็นผู้ตรวจสอบและรับรองว่าเป็นไปตามกฎที่วางไว้หรือไม่

Commissioner for Public Appointments

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

แต่ไม่ใช่แค่คนที่อยู่บนหัวเท่านั้น แต่คนที่อยู่รอบๆ ที่จะทำงานด้วยกัน ช่วยเหลืองานกัน ก็มีส่วนเช่นกัน (และใครสั่งคนๆ นั้นได้? คนๆ นั้นต้องรายงานต่อใคร?) ว่าการทำงานจะมีอิสระและมีประสิทธิภาพได้แค่ไหน

โครงสร้างการทำงาน: คณะกรรมการมีใครช่วยงาน สั่งการใครได้

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

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

ร่างพ.ร.บ.การรักษาความมั่นคงปลอดภัยไซเบอร์แห่งชาติ (ฉบับเสนอครม. ม.ค. 2558) นอกจากให้มีคณะกรรมการการรักษาความมั่นคงปลอดภัยไซเบอร์แห่งชาติ (กปช.) แล้ว ในมาตรา 14 ยังตั้ง “สำนักงานคณะกรรมการการรักษาความมั่นคงปลอดภัยไซเบอร์แห่งชาติ” ขึ้นมาเป็นสำนักงานเลขานุการช่วยงานกปช.ด้วย โดยมาตรา 17 ให้สำนักงานมีหน้าที่ 13 ข้อ ซึ่งรวมถึงการประสานความร่วมมือทางปฏิบัติในการดำเนินงาน ประสานงานเพื่อรวบรวมข้อมูล บริหารแผนงานตามคำสั่งคณะกรรมการ รับผิดชอบงานธุรการ งานวิชาการ งานการประชุม และงานเลขานุการของคณะกรรมการ และปฏิบัติงานอื่นใดตามที่คณะกรรมการหรือคณะรัฐมนตรีมอบหมาย และในมาตรา 21 กำหนดให้มีเลขาธิการสำนักงาน ดูแลรับผิดชอบการปฏิบัติงานของสำนักงาน ขึ้นต่อต่อประธานกรรมการกปช. และเป็นผู้บังคับบัญชาพนักงานและลูกจ้างของสำนักงาน

ในขณะเดียวกัน ร่างพ.ร.บ.คุ้มครองข้อมูลส่วนบุคคล พ.ศ. … (ฉบับที่ผ่านการพิจารณาของสำนักงานคณะกรรมการกฤษฎีกาแล้วเมื่อ ก.ย. 2558) ในมาตรา 7 (ประกอบนิยามในมาตรา 5) กำหนดให้เลขาธิการสำนักงานคณะกรรมการการรักษาความมั่นคงปลอดภัยไซเบอร์แห่งชาติ เป็นเลขานุการและกรรมการโดยตำแหน่งของคณะกรรมการคุ้มครองข้อมูลส่วนบุคคล (และให้แต่งตั้งเจ้าหน้าที่ของสำนักงานมาช่วยงานได้อีก 2 ตำแหน่ง) และในมาตรา 16 ให้สำนักงานคณะกรรมการการรักษาความมั่นคงปลอดภัยไซเบอร์แห่งชาติทำงานวิชาการและธุรการให้กับคณะกรรมการคุ้มครองข้อมูลส่วนบุคคล

โครงสร้างความสัมพันธ์ คณะกรรมการการรักษาความมั่นคงปลอดภัยไซเบอร์แห่งชาติ - คณะกรรมการคุ้มครองข้อมูลส่วนบุคคล (ร่าง ก.ย. 2558)
โครงสร้างความสัมพันธ์ คณะกรรมการการรักษาความมั่นคงปลอดภัยไซเบอร์แห่งชาติ – คณะกรรมการคุ้มครองข้อมูลส่วนบุคคล (ร่าง ก.ย. 2558)

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

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

ถ้าลองดูที่แผนผังความสัมพันธ์ที่มาและที่ไปของอำนาจ ก็จะเห็นได้ว่า มันเอนไปทางฝั่งมั่นคงไซเบอร์มากกว่าด้านคุ้มครองข้อมูล ตรงนี้บอกอะไรกับเราไหม

** อัปเดต 28 พ.ย. 2559 — กมธ.สื่อสารมวลชน ของสภาขับเคลื่อนการปฏิรูปประเทศ เสนอปรับเปลี่ยนสัดส่วนของคณะกรรมการมั่นคงไซเบอร์ ให้เพิ่มกรรมการจากฝ่ายความมั่นคง(ทางการทหาร)เข้าไปอีก พร้อมให้พิจารณาแก้ไขร่างพ.ร.บ.มั่นคงไซเบอร์ส่วนอื่นๆ ตามยุทธศาสตร์ของฝ่ายความมั่นคงและเหล่าทัพ แปลว่าอำนาจก็ยิ่งเอนไปทางฝ่ายความมั่นคงทางการทหารมากขึ้นไหม? อำนาจในการคุ้มครองข้อมูลส่วนบุคคลในเชิงโครงสร้างคณะกรรมการก็อาจจะอ่อนลงโดยเปรียบเทียบหรือเปล่า? ถ้าวาดแผนผังใหม่ ก็จะได้แบบนี้ สังเกตตรงประธานคณะกรรมการมั่นคงไซเบอร์ จะเปลี่ยนจากรัฐมนตรีดิจิทัลเป็นนายกรัฐมนตรี และมีเพิ่มตำแหน่งรองประธาน 2 ตำแหน่ง หนึ่งในนั้นเพิ่มรัฐมนตรีกลาโหมเข้ามา

โครงสร้างความสัมพันธ์ คณะกรรมการการรักษาความมั่นคงปลอดภัยไซเบอร์แห่งชาติ - คณะกรรมการคุ้มครองข้อมูลส่วนบุคคล (ฉบับสภาขับเคลื่อนการปฏิรูปประเทศเสนอ พ.ย. 2559)
โครงสร้างความสัมพันธ์ คณะกรรมการการรักษาความมั่นคงปลอดภัยไซเบอร์แห่งชาติ – คณะกรรมการคุ้มครองข้อมูลส่วนบุคคล (ฉบับสภาขับเคลื่อนการปฏิรูปประเทศเสนอ พ.ย. 2559)

[นอกเรื่องนิด: พอดูจากข้อเสนอจากสภาขับเคลื่อนฯ ดูเหมือนนิยามคำว่า “ความมั่นคงปลอดภัยไซเบอร์” ที่หน่วยงานความมั่นคงโดยเฉพาะความมั่นคงทางทหารของไทยเข้าใจ จะรวมเรื่อง “เนื้อหาที่มนุษย์สื่อสารกัน” เข้าไปด้วย ไม่ใช่แค่เรื่องความมั่นคงปลอดภัยของตัวระบบสารสนเทศ — ซึ่งพอมองแบบนี้ก็ทำให้เข้าใจได้ ว่าทำไมกมธ.สื่อสารมวลชนถึงเข้ามาเกี่ยว]

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

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

อ้างอิง

  1. การเข้าสู่ตำแหน่งที่เหลื่อมกันของคณะกรรมการไทยพีบีเอส (Facebook)
  2. ช่วงอายุของกรรมการ ในร่างพ.ร.บ.กสทช.ล่าสุด (ก.ย. 2559) (Facebook)
  3. มาตรา 7 ร่าง พ.ร.บ.คุ้มครองข้อมูลส่วนบุคคล พ.ศ. ….
  4. มาตรา 7 ร่าง พ.ร.บ.องค์กรจัดสรรคลื่นความถี่และกำกับการประกอบกิจการวิทยุกระจายเสียง วิทยุโทรทัศน์ และกิจการโทรคมนาคม (ฉบับที่..) พ.ศ. ….
  5. มาตรา 8 ร่าง พ.ร.บ.การพัฒนาดิจิทัลเพื่อเศรษฐกิจและสังคม พ.ศ. ….
  6. มาตรา 11 พ.ร.บ.คุ้มครองผู้บริโภค (ฉบับที่ 2) พ.ศ. 2541
  7. มาตรา 6 พ.ร.บ.คณะกรรมการสิทธิมนุษยชนแห่งชาติ พ.ศ. 2542
  8. มาตรา 8 พ.ร.บ.พัฒนาการบริหารงานยุติธรรมแห่งชาติ พ.ศ. 2549
  9. มาตรา 19 พ.ร.บ.องค์การกระจายเสียงและแพร่ภาพสาธารณะแห่งประเทศไทย พ.ศ. 2551
  10. มาตรา 8 พ.ร.บ.การมาตรฐานแห่งชาติ พ.ศ. 2551
  11. มาตรา 11 พ.ร.บ.การให้บริการด้านนิติวิทยาศาสตร์ พ.ศ. 2559
  12. มาตรา 8 และมาตรา 14 พ.ร.บ.องค์กรจัดสรรคลื่นความถี่และกำกับกิจการวิทยุกระจายเสียงวิทยุโทรทัศน์ และกิจการโทรคมนาคม พ.ศ. 2543
  13. มาตรา 8 มาตรา 14 และมาตรา 50 พ.ร.บ.องค์กรจัดสรรคลื่นความถี่และกำกับกิจการวิทยุกระจายเสียงวิทยุโทรทัศน์ และกิจการโทรคมนาคม พ.ศ. 2543
  14. มาตรา 7 และมาตรา 20 พ.ร.บ.องค์กรจัดสรรคลื่นความถี่และกำกับการประกอบกิจการวิทยุกระจายเสียง วิทยุโทรทัศน์ และกิจการโทรคมนาคม พ.ศ. 2553
  15. มาตรา 222 ร่างรัฐธรรมนูญแห่งราชอาณาจักรไทย พ.ศ. …. (ฉบับลงประชามติ 7 ส.ค. 2559)
  16. มาตรา 232 ร่างรัฐธรรมนูญแห่งราชอาณาจักรไทย พ.ศ. …. (ฉบับลงประชามติ 7 ส.ค. 2559)
  17. มาตรา 6 พ.ร.บ.สภาความมั่นคงแห่งชาติ พ.ศ. 2559
  18. รายงานของคณะกรรมาธิการขับเคลื่อนการปฏิรูปประเทศด้านการสื่อสารมวลชน เรื่อง ผลการศึกษาและข้อสังเกตร่างพระราชบัญญัติว่าด้วยการรักษาความมั่นคง ปลอดภัยไซเบอร์ พ.ศ. ….
  19. มองกฎหมายเศรษฐกิจดิจิทัล ผ่านฐานคิดของฝ่ายความมั่นคง
  20. “ความมั่นคงไซเบอร์” แบบไทยๆ (Facebook)

โดย bact ณ 18 November 2016 05:56 GMT

25 October 2016

bact

ประวัติกฎหมายลงทะเบียนซิมใน 3 จังหวัดภาคใต้ (2548 – ยุคก่อนประกาศกสทช.)

Micro SIM card

ความรู้ใหม่ มีกฎหมาย “พ.ร.บ.ควบคุมโภคภัณฑ์ พ.ศ. 2495” และมีทางจะเอามาใช้ในเรื่องข้อมูลข่าวสารแบบนี้ได้ด้วย

ค้นเร็วๆ เรื่องการลงทะเบียนซิมใน 3 จังหวัดชายแดนใต้ (ก่อนยุคกสทช.บังคับลงทะเบียนทั้งประเทศ) ได้ข้อมูลดังนี้

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

เม.ย. 2548

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

1) ขอความร่วมมือจากคณะกรรมการกิจการโทรคมนาคม (กทช.) ในการออกกฎหมายควบคุม

หาก กทช.เห็นว่าไม่สามารถดำเนินการได้ ก็จะใช้แนวทางที่สอง คือ

2) ใช้ พ.ร.บ.ควบคุมโภคภัณฑ์ พ.ศ. 2495 ของกระทรวงพาณิชย์ ที่กำหนดให้รัฐสามารถควบคุมโภคภัณฑ์เพื่อสวัสดิภาพของประชาชนและความมั่นคงของประเทศ

ตอนนั้นตัวแทนหน่วยงานความมั่นคงและการข่าวที่ร่วมประชุมมีอาทิ พล.ต.อ.ชิดชัย วรรณสถิตย์ รองนายกรัฐมนตรี และรัฐมนตรีว่าการกระทรวงมหาดไทย พล.อ.ประวิตร วงษ์สุวรรณ ผู้บัญชาการทหารบก พล.ต.อ.เพรียวพันธ์ ดามาพงศ์ รองผู้บัญชาการตำรวจแห่งชาติ พล.ต.ท.ปรุง บุญผดุง ผู้บัญชาการตำรวจสันติบาล และพล.ต.ท.จุมพล มั่นหมาย ผู้อำนวยการสำนักข่าวกรองแห่งชาติ

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

ต่อมาได้มอบหมายให้กระทรวงเทคโนโลยีสารสนเทศและการสื่อสาร (ไอซีที) ไปดำเนินการ

พ.ย. 2548

กระทรวงไอซีที ออกประกาศกระทรวงฯ เรื่องการลงทะเบียนบัตรประจำตัวของผู้ใช้บริการ (ซิมการ์ด) โดยใช้อำนาจตาม มาตรา 11 ของพ.ร.ก.กำหนดการบริหารราชการในสถานการณ์ฉุกเฉิน พ.ศ. 2548 ข้อ 6

มาตรา 11 ในกรณีที่สถานการณ์ฉุกเฉินมีการก่อการร้าย การใช้กำลังประทุษร้ายต่อชีวิต ร่างกาย หรือทรัพย์สิน หรือมีเหตุอันควรเชื่อได้ว่ามีการกระทำที่มีความรุนแรงกระทบต่อความมั่นคงของรัฐ ความปลอดภัยในชีวิตหรือทรัพย์สินของรัฐหรือบุคคล และมีความจำเป็นที่จะต้องเร่งแก้ไขปัญหาให้ยุติได้อย่างมีประสิทธิภาพและทันท่วงที ให้นายกรัฐมนตรีโดยความเห็นชอบของคณะรัฐมนตรีมีอำนาจประกาศให้สถานการณ์ฉุกเฉินนั้นเป็นสถานการณ์ที่มีความร้ายแรง และให้นำความในมาตรา 5 และมาตรา 6 วรรคสอง มาใช้บังคับโดยอนุโลม เมื่อมีปรกาศตามวรรคหนึ่งแล้ว นอกจากอำนาจตามมาตรา 7 มาตรา 8 มาตรา 9 และมาตรา 10 ให้นายกรัฐมนตรีมีอำนาจดังต่อไปนี้ด้วย
[…]
(6) ประกาศห้ามมิให้กระทำการใดๆ หรือสั่งให้กระทำการใดๆ เท่าที่จำเป็นแก่การรักษาความมั่นคงของรัฐ ความปลอดภัยของประเทศ หรือความปลอดภัยของประชาชน

ส.ค. 2549

มติคณะรัฐมนตรี 2 ส.ค. 2549

ได้ผลไหม?

ส่วนความได้ผลของมาตรการนั้น เรียกว่าได้ผลอยู่ เพราะผู้ก่อการเลิกใช้โทรศัพท์มือถือจุดระเบิด หันไปใช้วิทยุสื่อสารจุดระเบิดแทน (ข้อมูลจากการพูดคุยกับคนในพื้นที่ ช่วงปี 2552-2554)

 

ภาพประกอบ: Micro SIM card โดย Tsahi Levent-Levi. สัญญาอนุญาตครีเอทีฟคอมมอนส์แบบแสดงที่มา 2.0

โดย bact ณ 25 October 2016 10:47 GMT

16 October 2016

bact

โลกของเราขาวไม่เท่ากัน: ข้อคำนึงเพื่อเว็บขาวดำแต่พอดี

ในช่วงเวลาที่คนจำนวนมากโศกเศร้า การแสดงออกนั้นมีได้หลากหลาย ผู้ดูแลเว็บไซต์และบัญชีสื่อสังคมจำนวนหนึ่งเลือกที่จะแสดงผลหน้าเว็บทั้งหมดเป็นขาวดำ (จริงๆ คือเทาไล่ระดับ หรือ grayscale แต่ก็เรียกกันติดปากว่า “ขาวดำ” อ่ะนะ) หรือสีโทนหม่นๆ หน่อย (ด้วยการปรับ saturate)

อย่างไรก็ตาม มีข้อควรระวังด้วย เพื่อไม่ให้กระทบกับการใช้งานหรือเกิดความผิดพลาดระหว่างใช้งาน โพสต์นี้ผมรวมเอาข้อแนะนำจากหลายๆ คนที่เจอบนเฟซบุ๊กมารวมเอาไว้ ขอขอบคุณคุณ @Nutn0nFufu Dogu, และ Kasiti Panthanom ด้วยครับ

ในช่วงแรกจะพูดถึงข้อควรระวังพื้นฐาน วิธีเฉพาะหน้าเพื่อทำสีโทนขาวดำ จากนั้นจะพูดถึงปัญหา ทางแก้ไขระยะยาว โดยอ้างอิงส่วนหนึ่งจาก Web Content Accessibility Guidelines ของ W3C และ human interface guidelines ของแอปเปิล

ปรับสี ให้คำนึงถึงการใช้งานด้วย

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

สีเบเยอร์

เลือกสี iPhone

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

สำหรับเว็บไซต์ที่

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

วิธีเฉพาะหน้า

ก่อนอื่นขอพูดถึง 2 เทคนิคที่ขณะนี้หลายเว็บไซต์ใช้อยู่ก่อน คือการใช้ CSS filter (ทั้ง grayscale() และ saturate()) กับการใช้ JavaScript แบบ “หว่านแห” ครอบจักรวาล เพื่อเปลี่ยนสี “ทั้งเว็บไซต์”

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

แม้เบราว์เซอร์รุ่นใหม่ๆ หน่อยปรับปรุงประสิทธิภาพของ filter grayscale() และ filter saturate() ให้ดีขึ้นมากแล้ว แต่ถ้าใช้ทั้งหน้ากับทุก element ก็อาจจะหน่วงบ้าง

จริงๆ แล้วในเรื่องนี้นั้น CSS filter ก็ยังทำงานได้เร็วกว่า JavaScript แต่สาเหตุที่บางคนเลือกใช้ JavaScript (เช่น grayscale.js) ก็เพราะตัว Internet Explorer ยังรองรับ CSS filter ได้ไม่เต็มที่

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

ตัวอย่าง CSS filter ที่ใช้กันมาก

[*|html|body|Element] {
    -webkit-filter: grayscale(100%);
    filter: grayscale(100%);
    filter: url('grayscale.svg#grayscale');
    filter: gray;
}

คุณ Fufu Dogu สรุปปัญหาที่พบบนเบราว์เซอร์ต่างๆ ไว้ดังนี้

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

ดังนั้นเว็บไซต์ไหนที่ซีเรียสกับความถูกต้องในการใช้งาน หลังแทรก CSS filter เข้าไป อย่าลืมทดสอบพวกการใช้งานหลักๆ ที่สำคัญๆ ด้วย ว่ายังใช้ได้ผลถูกต้องเหมือนเดิมไหม

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

ปรับสีแบบงานละเอียด

“งานละเอียด” ที่ว่า มี 2 ระดับความละเอียด (ไม่มีหลักอะไร แบ่งเอาเองนี่แหละ)

แบบแรกคือ ใช้ CSS override ทำ stylesheet ขึ้นมาใหม่อีกชุด แล้วแก้ไข CSS เพื่อแสดงผลขาวดำเป็นจุดๆ ไป (ไม่ได้สั่งให้ทำแบบครอบจักรวาลทุกจุด) เช่น แก้เฉพาะตัว img หรือกำหนด class ขึ้นมาเฉพาะอันหนึ่งแล้ว element ไหนต้องการให้เป็นขาวดำก็เพิ่ม class ดังกล่าวเข้าไป จากนั้นก็ไปประกาศใช้หลัง stylesheet หลัก เพื่อให้ค่าต่างๆ ตัว stylesheet ที่ประกาศทีหลังนี้ ไปทับ (override) ค่าเดิมของตัว stylesheet หลัก

แบบสอง ละเอียดขึ้นไปอีก คือออกแบบธีมใหม่เลย โดยให้คำนึงถึงด้วยว่า เมื่อ UI ถูกลดสีลงแล้ว จะส่งผลต่อการใช้งานอย่างไรบ้าง ผู้ใช้จะยังแยกแยะปุ่มต่างๆ ข้อความเตือนต่างๆ ได้เหมือนเดิมหรือไม่ (ซึ่งตรงนี้มันปรับด้วย CSS อย่างเดียวไม่ได้) มี visual element หรือ visual cue อะไรที่จะเสริมการแยกแยะได้อีกบ้าง

ทั้งสองวิธีนี้จะทำให้เรากำหนดแบบเจาะจงได้ ว่าตรงไหนของหน้าเว็บที่จะเป็นขาวดำบ้าง เช่นให้ทั้งหน้าเป็นขาวดำ ยกเว้นตรงส่วนที่เป็นรูปข่าวหรือแผนที่

ท้องฟ้าเรียงเป็นชั้นสีคล้ายธงชาติไทย

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

W3C แนะนำไว้ใน Web Content Accessibility Guidelines (WCAG) ว่า contrast ratio ของสีตัวอักษรขนาดเล็กและพื้นหลังควรอยู่ที่อย่างน้อย 4.5:1 และตัวอักษรขนาดใหญ่ (14 pt bold หรือ 18 pt regular ขึ้นไป) ควรมี contrast ratio ที่อย่างน้อย 3:1

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

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

ทั้งหมดนี้ควรคำนึงถึงสาระที่ต้องการจะสื่อหรือประโยชน์ใช้สอย รวมถึงประโยชน์ของสาธารณะ โดยเฉพาะเรื่องที่เกี่ยวกับความปลอดภัยสาธารณะ

bw-map

bw-js100

แปลงรูปเป็นขาวดำทีละเยอะๆ

สำหรับผู้ที่ต้องการแปลงรูปจำนวนมากให้เป็นขาวดำ บน Windows มีโปรแกรมฟรีอย่าง IrfanView และ XnView ช่วยได้ (สามารถปรับขนาด ตัดภาพ แปลงฟอร์แมต เปลี่ยนสีรูป เปลี่ยนชื่อรูป ได้ทีละเยอะๆ) ดูตัวอย่างการใช้ฟังก์ชัน batch processing จากคลิปนี้

สำหรับคนใช้ OS X (หรือ macOS .. ฮ่วย) และถนัด Automator (มากับโอเอสอยู่แล้ว) ลองทำ Workflow ตามรูปนี้ (กล่องล่างสุดคือ Apply ColorSync Profile: Gray Tone ถ้าไม่มี ใช้ Apply Quartz Composition Filter: Black and White แทนก็ได้ แต่มันจะออกแนวทำรูปเก่า ไม่ใช่ปรับสีเทาอย่างเดียว)

Convert to B&W Automator Workflow

เรียนรู้ร่วมกันเรื่องการใช้สีกับ UI

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

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

ตัวอย่างคำแนะนำจากแอปเปิลในการใช้สีในอินเทอร์เฟซของ iOS:

Be aware of colorblindness and how different cultures perceive color. People see colors differently. Many colorblind people, for example, find it difficult to distinguish red from green (and either color from gray), or blue from orange. Avoid using these color combinations as the only way to distinguish between two states or values. For example, instead of using red and green circles to indicate offline and online, use a red square and a green circle. Some image-editing software includes tools that can help you proof for colorblindness. Also consider how your use of color might be perceived in other countries and cultures. In some cultures, for example, red is used to communicate danger. In others, red has positive connotations. Make sure the colors in your app send the appropriate message.

ถอดความได้ดังนี้

“ให้คำนึงถึงภาวะตาบอดสีและการที่สีถูกรับรู้ต่างกันในต่างวัฒนธรรม

ผู้คนเห็นสีแตกต่างกัน ตัวอย่างเช่น คนที่ตาบอดสีจำนวนมากพบว่ามันยากจะที่จะแยกสีแดงออกจากสีเขียว (และแยกสีทั้งสองสีนั้นจากสีเทา) หรือแยกสีน้ำเงินออกจากสีส้ม ให้หลีกเลี่ยงการใช้สีดังกล่าวคู่กันในลักษณะที่มันจะเป็นเพียงหนทางเดียวที่จะแยกแยะระหว่างสถานะ 2 สถานะหรือค่า 2 ค่า

ตัวอย่างเช่น แทนที่จะใช้วงกลมสีแดงและวงกลมสีเขียวเพื่อบ่งบอกถึงสถานะออฟไลน์และออนไลน์ ให้ใช้สี่เหลี่ยมสีแดงและวงกลมสีเขียวแทน

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

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

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

ดูเพิ่มเติมเรื่องนี้ได้ที่ Understanding WCAG 2.0: Contrast และถ้าอยากทดลองว่าคนตาบอดสีเห็นสีอย่างไร มีซอฟต์แวร์จำลองให้ใช้ฟรีทั้งบน Windows และ Mac ชื่อว่า Color Oracle หรือถ้าจะลองกับหน้าเว็บไซต์แบบไม่ต้องลงโปรแกรมอะไรในเครื่อง ไปที่เว็บ Colorblind Web Page Filter

สรุป/ตัดจบ

 

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

 

(“โลกของเราขาวไม่เท่ากัน” เป็นชื่อหนังสือที่ ม.ล.ปริญญากร วรวรรณ และ วรพจน์ พันธุ์พงศ์ เขียนร่วมกัน – สำนักพิมพ์ openbooks)

โดย bact ณ 16 October 2016 05:43 GMT