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

14 October 2016

Kitt

พระบาทสมเด็จพระเจ้าอยู่หัวสวรรคต

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

โดย kitty ณ 14 October 2016 16:22 GMT

10 October 2016

Thep

Crypto Disk Shutdown Problem Workaround (2)

จาก blog ที่แล้ว ที่ได้เขียนถึงการแก้ขัดปัญหา shutdown เครื่อง Debian ที่ใช้ sysvinit ไม่ลง อันเนื่องมาจากการค้างที่ขั้นตอนการปิด crypto disk ด้วยการไปแก้ไฟล์ /lib/cryptsetup/cryptdisks.functions นั้น หลังจากนั้นก็ได้ครุ่นคิดหาวิธีที่เหมาะสมกว่านั้น จนถึงจุดที่คิดว่าน่าจะลองเสนอใน Debian ได้

ปัญหาของการแก้แบบเดิมก็คือ:

  1. ไม่ idempotent เพราะใน do_stop() ไป stop ดีมอน แต่ใน do_start() ไม่ได้สั่ง start ดีมอนใหม่ เพราะสมมุติว่ามันถูก start มาแล้ว และทำแค่หา PID ของดีมอนมาใส่ใน omit file เท่านั้น ซึ่งจะทำให้เกิดปัญหาดีมอนตายได้หากผู้ใช้สั่ง stop, start หรือ restart cryptdisks ขณะที่เครื่องทำงานอยู่ ไม่ใช่ผ่านการ shutdown หรือ reboot ตามปกติ
  2. อาจกระทบผู้ใช้ init ระบบอื่น เพราะฟังก์ชันนี้อาจถูกเรียกใช้จากระบบ init อื่นก็ได้ ทั้งที่ระบบเหล่านั้นอาจไม่ได้มีปัญหานี้ และอาจเกิดผลกระทบไม่พึงประสงค์ได้
  3. ไม่สวยและไม่ปลอดภัย การอ่านค่า PID ด้วย ps, grep, awk ดูเยิ่นเย้อและไม่ปลอดภัย เพราะ awk อยู่ใน /usr/bin ซึ่งเสี่ยงต่อการเรียกในระหว่างการบูตที่อาจจะยังมีแค่ /bin หรือ /sbin ให้ใช้

ปัญหาการกระทบระบบ init อื่น ทำให้มองไปที่การแก้ /etc/init.d/* แทน ซึ่งในอีกแง่หนึ่ง ก็เป็นการแก้ในระดับบนซึ่งเป็นระดับเดียวกับที่ service อื่น ๆ ใช้จัดการกับ sendsigs อยู่แล้ว จึงสรุปว่าน่าจะเหมาะสมด้วยประการทั้งปวง

เบื้องต้นผมจึงไปแก้ที่ /etc/init.d/cryptdisks โดยทำหลังจาก do_start เสร็จแล้ว:

--- /etc/init.d/cryptdisks.orig 2016-10-08 17:14:02.087652932 +0700
+++ /etc/init.d/cryptdisks 2016-10-10 09:42:15.301303974 +0700
@@ -31,9 +31,19 @@
  ;;
 esac
 
+UDEVD_DAEMON="/lib/systemd/systemd-udevd"
+
 case "$1" in
 start)
  do_start
+
+ # Omit udev daemon on halt to allow cryptsetup to do the close
+ UDEVD_PID=$(pidof $UDEVD_DAEMON)
+ if [ ! -z "$UDEVD_PID" ]; then
+  OMITDIR=/run/sendsigs.omit.d
+  mkdir -p $OMITDIR
+  echo $UDEVD_PID > $OMITDIR/systemd-udevd
+ fi
  ;;
 stop)
  do_stop

สังเกตว่าในรอบนี้ผมไม่ได้สั่ง stop ดีมอนหลัง do_stop อีกแล้ว เพราะทำให้เกิดปัญหาไม่ idempotent ดังที่กล่าวไปแล้ว อีกทั้งมันไม่จำเป็นเลย เพราะ service script ของ udev เองก็จะทำหน้าที่ stop ดีมอนนี้ให้อยู่แล้ว สิ่งที่จำเป็นมีแค่ชะลอไม่ให้ดีมอนถูกฆ่าจนถึงตอนนั้นก็พอ

และสังเกตว่าผมไม่ได้ใช้สคริปต์เยิ่นเย้อในการหา PID ของดีมอนอีกแล้ว ในเมื่อสามารถใช้ /bin/pidof ที่สั้นกระชับและปลอดภัยกว่า

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

ในรอบที่แล้วผมทำกับ udev ไม่สำเร็จ คาดว่าเป็นเพราะไปแทรกโค้ดที่ลำดับต้น ๆ ตั้งแต่เพิ่งเรียกดีมอนใหม่ ๆ ซึ่ง file system อาจจะยังไม่พร้อม อีกทั้งการเรียกใช้ awk จาก /usr/bin ก็ยังสุ่มเสี่ยงมากในระหว่างบูตอีกด้วย

รอบนี้ผมจึงลองใหม่ให้หายคาใจ โดยไปแทรกโค้ดในลำดับท้ายสุด หลังจาก Waiting for /dev to be fully populated... เสร็จแล้ว:

--- /etc/init.d/udev.orig 2016-10-10 09:40:47.937302585 +0700
+++ /etc/init.d/udev 2016-10-10 09:42:59.701304680 +0700
@@ -203,6 +203,14 @@
     else
  log_action_end_msg 0 'timeout'
     fi
+
+    # Omit systemd-udevd on halt to allow cryptsetup to do the close
+    UDEVD_PID=$(pidof $DAEMON)
+    if [ ! -z "$UDEVD_PID" ]; then
+        OMITDIR=/run/sendsigs.omit.d
+        mkdir -p $OMITDIR
+        echo $UDEVD_PID > $OMITDIR/udev
+    fi
     ;;
 
     stop)

ตรวจความเรียบร้อยแล้วก็ลองรีบูตเครื่องดู... ผ่าน!

ถึงจุดนี้ ก็เลยคิดว่าควรลองเสนอเข้าบั๊ก Debian #791944 ดู (ข้อความ #103) เพื่อให้ผู้ดูแลพิจารณาตามความเหมาะสม

โดย Thep (noreply@blogger.com) ณ 10 October 2016 04:37 GMT

7 October 2016

bact

เราเป็น เจ้า-ของ อะไรบ้างในยุคดิจิทัล?

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

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

ในยุคคอมพิวเตอร์ตั้งโต๊ะ

Hardware: เราเลือกฮาร์ดแวร์ได้ตามใจชอบ เสียก็ซ่อมหรือเปลี่ยนเป็นส่วนๆ ได้ พอจะทำได้ด้วยตัวเอง

Software: ซอฟต์แวร์ก็มีที่เป็นซอฟต์แวร์เสรี/โอเพ่นซอร์สให้เลือก จะใช้ OpenOffice, Linux อะไรก็ว่าไป

ในยุคโน๊ตบุ๊ก

Hardware: ตัวฮาร์ดแวร์นี่เริ่มยากละ เลือกเป็นชิ้นๆ ไม่ค่อยได้ มันมาเป็นเซ็ต ช่วงหลังๆ เสียก็ต้องเปลี่ยนยกบอร์ด ยังพออัปเกรดแรมและฮาร์ดดิสก์ได้ แต่ล่าสุด บางเครื่องเปิดฝาออกมาดูเองยังทำไม่ค่อยจะได้ อัปเกรดเองยาก หรือไม่รองรับการอัปเกรดเเลย กระจกจอภาพกับแผงวงจรจอติดกาวกันแน่น จะเปลี่ยนต้องเปลี่ยนทั้งฝาไปเลย

Software: ซอฟต์แวร์ไม่เปลี่ยนอะไรนัก เลือกได้เหมือนๆ เดิม ไม่ต่างจากสมัยเดสก์ท็อป

ในยุคมือถือ-คลาวด์

Hardware: ฮาร์ดแวร์นี่เสียก็เปลี่ยนยกแผงหรือแทบโยนทิ้งเพราะซ่อมไม่คุ้ม

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

ผู้(รับ)ใช้ ไม่ใช่ เจ้า-ของ

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

การควบคุมเหล่านี้มีหลายระดับ/ลักษณะ

ควบคุมด้วยความรู้

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

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

ควบคุมทางกายภาพ/การเข้าถึง

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

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

ควบคุมด้วยกฎหมาย

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

ผู้ผลิตอาจจะออกใบอนุญาตในการซ่อม เฉพาะคนที่มีใบอนุญาตถึงจะซ่อมได้ ก็จัดสอบกันไป

ชาวนาจะซ่อมรถแทรกเตอร์ของตัวเองเองก็ไม่ได้ เพราะบริษัทผู้ผลิตบอกว่ามันจะผิดกฎหมายลิขสิทธิ์นะ

เราอยู่ในสภาพแวดล้อมทางคอมพิวเตอร์ที่ต้องขออนุญาตกันมากขึ้นเรื่อยๆ

ทั้งๆ ที่มันเป็นเครื่องเป็นของที่เราซื้อมา แต่เราไม่ได้เป็น “เจ้า” ของมันอีกต่อไปแล้ว ผู้ผลิตต่างหากที่เป็น “เจ้า” จริงๆ ที่ควบคุมของที่เราซื้อมา

เรื่องที่เกี่ยวข้อง

ภาพประกอบโดย Karen Blakeman

โดย bact ณ 7 October 2016 15:49 GMT

Thep

Crypto Disk Shutdown Problem Workaround

เมื่อเช้านี้รีบูตเครื่องหลายรอบมาก กว่าจะได้เริ่มงาน เหตุเพราะถูกบั๊ก Debian #839888 ของ cryptsetup กัด สุดท้ายเลยได้นั่งลงแก้ปัญหา crypto disk ที่ทำให้ shutdown เครื่องไม่ลงมาเป็นปีเสียที

ผมใช้ encrypted file system ในโน้ตบุ๊กเครื่องปัจจุบันมาตั้งแต่เริ่มแรก แต่มาเริ่มมีปัญหาในรอบ Stretch นี้น่าจะเกือบปีแล้ว คือในการ shutdown เครื่องมันจะมาค้างตรงขั้น Stopping remaining crypto disks... แล้วก็ไม่ไปไหน แม้จะลองทิ้งไว้เป็นชั่วโมงก็ตาม สุดท้ายต้องยอมกดปุ่ม power ค้างเพื่อตัดไฟให้เครื่องมันดับ แล้วก็ให้มันมา recover journal ตอนเปิดเครื่องใหม่เอา

ปล่อยให้เป็นอย่างนี้มาเป็นปี เพราะยังไม่มีเวลาไปนั่งแก้ปัญหา ตัว cryptsetup เองก็มีอัปเดตใน Debian มาหลายรุ่น แต่ละรุ่นก็ได้แต่ภาวนาว่าจะมีการแก้ปัญหานี้ แต่ก็ไม่มี และในเมื่อเครื่องมันยังเปิดใช้งานได้ทุกวัน ผมเลยปล่อยให้มันเป็นอย่างนี้มาเรื่อย ๆ (ซึ่งไม่ควร)

จนกระทั่งเมื่อเช้ามันบูตไม่ขึ้น! เพราะรุ่น 2:1.7.2-1 มีบั๊กในสคริปต์ที่พิมพ์ผิด ซึ่งเป็นรายงานที่ผมเพิ่งจะได้อ่านหลังจากที่แก้ปัญหาด้วยตัวเองจนบูตเครื่องขึ้นมาต่อเน็ตได้แล้ว และปรากฏว่าแพตช์ที่แก้เองไปก็เหมือนกันกับแพตช์ในรายงานบั๊กเป๊ะ

แต่ก็ไม่ได้ทำให้ปัญหาเครื่องค้างตอน shutdown หายไป แต่ไหน ๆ ก็มือเปรอะไปแล้ว เลยนั่งไล่ต่อ จนกระทั่งไปพบคำสนทนาที่สาวไปจนถึงบั๊ก Debian #791944 ซึ่งทำให้รู้ว่าปัญหานี้เกิดเฉพาะกับระบบที่ใช้ sysvinit เท่านั้น ไม่เกิดกับ systemd และในความเห็น #72 Guilhem Moulin ได้พบว่าในขั้นตอนการ shutdown นั้น ดีมอน systemd-udevd ได้ถูก kill ไปก่อนที่จะถึงขั้นปิด crypto disk ทำให้คำสั่ง cryptsetup luksClose "$dst" ค้าง!

พิษ systemd อีกแล้วครับพี่น้อง!

แต่อย่างไรก็ดี ในเมื่อได้เบาะแสอย่างนี้แล้ว ถ้าเราสามารถทำให้ดีมอน systemd-udevd อยู่รอดจากการฆ่าจนถึงขั้นปิด crypto disk ได้ ปัญหาของเราก็จะหมดไป

แน่นอนว่าวิธีที่ถูกหลักการนั้น ต้องไปแก้ที่ระบบ init และสถานะล่าสุดของบั๊กดังกล่าว ก็ได้ reassign ไปให้แพกเกจ initscripts แล้ว แต่เครื่องผมล่ะ? ขอแก้ปัญหาเฉพาะหน้าระหว่างรอละกัน

วิธีแก้ขัดของผมคือ ในขั้นตอน sendsigs ของการ shutdown เพื่อ Asking all remaining processes to terminate นั้น เราสามารถละเว้นบางโพรเซสจากการรับ SIGTERM ได้ โดยเพิ่มไฟล์ที่เก็บ PID ไว้ในไดเรกทอรี /run/sendsigs.omit.d/ ตัวอย่างของ service ที่ทำแบบนี้ก็เช่น rsyslog และ wpasupplicant ผมก็จัดการยืมมาใช้กับ cryptdisks เสีย โดยแก้ไฟล์ /lib/cryptsetup/cryptdisks.functions ในฟังก์ชัน do_start() ให้เพิ่ม PID ของ systemd-udevd ไว้ในรายชื่อโพรเซสละเว้น:

--- cryptdisks.functions.orig   2016-10-07 12:11:36.104693329 +0700
+++ cryptdisks.functions        2016-10-07 13:53:10.640533260 +0700
@@ -758,6 +758,11 @@ do_start () {
        done 3<&1
        umount_fs

+       # Omit udev daemon on halt to allow cryptsetup to do the close
+       OMITDIR=/run/sendsigs.omit.d
+       mkdir -p $OMITDIR
+       ps x | grep "systemd-udevd[ ]" | awk '{print $1}' > $OMITDIR/systemd-udevd
+
        log_action_end_msg 0
 }

เท่านี้ก็สามารถ shutdown เครื่องโดยไม่ค้างได้แล้ว (บางคนอาจเสนอให้ไปทำใน /etc/init.d/udev ไปเลย แต่ผมลองแล้ว มันทำให้ udev ไม่ start ตอนเปิดเครื่องเลยครับ บางที file system อาจยังไม่พร้อมในขั้นนั้นกระมัง?)

และเพื่อความแน่ใจ ผมจัดการ stop ดีมอนหลังจากที่ปิด crypto disk แล้วอีกชั้นหนึ่งด้วย ในฟังก์ชัน do_stop():

@@ -780,7 +785,11 @@ do_stop () {
                done 3<&1
        done

-       log_action_end_msg 0
+       # Kill udevd as we postponed it
+       OMITDIR=/run/sendsigs.omit.d
+       start-stop-daemon --stop -p $OMITDIR/systemd-udevd --user root --quiet --oknodo --retry 5
+
+       log_action_end_msg $?
 }

 # Convenience function to handle $VERBOSE

หมดไปครึ่งวัน แต่ตัดรำคาญเวลาเปิด-ปิดหรือรีบูตเครื่องไปได้เยอะเลยครับ และยังลดความเสี่ยงที่ file system จะเสียหายลงด้วย

โดย Thep (noreply@blogger.com) ณ 7 October 2016 14:44 GMT

4 September 2016

bact

Forensic Service Act 2016 and the protection of personal data

Forensic Service Act of 2016

The Forensic Service Act B.E. 2559 (2016) (พระราชบัญญัติการให้บริการด้านนิติวิทยาศาสตร์ พ.ศ. 2559) has been announced on the Royal Gazette on 3 August 2016, after the National Legislative Assembly passed it on 10 June 2016. As the regulations about the handling of forensic data are yet to be announced, we don’t have an exact idea yet on how the process and conditions will look like. What we know at the moment is who is going to responsible for the making of those regulations.

Read the Act from NLA website, also comments from the Review Subcommittee of the NLA.

พ.ร.บ.การให้บริการด้านนิติวิทยาศาสตร์ พ.ศ. 2559 ประกาศในราชกิจจานุเบกษาแล้ว อ่านตัวกฎหมายและความเห็นของคณะกรรมาธิการวิสามัญพิจารณาร่างฯ

มีสามเรื่องหลักที่กฎหมายที่กำหนด คือ

  1. ขยายหน้าที่ของ สถาบันนิติวิทยาศาสตร์ กระทรวงยุติธรรม (หมวด 1) เช่น มาตรา 5 (5) “ส่งเสริมและพัฒนาการให้บริการด้านนิติวิทยาศาสตร์ของเอกชน”
  2. กำหนดให้ข้อมูลจากบริการนิติวิทยาศาสตร์ต้องเป็นความลับ กำหนดวิธีการเก็บรักษา การทำลาย และการเปิดเผย (หมวด 2)
  3. ตั้ง คณะกรรมการกำกับการให้บริการด้านนิติวิทยาศาสตร์ เพื่อกำกับดูแลเรื่องมาตรฐาน ค่าบริการ การอุทธรณ์ และการแลกเปลี่ยนข้อมูล (หมวด 3)หมวด 2 เรื่องข้อมูล มีสองมาตรา ว่าด้วยการจัดเก็บและทำลายข้อมูล (มาตรา 8) และการเปิดเผยข้อมูล (มาตรา 9) แต่รายละเอียดยังไม่มี ต้องรอคณะกรรมการฯประกาศ

Three main things this Act is doing are:

  1. Expanding duties of Ministry of Justice’s Central Institute of Forensic Science (สถาบันนิติวิทยาศาสตร์) (Chapter 1)
  2. Specifying how the forensic data should be handled (Chapter 2)
  3. Establishing Forensic Service Oversight Committee (คณะกรรมการกำกับการให้บริการด้านนิติวิทยาศาสตร์) who will regulating forensic standards, fees, appeal process, and the exchange of forensic data. (Chapter 3)

According to Section 3 of the Act, “data” in this Act means Any data that comes from the forensic service.

The “Data Chapter” or Chapter 2 of the Act is solely about the confidentially, preservation, and disclosure of data.

Section 8 Data is confidential. Central Institute of Forensic Science has duty to preserve and destroy the data, according to the criteria, methods, and conditions that the Committee will specify by announcing in the Royal Gazette.

Section 9 Data will only be disclose to the person who request for the forensic service. This should be done according to the criteria, methods, and conditions specified by the Committee. Exception is possible if it is a disclosure according to Court Order or Committee Resolution for the purpose of justice.

This means the details on conditions and process about the preservation and disclosure, or, in general, the life cycle of these potentially sensitive personal data are yet to be announced. All of them will be decided by the Forensic Service Oversight Committee, using the power given to them in Section 15 (4) [Preservation] and Section 15 (4/1) [Disclosure].

According to Section 10, the Committee will consist of

The Director of CIFS will also appointed no more than two officers from CIFS to act as Assistant Secretary for the Committee.

An expert committee member must be of Thai national and must be at least 35 years old (Section 11). He or she will serve for a period of 4 years and cannot serve for more than two terms (Section 12).

Noted that, if the [forensic] data is handled by a State agency, its privacy will be under the protection of the Official Information Act B.E. 2540 (1997). Yet, as you can see from Section 5 (5), the forensic service can be also come from private sector. But Thailand at the moment doesn’t have the law for general data protection outside the public sector yet.

The Data Protection Bill, which will fill the gap, has been proposed in different versions since more than a decade ago, but it is yet to be passed. The latest version of the Bill from July 2015, which has been reviewed by the Council of the State. It is expected to be submitted to NLA for hearing by the end of 2016.

So, keeps your eyes on the Forensic Service Oversight Committee and the forensic data regulations that they going to make. We hope they are going to have public consultations for that.

โดย bact ณ 4 September 2016 16:22 GMT

31 August 2016

MrChoke

Laravel 5.2: ใช้ Username และ Email login

ใช้ Laravel Framework มาได้สักพัก ก็เกือบปีละมั้ง ตอนนี้ออก 5.3 แล้วยังไม่ได้ลอง dev อยู่บน 5.2 และก็เพิ่งรู้ว่ามันมี LTS ด้วยรุ่นก่อนหน้าก็ 5.1 อะเข้าหัวเรื่องกันเลยดีกว่า ผมใช้ระบบ auth ของ laravel ซึ่งค่าเริ่มต้นให้มาจะใช้ email ในการ login อย่างเดียวก่อนหน้านี้ผมได้แก้ไขให้ user สมัครโดยกรอกชื่อ และ อื่นๆ รวมทั้ง username ไว้โดยยังไม่ได้ใช้ประโยนช์กับมันจนมาถึงวัน present ให้ user ใช้ตอนสมัครก็มีช่อง username ให้กรอกแต่ไม่ได้ใช้ประโยชน์ตอนที่กำลังแนะนำตัวผมเองก็รู้สึกว่า แล้วจะใส่มาทำไมในเมื่อไม่ใส่มา ก็เลยมานั่งไล่ code ในส่วน auth ใหม่พบว่าไม่ยากเท่าไหร่เพราะมีคนแนะนำไว้ เลยเอามาประยุกต์เข้ากับระบบ นั่ง debug อยู่ทั้งบ่าย ฮาๆ (ไหนว่าไม่ยาก) เลยบันทึกเอาไว้เดี๋ยววันหลังใช้อีก แก้แค่ที่เดียวคือ app/Http/Controllers/Auth/AuthController.php โดยไป Override [...]

โดย MrChoke ณ 31 August 2016 09:48 GMT

17 August 2016

Ott

อ่านผลตรวจเลือดด้วยตนเอง

แปะเก็บไว้


อ่านผลตรวจเลือดด้วยตนเอง (ควรจัดพิมพ์เก็บเอาไว้อ่านเทียบกับผลตรวจสุขภาพประจำปีนะครับ)

โดย นพ.สันต์ ใจยอดศิลป์

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

1. Blood chemistry แปลตรงๆว่าเคมีของเลือด หมายถึงระดับของสารต่างๆที่อยู่ในเลือดซึ่งก่อปฏิกิริยาเคมีได้ ซึ่งการเพิ่มขึ้นหรือลดลงของสารเหล่านี้ บ่งบอกไปถึงว่าจะมีโรคอะไรเกิดขึ้นในร่างกายบ้าง

 2. FBS = ย่อมาจาก fasting blood sugar แปลว่าระดับน้ำตาลในเลือดหลังการอดอาหารมาอย่างน้อย 8 ชั่วโมง เป็นการตรวจสถานะของโรคเบาหวานโดยตรง คือคนปกติค่านี้จะต่ำกว่า 100 mg/dL ถ้าของใครสูงเกิน 125 ก็ถือว่าเป็นเบาหวานแล้วอย่างบริบูรณ์

3. HbA1C = ย่อมาจาก hemoglobin A1C แปลว่าระน้ำตาลสะสมเฉลี่ยสามเดือนในเม็ดเลือดแดง มีความหมายคล้ายๆกับค่า FBS คือโดยคำนิยาม ถ้าน้ำตาลสะสมเฉลี่ยของของใครสูงกว่า 6.5% ก็ถือว่าเป็นโรคเบาหวานไปแล้วอย่างบริบูรณ์ ค่า HbA1C นี้ดีกว่าค่า FBS ในสองประเด็น คือ
3.1 ทำให้เราตรวจคัดกรองเบาหวานได้ทุกเมื่อ โดยไม่ต้องอดอาหารมาล่วงหน้า
3.2 การที่มันสะท้อนค่าน้ำตาลในเลือดในช่วงเวลาสามเดือนย้อนหลัง จึงตัดปัญหาระดับน้ำตาลวูบวาบในช่วงหนึ่งวันก่อนการตรวจ คือคนไข้บางคนที่จะทำตัวดีเฉพาะสองสามวันก่อนไปหาหมอเพื่อให้น้ำตาลในเลือดดูดี พอคล้อยหลังหมอตรวจเสร็จก็ออกมาสั่งไอติมมากินเป็นกะละมังให้หายอยาก คนไข้แบบนี้การตรวจ HbA1C จะทำให้ทราบสถานะที่แท้จริงของเบาหวานดีกว่า

4. BUN =  ย่อมาจาก blood urea nitrogen แปลว่าไนโตรเจนในรูปของยูเรีย  ตัวยูเรียนี้เป็นเศษของเหลือจากการเผาผลาญโปรตีนที่ตับ ซึ่งต้องถูกกำจัดทิ้งโดยไต การวัดระดับค่าของ BUN เป็นตัวบ่งบอกว่าเลือดไหลไปกรองที่ไตมากพอหรือไม่ ในภาวะที่เลือดไหลไปกรองที่ไตน้อยลง เช่นในภาวะร่างกายขาดน้ำ หรือสูญเสียเลือดไปทางอื่นเช่นเลือดออกในทางเดินอาหาร หรือในภาวะช็อก ระดับของ BUN จะสูงขึ้นอย่างรวดเร็ว ค่าปกติของ BUN คือ 8-24 

5. Cr = เขียนเต็มว่า Creatinine แปลว่าเศษเหลือจากการสลายตัวของกล้ามเนื้อ คือกล้ามเนื้อของคนเรานี้มันสลายตัวและสร้างใหม่อยู่ตลอดเวลา คนมีกล้ามมากก็สลายตัวมากสร้างมาก Cr ซึ่งเป็นเศษซากที่สลายตัวออกมาจะถูกไตขับทิ้งไป แต่ในกรณีที่ไตเสียการทำงาน เช่นเป็นโรคไตเรื้อรัง ไตจะขับ Cr ออกทิ้งไม่ทันกับที่กล้ามเนื้อสลายออกมา ทำให้ระดับ Cr ในเลือดสูงผิดปกติ ค่าปกติของมันคือ 0.7-1.2 mg/dL 

6. eGFR = เรียกสั้นๆว่า จีเอฟอาร์. ย่อมาจาก estimated glomerular filtration rate แปลว่าอัตราการไหลของเลือดผ่านตัวกรองของไตในหนึ่งนาที ค่านี้ได้จากการคำนวณเอาจาก Cr กับอายุ และชาติพันธุ์ของเจ้าตัว ห้องแล็บที่ยังไม่ทันสมัยจะไม่รายงานค่านี้ ถ้าเจ้าตัวอยากทราบค่านี้ต้องเอาค่า Cr ที่ได้ไปอาศัย GFR calculator ตามเว็บในเน็ทคำนวณให้ ค่าจีเอฟอาร์.นี้มีประโยชน์มากในแง่ที่ใช้แบ่งระดับความรุนแรงของคนที่ Cr ผิดปกติอย่างคุณนี้ว่ามีความรุนแรงเป็นโรคไตเรื้อรังระยะไหนของ 5 ระยะ กล่าวคือ 
ระยะที่ 1 ตรวจพบพยาธิสภาพที่ไตแล้ว แต่ไตยังทำงานปกติ (จีเอฟอาร์ 90 มล./นาที ขึ้นไป) 
ระยะที่ 2 ตรวจพบพยาธิสภาพที่ไตแล้ว และไตเริ่มทำงานผิดปกติเล็กน้อย (จีเอฟอาร์ 60-89 มล./นาที)
ระยะที่ 3 ไตทำงานผิดปกติปานกลาง ไม่ว่าจะตรวจพบพยาธิสภาพที่ไตหรือไม่ก็ตาม (จีเอฟอาร์ 30-59 มล./นาที
)ระยะที่ 4 ไตทำงานผิดปกติมาก (จีเอฟอาร์ 15-29 มล./นาที)
ระยะที่ 5. ระยะสุดท้าย (จีเอฟอาร์ต่ำกว่า 15 หรือต้องล้างไต)    

 7. Uric acid ก็คือกรดยูริกที่เป็นต้นเหตุของโรคเก้าท์นั่นแหละ ค่าปกติของกรดยูริกในเลือดคือ 3.4-7.0 

8. Triglyceride คือไขมันไตรกลีเซอไรด์ ซึ่งเป็นไขมันก่อโรคชนิดหนึ่งในร่างกายเรา ระดับที่สูงจนต้องใช้ยาคือเกิน 200 mg/dl 

9. HDL-cholesterol เรียกสั้นๆว่าเอ็ช.ดี.แอล. เรียกอีกอย่างว่า “ไขมันดี” เพราะมันเป็นไขมันที่ดึงไขมันที่พอกหลอดเลือดออกไปจากหลอดเลือด ดังนั้นยิ่งมีเอ็ช.ดี.แอล.มากก็ยิ่งดี คนปกติควรมีเอ็ชดีแอล.เกิน 40 mg/dl ขึ้นไป 

10. LDL-cholesterol เรียกสั้นๆว่าแอลดีแอล. หรือเรียกอีกอย่างว่า “ไขมันเลว” เพราะมันเป็นตัวไขมันที่พอกอยู่ที่ผนังหลอดเลือดและเป็นไขมันก่อโรคโดยตรง การจะตัดสินว่าคนไข้คนไหนควรกินยาลดไขมันเมื่อไหร่ก็ตัดสินกันจากระดับแอลดีแอล.นี่แหละ โดยเทียบกับความเสี่ยงในการเป็นโรคที่แต่ละคนมีเป็นทุนอยู่แล้ว  กล่าวคือ
- ถ้ามีความเสี่ยงต่ำ จะให้เริ่มทานยาลดไขมันเมื่อ LDL มากกว่า 160
- ถ้ามีความเสี่ยงปานกลาง จะให้เริ่มทานยาลดไขมัน
เมื่อ LDL มากกว่า 130
- ถ้ามีความเสี่ยงสูง หรือเป็นโรคหัวใจ หรือเบาหวาน หรืออัมพาตแล้ว จะให้เริ่มทานยาลดไขมันเมื่อ LDL มากกว่า 100   

11. Total Cholesterol หมายถึงโคเลสเตอรอลรวมในร่างกาย เป็นค่ารวมของไขมันสามอย่าง กล่าวคือ    
โคเลสเตอรอลรวม = ไขมันดี (HDL) + ไขมันเลว (LDL) + หนึ่งในห้าของไขมันไตรกลีเซอไรด์      สมัยก่อนเราใช้ค่าโคเลสเตอรอลรวมตัวนี้ตัวเดียวในการประเมินไขมันในเลือด จึงได้กำหนดค่าปกติไว้ว่าถ้าสูงเกิน 240 mg/dl จึงจะถือว่าสูงและเริ่มใช้ยา 
แต่สมัยนี้เราไม่ค่อยจะดูค่าโคเลสเตอรอลรวมกันเท่าไหร่แล้ว เราดูเจาะลึกลงไปถึงไขมันแต่ละชนิด และตัดสินใจใช้หรือไม่ใช้ยาจากระดับไขมันเลว (LDL) โดยไม่สนใจโคเลสเตอรอลรวมแล้ว เพราะค่านี้มักชักนำให้เข้าใจผิด ยกตัวอย่างเช่นถ้าดูค่าโคเลสเตอรอลรวมได้ 214 ซึ่งก็แค่สูงเกินพอดีไปบ้างแต่ไม่สูงถึงกับต้องใช้ยา แต่ว่าจริงๆแล้วเป็นความเข้าใจผิด เพราะค่าโคเลสเตอรอลรวมดูต่ำอยู่ได้เพราะมีไขมันดี (HDL) ต่ำกว่าปกติ เลยพลอยทำให้ค่าโคเลสเตอรอลรวมต่ำไปด้วย ทั้งๆที่เป็นคนมีไขมันเลวอยู่ในระดับสูงถึงขั้นต้องใช้ยาแล้ว 

12. AST(SGOT) = ย่อมาจาก aspartate transaminase หรือชื่อเก่าว่า serum glutamic oxaloacetic transaminase เป็นเอ็นไซม์ที่ปกติอยู่ในเซลของตับ ซึ่งจะไม่ออกมาในเลือด หากมีเอ็นไซม์ตัวนี้ออกมาในเลือดมากก็แสดงว่าเซลตับกำลังได้รับความเสียหาย เช่นอาจจะมีตับอักเสบจากการติดเชื้อหรือจากสารพิษ หรือแม้กระทั้งจากแอลกอฮอล์ และไขมันแทรกเนื้อตับ ค่าปกติของ AST คือไม่เกิน 40 IU/L 

13. ALT (SGPT) = ย่อมาจาก alamine amintransferase หรือชื่อเก่าว่า serum glutamic pyruvic transaminase เป็นเอ็นไซม์ที่ปกติอยู่ในเซลของตับเช่นเดียวกับ AST และจะออกมาในเลือดเมื่อเซลตับได้รับความเสียหายเช่นกัน โดยเฉพาะอย่างยิ่งในกรณีที่มีเนื้องอกอุดตันทางเดินน้ำดี ค่าปกติของ ALT คือไม่เกิน 34 IU/L 

14. Alkaline Phosphatase = เป็นเอ็นไซม์ที่อยู่ในเซลของตับ ทางเดินน้ำดี และของกระดูกเป็นส่วนใหญ่ ความหมายของเอ็นไซม์ตัวนี้หากมันสูงขึ้นคืออาจจะมีปัญหาที่ทางเดินน้ำดี ตับ หรือกระดูก ค่าปกติในผู้ชายผู้ใหญ่ไม่เกิน 128 U/L

15. GTT = ย่อมาจาก gamma glytamyl transpeptidase เป็นเอ็นไซม์ในเซลตับและทางเดินน้ำดีเช่นเดียวกับ ALT มีความไวต่อความเสียหายของเซลตับมากกว่า แต่ขาดความจำเพาะเจาะจง หมายความว่าเมื่อ GTT สูงจะเกิดจากอะไรก็ได้ที่อาจจะไม่ใช่เรื่องของตับ เช่นอาจมีปัญหาที่ตับอ่อน ที่หัวใจ ที่ปอด หรือแม้กระทั่งเป็นเบาหวาน อ้วน หรือดื่มแอลกอฮอล์ ก็ทำให้ GTT สูงได้ สารตัวนี้จึงไม่มีประโยชน์ในการคัดกรองโรคเลย 

16. HBs Ag = ย่อมาจาก hepatitis B surface antigen แปลว่าตัวไวรัสตับอักเสบบี.ซึ่งตรวจจากโมเลกุลที่ผิวของมัน ถ้าตรวจได้ผลบวกก็แปลว่ามีเชื้อไวรัสตับอักเสบบี.อยู่ในตัว หากตรวจได้ผลลบ ก็แปลว่าไม่มีเชื้อไวรัสตับอักเสบบี

17. Anti HBs = ย่อมาจาก antibody to hepatitis B surface antigen แปลว่าภูมิต้านทานต่อไวรัสตับอักเสบบี. หากตรวจได้ผลบวกก็แปลว่าคุณมีภูมิคุ้มกันต่อไวรัสบี.แล้ว ไม่ต้องไปแสวงหาการฉีดวัคซีน

โดย Pattara Kiatisevi (noreply@blogger.com) ณ 17 August 2016 14:35 GMT

29 June 2016

Thep

LibThai 0.1.25 : More on Thread-safety

LibThai 0.1.25 ออกแล้ว ความเปลี่ยนแปลงหลักของรุ่นนี้อยู่ที่เรื่อง API ใหม่ที่ thread-safe กว่าเดิม และเรื่องย่อย ๆ คือการแก้ปัญหาการคอมไพล์ด้วย GCC 6 และการปรับพจนานุกรมตัดคำตามปกติ

Thread Safety

ในรุ่น 0.1.23 ได้ทำเรื่อง thread safety ไปแล้วส่วนหนึ่ง จากประเด็นที่พบใน Pango เมื่อมีหลายเธรดพยายามเรียกฟังก์ชันตัดคำพร้อมกัน ทำให้เกิดการแย่งใช้ free list ดังที่เคยอธิบายไว้ใน blog เก่า แต่ก็ยังแก้ไม่หมดจดพอ ดังที่คุณ Mark Brown ได้รายงานมาใน กลุ่มเมล Thai Linux/FOSS developers ว่ายังเหลืออีกจุดหนึ่ง คือขณะเปิดพจนานุกรมเป็นการภายในในการเรียกครั้งแรก เพราะจะยังมีการแย่งกันเปิดพจนานุกรมจนเกิดออบเจกต์พจนานุกรมหลายชุด แม้สุดท้ายจะใช้งานแค่ชุดเดียวและโปรแกรมก็ไม่แครช แต่ออบเจกต์ชุดที่เหลือก็เปลืองเนื้อที่ในหน่วยความจำ และจะไม่ถูกทำลายเมื่อจบโปรแกรมอีกด้วย

วิธีแก้ปัญหาได้พัฒนามาเป็นขั้นเป็นตอนดังนี้ :-

  1. ใช้ mutex ขณะเปิดพจนานุกรม เพื่อให้มีเพียงเธรดเดียวที่เปิด เธรดที่เหลือแค่รอใช้ แต่ปัญหาคือ mutex ของแต่ละ OS จะเรียกไม่เหมือนกัน (บน Linux และ Unix-like OS ทั้งหลาย ใช้ POSIX thread ส่วนวินโดวส์ใช้ Mutex Object ของตัวเอง แม้จะมี pthreads-win32 เป็น wrapper ให้ใช้ แต่ก็ยังต้องสร้างระบบ build และทดสอบขึ้นมาอีก) การจะใช้ mutex ใน libthai จะต้องสร้าง layer ใหม่เพื่อให้ยังคงทำงานข้ามแพลตฟอร์มได้ เป็นงานที่ใหญ่พอสมควรเมื่อเทียบกับปัญหาที่แก้
  2. แยกฟังก์ชันเปิดพจนานุกรมออกมาต่างหาก เป็นแนวคิดที่คุณ Mark Brown ปิ๊งขึ้นมาระหว่างทำอีกประเด็นหนึ่ง คือ การอนุญาตให้ระบุแฟ้มพจนานุกรมที่จะโหลด สำหรับใช้ในกรณีที่ผู้ใช้ไม่ต้องการใช้พจนานุกรมมาตรฐานของ libthai ซึ่งเมื่อกำหนดฟังก์ชันนี้ขึ้นมาแล้ว ก็จะเกิดขั้นตอนใหม่เพิ่มขึ้นก่อนที่ผู้ใช้จะตัดคำ คือการเช็กและเปิดพจนานุกรม ซึ่งผู้ใช้สามารถเรียกใช้ใน critical region ที่มีการล็อคด้วย mutex เองได้ กลายเป็นการยิงปืนนัดเดียวได้นกสองตัว ดังที่คุณ Mark Brown ได้อธิบายมาใน อีกกระทู้หนึ่ง
  3. กำหนด type ThBrk ผมชอบแนวคิดของคุณ Mark Brown ที่ทำให้สามารถเลี่ยงการสร้าง portability layer เพิ่มได้ จึงได้ generalize ออกมาเป็น API ชุดใหม่ คือให้ผู้ใช้สร้างออบเจกต์ชนิด ThBrk (ซึ่งภายในเก็บพจนานุกรมที่เปิดแล้ว) ภายใต้การปกป้องด้วย mutex ในตอนต้น แล้วจึงเรียกฟังก์ชันตัดคำต่าง ๆ แบบขนานตามต้องการ ดังที่ผมได้แสดงความเห็นต่อมาในกระทู้ดังกล่าว คลาส ThBrk นี้ สามารถซ่อนรายละเอียดเพื่อรองรับ implementation แบบอื่นในอนาคตได้ถ้าต้องการ เช่น การใช้สถิติ tri-gram ฯลฯ แต่ในขณะนี้เราจะใช้พจนานุกรมเพียงอย่างเดียวก่อน

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

  // mutex lock here
  ThBrk *brk = th_brk_new (dictpath);
  // mutex unlock here

  // works in parallel
  int pos[N];
  int res = th_brk_find_breaks (brk, str, pos, N);

  // mutex lock here
  th_brk_delete (brk);
  // mutex unlock here

API เดิมจะยังคงมีอยู่เพื่อ backward compatibility โดยจะเป็น wrapper ที่แอบเปิดพจนานุกรมเป็นการภายในเช่นเดิม (ซึ่งไม่ thread-safe) ก่อนเรียก API ชุดใหม่ แต่จะเริ่ม deprecate API เก่าตั้งแต่รุ่นนี้เป็นต้นไป เพื่อให้ผู้ใช้เปลี่ยนไปใช้ API ชุดใหม่แทน ดังนี้ :-

โดยผู้ใช้ต้องสร้างออบเจกต์ชนิด ThBrk ต่างหากเพื่อส่งให้ฟังก์ชันเหล่านี้ และทำลายเมื่อใช้งานเสร็จ

GCC 6

การปรับโค้ดอีกส่วนหนึ่งเป็นส่วนที่สะสมมาตั้งแต่ช่วงที่ Debian กำหนดให้ใช้ GCC 6 เป็นรุ่น default ที่จะใช้ใน Stretch และได้รับรายงานจากคุณ Martin Michlmayr ใน Debian #811690 ว่าแพกเกจ scim-thai มีปัญหาในการคอมไพล์ด้วย GCC 6 ซึ่งต้นเหตุอยู่ที่ header file หนึ่งของ libthai จึงปรับแก้เสีย

Word Break Dictionary

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

คำที่น่าสนใจที่เพิ่มมาในรุ่นนี้:

และเช่นเคย ส่งเข้า Debian เรียบร้อยแล้วครับ

โดย Thep (noreply@blogger.com) ณ 29 June 2016 05:08 GMT

14 June 2016

bact

Quick notes on Thailand’s new cybercrime law amendment (26 Apr 2016 rev)

Quick points for my international friends who want to get some gists about the development of Thailand’s new amendment of Computer-related Crime Act, as of 14 June 2016. Here I discussed the timeline, small notes on two different revisions on April 2016, and points of concerns regarding freedom of expression, privacy, and encryption.

If you don’t have much time, look at Section 14 (1) [online defamation], 14 (2) [“public safety”], 15 para. 3 [burden of proof to the intermediary], 17/1 [Settlement Commission], 18 (7) [investigative power to access encrypted data-at-rest], 20 (4) [Computer Data Screening Committee can block content that is totally legal], and 20 para. 5 [will be used to circumvent data-in-transit encryption].

Thai Netizen Network also made some recommendations to the Bill (updated 28 June 2016).

Timeline

Read the Bill (in English)

Points of Concerns

1. Criminalisation of Speech and Computer Data

2. Disproportionate Intermediary Liability

3. Unpredicability of Law — Judicial Process

4. Expanded Investigative Power — Access to Encrypted Data-at-Rest

5. Expanded Information Control

6. Disintegrity of Secured Communication

Stop This

Don’t agree with the Amendment proposal?
Sign the Petition: https://change.org/singlegatewayreturn
and keep spread it around.

Follow more updates and actions from Thai Netizen Network website at https://thainetizen.org and its Facebook page at https://www.facebook.com/thainetizen.

โดย bact ณ 14 June 2016 09:35 GMT

Thep

Fonts-TLWG 0.6.3

Fonts-TLWG 0.6.3 ออกแล้ว เมื่ออาทิตย์ที่แล้ว แต่เพิ่งจะได้เขียน blog บันทึกหลังจากที่เตรียมแพกเกจเพื่ออัปโหลดในที่ต่าง ๆ เสร็จ คือที่ Debian และ CTAN

รุ่นนี้เป็นรุ่นแรกที่ ออกรุ่นจาก GitHub หลังจากที่ ประกาศย้าย repository ของ TLWG ไปที่ GitHub เมื่อเดือนที่แล้ว แต่ยังคงใช้ linux.thai.net เป็นที่ประกาศหลักตามเดิม เพื่อความต่อเนื่องกับรุ่นก่อน ๆ

ความเปลี่ยนแปลงหลักที่เกิดขึ้นในรุ่นนี้ คือการเปลี่ยนให้ฟอนต์ Loma เป็นฟอนต์ UI หลักแทน Waree อันเนื่องมาจาก รายงานบั๊กของพี่สัมพันธ์ พร้อม follow-up ว่าฟอนต์ Waree นั้นตัวสูงเกินไปจนถูกขริบในบางเว็บ เช่น Facebook แต่ Loma นั้นเตี้ยพอที่จะเล็ดรอดมาได้ (เหตุผลก็คือ Waree นั้นออกแบบเพื่อเตรียมเพิ่มอักษรไทยให้กับฟอนต์ DejaVu Sans จึงมี glyph ละตินของ DejaVu Sans ซึ่งตัวสูงอยู่แล้วเป็นตัวตั้ง ส่วน Loma นั้น เข้าใจว่าออกแบบโดยอิสระของตัวเอง) หลังจากทดสอบและฟังความเห็นของหลาย ๆ ท่านที่มาคอมเมนต์ ก็เห็นว่าควรเลื่อนอันดับของฟอนต์ Loma ขึ้นมาสูงกว่า Waree ในการเลือกฟอนต์ sans-serif ของ fontconfig

ในการเลื่อนขั้นนั้น ตามหลักแล้วควรจะทำได้ง่าย ๆ ด้วยการเปลี่ยนลำดับแฟ้ม config ของ fontconfig ให้ Loma ขึ้นก่อน Waree เช่น เปลี่ยนชื่อแฟ้ม /etc/fonts/conf.d/64-12-tlwg-loma.conf ในรุ่น 0.6.2 ให้เป็น 64-10-tlwg-loma.conf แต่ทำแค่นั้นไม่ได้ช่วยให้ Loma มาก่อน Waree ได้ เพราะยังมีกฎชุด synthetic อีกชุดหนึ่งเข้ามามีส่วนด้วย ดังผลลัพธ์หลังเปลี่ยนชื่อแฟ้มดังกล่าว ก็ยังคง match sans-serif ได้ Waree เช่นเดิม (ในรุ่น 0.6.2):

$ cd /etc/fonts/conf.d
$ sudo mv 64-12-tlwg-loma.conf 64-10-tlwg-loma.conf
$ fc-match sans-serif
Waree.otf: "Waree" "Regular"

สาเหตุคือฟอนต์ Waree มีการจำลองตัวเองเพื่อทดแทนฟอนต์ Tahoma ด้วยการห้อยชื่อตัวเองในลำดับต่อจาก Tahoma (ในไฟล์ 89-tlwg-waree-synthetic.conf) แต่ด้วยความที่ Tahoma ได้ถูกกำหนดให้เป็น preferred font ตัวหนึ่งของละติน (ในไฟล์ 60-latin.conf) ซึ่งมาก่อนภาษาอื่น ๆ การจำลอง Tahoma ของ Waree จึงทำให้ Waree กลายเป็นฟอนต์ละตินตัวหนึ่งที่มาก่อนภาษาอื่น ๆ ไปด้วย!

รายละเอียดทางเทคนิคของการตรวจสอบ ผู้ที่สนใจสามารถอ่านได้ที่ส่วนท้ายของ blog

ฉะนั้น การจะเลื่อนขั้น Loma ขึ้น จึงติดที่กฎชุด synthetic ของ Waree นี้

แล้วกฎ synthetic นี้มาจากไหน? มันเริ่มมาจากแนวคิดการจำลองฟอนต์ที่ผู้ใช้นิยมใช้ในเอกสารต่าง ๆ บนวินโดวส์ด้วยฟอนต์ที่มีในชุด Fonts-TLWG เช่น จำลอง Angsana ด้วย Kinnari, จำลอง Browallia ด้วย Garuda ฯลฯ ดังมีบันทึกไว้ใน blog เก่าเมื่อปี 2550 ซึ่งฟอนต์ต่าง ๆ ก็มีเค้าหน้าตาให้จำลองกันได้ จนกระทั่งมาเจอกรณีการใช้ฟอนต์ MS Sans Serif และ Tahoma ในเว็บ จึงได้พยายามทดแทนด้วยฟอนต์ Loma และ Waree ตามลำดับ ดังอ้างถึงใน blog เก่าเมื่อปี 2552 โดยที่ทั้งสองฟอนต์นี้ไม่ได้มีเค้าของฟอนต์ที่จำลองเลย เพียงแต่ต้องการอุดช่องว่างของการแสดงหน้าเว็บเท่านั้น

กฎนี้เคยถูกรายงานว่าสร้างปัญหาให้กับภาษาอื่น เพราะ Waree จะโผล่มาแทน Tahoma ทั้ง ๆ ที่ตัวใหญ่กว่า Tahoma (LP #434054) ทำให้เคยตัดกฏนี้ออกไปชั่วระยะหนึ่ง แต่ก็เพิ่มกลับเข้ามาพร้อมกับการตรวจสอบภาษาเพิ่มเติมเพื่อให้ apply กับภาษาไทยเท่านั้น (LP #539008) ดังบันทึกใน thaifonts-scalable 0.4.14 แต่ในเมื่อมันมารบกวนการจัดอันดับฟอนต์ sans-serif ไทยทั้งระบบ ก็เห็นควรว่าควรตัดกฎ synthetic นี้ออก แล้วปล่อยให้ฟอนต์ sans-serif ที่ได้อันดับสูงสุดมาอุด Tahoma เอา

เมื่อตัดกฎ synthetic ออก ฟอนต์ Loma ก็ได้อันดับสูงกว่า Waree แล้ว

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

ก่อนปรับ:

Loma spacing in 0.6.2

หลังปรับ:

Loma spacing in 0.6.3

ทั้งหมดนั้น เสิร์ฟถึงคุณแล้วในรุ่น 0.6.3 ครับ!


ต่อไปนี้เป็นวิธีตรวจสอบการ apply กฎของ fontconfig ด้วยตัวเอง ซึ่งทำให้เห็นว่ากฎ synthetic ใน 0.6.2 ทำให้ Waree ล้ำหน้าฟอนต์ไทยอื่น ๆ ได้อย่างไร

วิธีตรวจสอบตามที่ เอกสาร fontconfig ได้อธิบายไว้ คือกำหนดตัวแปร environment FC_DEBUG โดยในที่นี้เราสนใจการ edit match pattern ในกฎต่าง ๆ ก็กำหนดค่าเป็น 4 แล้วเรียก fc-match ดังนี้:

$ FC_DEBUG=4 fc-match sans-serif

มันจะพ่นข้อความแสดงการ edit match pattern ในแต่ละขั้นออกมายืดยาว ก็อาจจะ redirect ลงแฟ้มแล้วมาตรวจสอบดู ก็จะพบขั้นตอนที่น่าสนใจคือ:

...

FcConfigSubstitute test pattern any family Equal(ignore blanks) "sans-serif"
Substitute Edit family Prepend "Bitstream Vera Sans" Comma "DejaVu Sans" Comma "
Verdana" Comma "Arial" Comma "Albany AMT" Comma "Luxi Sans" Comma "Nimbus Sans L
" Comma "Helvetica" Comma "Lucida Sans Unicode" Comma "BPG Glaho International" 
Comma "Tahoma"

Prepend list before  "DejaVu Sans"(w) "DejaVu LGC Sans"(w) "DejaVu LGC Sans"(w) 
[marker] "sans-serif"(s) "sans-serif"(w)
Prepend list after  "DejaVu Sans"(w) "DejaVu LGC Sans"(w) "DejaVu LGC Sans"(w) "
Bitstream Vera Sans"(w) "DejaVu Sans"(w) "Verdana"(w) "Arial"(w) "Albany AMT"(w)
 "Luxi Sans"(w) "Nimbus Sans L"(w) "Helvetica"(w) "Lucida Sans Unicode"(w) "BPG 
Glaho International"(w) "Tahoma"(w) "sans-serif"(s) "sans-serif"(w)

...

กฎนี้มาจาก 60-latin.conf ของ fontconfig เอง ที่เพิ่ม prefer list ของ sans-serif โดยมี Tahoma พ่วงอยู่ด้วย

จากนั้น ก็มีการ edit match pattern ต่อ ๆ มา จนมาถึงตรงนี้:

...

FcConfigSubstitute test pattern any family Equal(ignore blanks) "sans-serif"
Substitute Edit family Prepend "Loma"

Prepend list before  "DejaVu Sans"(w) "DejaVu LGC Sans"(w) "DejaVu LGC Sans"(w) 
"Bitstream Vera Sans"(w) "DejaVu Sans"(w) "Verdana"(w) "Arial"(w) "Albany AMT"(w
) "Luxi Sans"(w) "Nimbus Sans L"(w) "Helvetica"(w) "Lucida Sans Unicode"(w) "BPG
 Glaho International"(w) "Tahoma"(w) [marker] "sans-serif"(s) "sans-serif"(w)
Prepend list after  "DejaVu Sans"(w) "DejaVu LGC Sans"(w) "DejaVu LGC Sans"(w) "
Bitstream Vera Sans"(w) "DejaVu Sans"(w) "Verdana"(w) "Arial"(w) "Albany AMT"(w)
 "Luxi Sans"(w) "Nimbus Sans L"(w) "Helvetica"(w) "Lucida Sans Unicode"(w) "BPG 
Glaho International"(w) "Tahoma"(w) "Loma"(w) "sans-serif"(s) "sans-serif"(w)

...

FcConfigSubstitute test pattern any family Equal(ignore blanks) "sans-serif"
Substitute Edit family Prepend "Waree"

Prepend list before  "DejaVu Sans"(w) "DejaVu LGC Sans"(w) "DejaVu LGC Sans"(w) 
"Bitstream Vera Sans"(w) "DejaVu Sans"(w) "Verdana"(w) "Arial"(w) "Albany AMT"(w
) "Luxi Sans"(w) "Nimbus Sans L"(w) "Helvetica"(w) "Lucida Sans Unicode"(w) "BPG
 Glaho International"(w) "Tahoma"(w) "Loma"(w) [marker] "sans-serif"(s) "sans-se
rif"(w)
Prepend list after  "DejaVu Sans"(w) "DejaVu LGC Sans"(w) "DejaVu LGC Sans"(w) "
Bitstream Vera Sans"(w) "DejaVu Sans"(w) "Verdana"(w) "Arial"(w) "Albany AMT"(w)
 "Luxi Sans"(w) "Nimbus Sans L"(w) "Helvetica"(w) "Lucida Sans Unicode"(w) "BPG 
Glaho International"(w) "Tahoma"(w) "Loma"(w) "Waree"(w) "sans-serif"(s) "sans-s
erif"(w)

...

ซึ่งก็ดูเรียบร้อยดี Loma น่าจะ match ก่อน Waree แล้ว จนกระทั่งมาถึงตรงนี้:

...

FcConfigSubstitute test pattern any lang Contains "th"
FcConfigSubstitute test pattern any family Equal "Tahoma"
Substitute Edit family Append "Waree"

Append list before  "DejaVu Sans"(w) "DejaVu LGC Sans"(w) "DejaVu LGC Sans"(w) "
Bitstream Vera Sans"(w) "DejaVu Sans"(w) "Verdana"(w) "Arial"(w) "Albany AMT"(w)
 "Luxi Sans"(w) "Nimbus Sans L"(w) "Helvetica"(w) "Lucida Sans Unicode"(w) "BPG 
Glaho International"(w) "Tahoma"(w) [marker] "Loma"(w) "Waree"(w) "Garuda"(w) "U
mpush"(w) "Laksaman"(w) "Meera"(w) "Khmer OS"(w) "Nachlieli"(w) "Lucida Sans Uni
code"(w) "Yudit Unicode"(w) "Kerkis"(w) "ArmNet Helvetica"(w) "Artsounk"(w) "BPG
 UTF8 M"(w) "Waree"(w) "Loma"(w) "Garuda"(w) "Umpush"(w) "Saysettha Unicode"(w) 
"JG Lao Old Arial"(w) "GF Zemen Unicode"(w) "Pigiarniq"(w) "B Davat"(w) "B Comps
et"(w) "Kacst-Qr"(w) "Urdu Nastaliq Unicode"(w) "Raghindi"(w) "Mukti Narrow"(w) 
"padmaa"(w) "Hapax Berbère"(w) "MS Gothic"(w) "UmePlus P Gothic"(w) "SimSun"(w) 
"PMingLiu"(w) "WenQuanYi Zen Hei"(w) "WenQuanYi Bitmap Song"(w) "AR PL ShanHeiSu
n Uni"(w) "AR PL New Sung"(w) "MgOpen Moderna"(w) "MgOpen Modata"(w) "MgOpen Cos
metica"(w) "VL Gothic"(w) "IPAMonaGothic"(w) "IPAGothic"(w) "Sazanami Gothic"(w)
 "Kochi Gothic"(w) "AR PL KaitiM GB"(w) "AR PL KaitiM Big5"(w) "AR PL ShanHeiSun
 Uni"(w) "AR PL SungtiL GB"(w) "AR PL Mingti2L Big5"(w) "MS ゴシック"(w) "ZYSo
ng18030"(w) "NanumGothic"(w) "UnDotum"(w) "Baekmuk Dotum"(w) "Baekmuk Gulim"(w) 
"KacstQura"(w) "Lohit Bengali"(w) "Lohit Gujarati"(w) "Lohit Hindi"(w) "Lohit Ma
rathi"(w) "Lohit Maithili"(w) "Lohit Kashmiri"(w) "Lohit Konkani"(w) "Lohit Nepa
li"(w) "Lohit Sindhi"(w) "Lohit Punjabi"(w) "Lohit Tamil"(w) "Meera"(w) "Lohit M
alayalam"(w) "Lohit Kannada"(w) "Lohit Telugu"(w) "Lohit Oriya"(w) "LKLUG"(w) "F
reeSans"(w) "Arial Unicode MS"(w) "Arial Unicode"(w) "Code2000"(w) "Code2001"(w)
 "sans-serif"(s) "Arundina Sans"(w) "Roya"(w) "Koodak"(w) "Terafik"(w) "sans-ser
if"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-ser
if"(w) "sans-serif"(w) "sans-serif"(w)
Append list after  "DejaVu Sans"(w) "DejaVu LGC Sans"(w) "DejaVu LGC Sans"(w) "B
itstream Vera Sans"(w) "DejaVu Sans"(w) "Verdana"(w) "Arial"(w) "Albany AMT"(w) 
"Luxi Sans"(w) "Nimbus Sans L"(w) "Helvetica"(w) "Lucida Sans Unicode"(w) "BPG G
laho International"(w) "Tahoma"(w) "Waree"(w) "Loma"(w) "Waree"(w) "Garuda"(w) "
Umpush"(w) "Laksaman"(w) "Meera"(w) "Khmer OS"(w) "Nachlieli"(w) "Lucida Sans Un
icode"(w) "Yudit Unicode"(w) "Kerkis"(w) "ArmNet Helvetica"(w) "Artsounk"(w) "BP
G UTF8 M"(w) "Waree"(w) "Loma"(w) "Garuda"(w) "Umpush"(w) "Saysettha Unicode"(w)
 "JG Lao Old Arial"(w) "GF Zemen Unicode"(w) "Pigiarniq"(w) "B Davat"(w) "B Comp
set"(w) "Kacst-Qr"(w) "Urdu Nastaliq Unicode"(w) "Raghindi"(w) "Mukti Narrow"(w)
 "padmaa"(w) "Hapax Berbère"(w) "MS Gothic"(w) "UmePlus P Gothic"(w) "SimSun"(w)
 "PMingLiu"(w) "WenQuanYi Zen Hei"(w) "WenQuanYi Bitmap Song"(w) "AR PL ShanHeiS
un Uni"(w) "AR PL New Sung"(w) "MgOpen Moderna"(w) "MgOpen Modata"(w) "MgOpen Co
smetica"(w) "VL Gothic"(w) "IPAMonaGothic"(w) "IPAGothic"(w) "Sazanami Gothic"(w
) "Kochi Gothic"(w) "AR PL KaitiM GB"(w) "AR PL KaitiM Big5"(w) "AR PL ShanHeiSu
n Uni"(w) "AR PL SungtiL GB"(w) "AR PL Mingti2L Big5"(w) "MS ゴシック"(w) "ZYS
ong18030"(w) "NanumGothic"(w) "UnDotum"(w) "Baekmuk Dotum"(w) "Baekmuk Gulim"(w)
 "KacstQura"(w) "Lohit Bengali"(w) "Lohit Gujarati"(w) "Lohit Hindi"(w) "Lohit M
arathi"(w) "Lohit Maithili"(w) "Lohit Kashmiri"(w) "Lohit Konkani"(w) "Lohit Nep
ali"(w) "Lohit Sindhi"(w) "Lohit Punjabi"(w) "Lohit Tamil"(w) "Meera"(w) "Lohit 
Malayalam"(w) "Lohit Kannada"(w) "Lohit Telugu"(w) "Lohit Oriya"(w) "LKLUG"(w) "
FreeSans"(w) "Arial Unicode MS"(w) "Arial Unicode"(w) "Code2000"(w) "Code2001"(w
) "sans-serif"(s) "Arundina Sans"(w) "Roya"(w) "Koodak"(w) "Terafik"(w) "sans-se
rif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-se
rif"(w) "sans-serif"(w) "sans-serif"(w)

...

กลายเป็นว่า Waree กลับมาแซงหน้า Loma อีกครั้งหลังจากกฎใน 89-tlwg-waree-synthetic.conf ผลก็คือ ไม่ว่าฟอนต์ไทยตัวไหนจะพยายามลิสต์ตัวเองขึ้นก่อนอย่างไรก็ตาม ก็จะแพ้ฟอนต์ที่ fallback ให้ Tahoma อยู่วันยังค่ำ และการสังเคราะห์ฟอนต์ Tahoma ด้วย Waree ก็ทำให้ Waree ไม่ยอมลงให้กับใคร!

โดย Thep (noreply@blogger.com) ณ 14 June 2016 09:29 GMT

6 June 2016

Kitt

VMware: Hot add a new disk to Linux VM without rebooting

You can always do this. Edit setting of VM hardware, add a new disk In Linux VM, # echo "- - -" > /sys/class/scsi_host/host#/scan where host# can be host0, host1 … Linux will re-scan SCSI, and your new disk should be recognized.

โดย kitty ณ 6 June 2016 10:19 GMT

5 June 2016

bact

เสรีภาพการแสดงออกในมหาวิทยาลัยสหราชอาณาจักร

Gary Slapper ผู้อำนวยการของมหาวิทยาลัยนิวยอร์ก วิทยาเขตลอนดอน เขียนถึงประเด็นเสรีภาพการแสดงออกที่ถูกจำกัดในมหาวิทยาลัยในสหราชอาณาจักร โดยอ้างอิงรายงาน Free Speech University Rankings ที่จัดอันดับเสรีภาพในการพูดของมหาวิทยาลัยยูเค 115 แห่งเป็นปีที่สองแล้ว และในรายงานปีที่สองนี้ พบมหาวิทยาลัยที่มีการเซ็นเซอร์การแสดงออก 90% เพิ่มขึ้นจากปีที่แล้วที่มี 80%

เขายกตัวอย่าง LSE ที่มีปัญหานี้มาก จนนักศึกษาต้องตั้งสมาคม Speakeasy Society ขึ้นมาเพื่อสนับสนุนการโต้เถียงอย่างเสรีและเปิดกว้าง แต่ไม่นานก็มีการเสนอในที่ประชุมของสหภาพนักศึกษา LSE Student Union ว่าให้แบนสมาคมนี้ซะ สุดท้ายก็รอดไป มีคนโหวตให้แบน 57 เสียง โหวตว่าไม่แบน 226 เสียง ได้อยู่ต่อ

ปัญหาอันหนึ่งก็คือ การยกข้องอ้างเรื่องการหมิ่นศาสนาหรือคำพูดที่สร้างความเกลียดชัง ขึ้นมาเพื่อห้ามหรือจำกัดการแสดงออก

ปัจจุบันกฎหมายที่เกี่ยวกับเรื่องนี้โดยตรงคือ Racial and Religious Hatred Act 2006 (แก้ไขเพิ่มเติม Public Order Act 1986) ซึ่ง Gary ก็บอกว่า ในกฎหมายก็เขียนไว้อย่างชัดเจนว่าไม่ได้ห้ามการวิพากษ์วิจารณ์ หรือกระทั่งประชดเสียดสีเยาะเย้ย (ridicule) ศาสนา ความเชื่อ และวิธีปฏิบัติของผู้ที่มีความเชื่อเหล่านั้น

กฎหมายเขาว่างี้

Part 3A — Hatred against persons on religious grounds

29A — Meaning of “religious hatred”

In this Part “religious hatred” means hatred against a group of persons defined by reference to religious belief or lack of religious belief.

[…]

29J — Protection of freedom of expression

Nothing in this Part shall be read or given effect in a way which prohibits or restricts discussion, criticism or expressions of antipathy, dislike, ridicule, insult or abuse of particular religions or the beliefs or practices of their adherents, or of any other belief system or the beliefs or practices of its adherents, or proselytising or urging adherents of a different religion or belief system to cease practising their religion or belief system.

กล่าวคือความหมายของ “ความเกลียดชังทางศาสนา” นี่ มันต้องเป็นความเกลียดชังต่อกลุ่มบุคคล ซึ่งอ้างอิงกับความเชื่อทางศาสนา (29A) สิ่งที่เขาต้องการปกป้อง คือปกป้องคน ส่วนการจะไปวิพากษ์วิจารณ์หรือเอาตัวศาสนาความเชื่อมาล้อเลียนอะไรนั้น เป็นเรื่องที่กฎหมายไม่ได้ห้าม และเขียนย้ำไว้เลยในกฎหมายว่า ไม่ได้ห้ามนะ (29J)

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

เขาปิดท้ายบทความว่า คำว่า “university” ในภาษาอังกฤษนั้น มาจากคำละตินว่า “universtas” ซึ่งแปลว่า “ทั้งหมด จำนวนทั้งหมด ผลรวมทั้งหมดของสรรพสิ่ง” มหาวิทยาลัยควรจะเป็นที่ถกเถียงของแนวคิดทุกอย่าง ไม่ใช่แค่บางอย่าง

อ่านบทความเต็มที่ Milkround “The best way to defeat harmful ideas is by debate — not a ban”

ภาพจาก Wikimedia Commons

โดย bact ณ 5 June 2016 14:49 GMT

13 May 2016

LookHin

10 Package ที่ควรติดตั้งบน ATOM Text Editor

คราวที่แล้วเราได้ทำการสร้าง Code Snippet เพื่อช่วยให้เราเขียนโค้ดได้เร็วขึ้นไปแล้ว วันนี้เรามาแนะนำ Package ที่ควรติดตั้งไว้เป็นเครื่องทุนแรงอีกสัก 10 ตัว เพื่อช่วยให้งานเขียนโปรแรกมของเรามีสีสันและคล่องตัวมากขึ้น โดยขึ้นตอนการติดตั้ง package ของ ATOM ให้เราเข้าไปที่เมนู File -> Settings -> Install จากนั้นพิมพ์ชื่อ package ที่เราต้องการจะติดตั้ง หรือถ้าอยากรู้ว่ามี package อะไรบ้างที่น่าสนใจให้เขาไปที่ https://atom.io/packages

Emmet
https://atom.io/packages/emmet
Emmet จะช่วยให้เราเขียน HTML ต่างๆ ได้อย่างรวดเร็วด้วยคีย์ลัดต่างๆ ที่มีให้ โดยเราสามารถดูคำสั่งต่างๆ ได้ที่ http://docs.emmet.io/cheat-sheet/
atom-snippet

atom-beautify
https://atom.io/packages/atom-beautify
atom-beautify จะช่วยให้เราจัดฟอร์แมตของโค้ดให้สวยงามง่ายๆ เพียงกด Ctrl-Alt-B
atom-snippet

autoclose-html
https://atom.io/packages/autoclose-html
autoclose-html ช่วยให้เราพิมพ์แทก HTML แล้วมันจะปิดแทกให้เอง แต่ปกติถ้าเราใช้ Emmet จนคล่องแล้วก็คงแทบไม่ต้องใช้ตัวนี้ก็ได้ แต่ติดตั้งไว้หน่อยก็ดี
atom-snippet

color-picker
https://atom.io/packages/color-picker
color-picker ตัวช่วยที่จะทำให้เราเลือกสีได้อย่างง่ายดายโดยไม่ต้องจำโค้ดสีเอง เพียงแค่กด CTRL-ALT-C
atom-snippet

jquery-snippets
https://atom.io/packages/jquery-snippets
jquery-snippets เป็น snippets ของ jQuery เราไม่ต้องสร้าง snippet เองทั้งหมด มีคนทำให้แล้ว สบายเลย
atom-snippet

line-ending-converter
https://atom.io/packages/line-ending-converter
line-ending-converter อันนี้ตัวแปลงรหัสการขึ้นบรรทัดใหม่ EOL บางทีโค้ดที่เราเปิดดูอาจจะสร้างมาจาก UNIX/Linux/MAC หรือ Windows ซึ่งมี EOL ที่ต่างกัน ตัวนี้ช่วยได้
atom-snippet

minimap
https://atom.io/packages/minimap
minimap เอาไว้แสดงโค้ดอย่างย่อด้านขวามือ จะทำให้เราเลือนหาโค้ดในตำแหน่งที่ต้องการได้เร็วขึ้น
atom-snippet

script
https://atom.io/packages/script
script เป็นตัวช่วยที่จะทำให้เราสามารถ run code ของเราได้ภายในตัว ATOM เลย จะได้เห็น output ทันทีที่กด CTRL+SHIFT+B
atom-snippet

linter
https://atom.io/packages/linter
https://atom.io/packages/linter-php
linter และ linter-php เป็นตัวช่วยในการ debug code php ช่วยให้เราเห็นได้ง่ายขึ้นว่าเราเขียนโค้ดผิดหรือเปล่า
atom-snippet

snake
https://atom.io/packages/snake
เกมงู //อันนี้ไร้สาระหละ
atom-snippet

โดย LookHin ณ 13 May 2016 05:58 GMT

6 May 2016

LookHin

การสร้าง Code Snippet บน ATOM Text Editor

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

ถ้ายังไม่ได้ติดตั้ง ATOM หรือยังไม่เคยลองใช้ก็ติดตั้งและลองเล่นสักพักหนึ่งก่อนนะครับ https://atom.io/ ผมเองเคยใช้มาทั้ง Edit Plus, Sublime และตอนนี้มาจบที่ ATOM เหตผลเพราะมัน Open Source เลยอยากแนะนำให้ทุกๆ คนลองใช้ดู

มาเริ่มสร้าง code snippet ของเรากันต่อ ให้เลือกไปที่เมนู File -> Snippets (ถ้าเมนูไม่ขึ้นให้กด ALT ข้างไว้นะครับ)

atom-snippet

ATOM จะเปิดไฟล์ snippets.cson ขึ้นมาให้เราแก้ไข โดยรูปแบบการเขียนจะเป็น CoffeeScript Object Notation (CSON) คล้ายๆ กับ JSON แต่ไม่มีวงเล็บเปิดปิด ใช้ tab อย่างเดียว แต่เราก็ไม่ต้องสนใจอะไรมาก เราใช้อยู่ไม่กี่คำสั่งครับ

atom-snippet

ตรง comment ด้านบนที่เขาให้มาด้วย เขาแนะนำว่าถ้าเราจะสร้าง snippet ของตัวเองได้โดยแค่พิมพ์ snip แล้วกด tab เดียวมันจะสร้าง template ขึ้นมาให้เรา ซึ่งจะได้ code ออกมาประมาณนี้ ซึ่งเป็นตัวอย่างของการทำ snippet สำหรับไฟล์ .js โดย Snippet name คือชื่อคำอธิบายที่จะแสดงตอนที่มีคำสั่งขึ้นมาให้เลือก ส่วน prefix คือ keyword ที่เรากำหนดว่าเมื่อพิมพ์คำนี้แล้วให้แสดง snippet ตัวนี้ขึ้นมา และ body คือส่วนของโค้ดที่เราต้องการ จะเห็นว่าส่วนของ boby ถ้าเราใส่แค่บรรทัดเดียว ให้ใส่เครื่องหมาย ‘ ครอบคำสั่งได้ แต่ถ้ามีหลายๆ บรรทัดเราต้องใช้ “”” ครอบคำสั่งแทน และเราสามารถใส่ $1 เพื่อกำหนดตำแหน่งของ cursor ได้ เดียวเราลองดูจากตัวอย่างหละกัน จะได้เห็นภาพ

1
2
3
4
'.source.js':
  'Snippet Name':
    'prefix': 'Snippet Trigger'
    'body': 'Hello World!'

แต่ของเรา เราจะสร้าง snippet สำหรับ php และเพิ่ม snippet เข้าไปสัก 2 ตัว ให้แก้ตามตัวอย่างนี้ครับ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'.source.php':
  'Copyright by LookHin':
    'prefix': 'lookhin'
    'body': '//Copyright by LookHin khwanchai@gmail.com$1'
 
  'MySQL Select':
    'prefix': 'sqls'
    'body': """
    //Select Data
    $query = "SELECT * FROM `table_name` ORDER BY `ID` ASC";$1
    $result = mysql_query($query);
    while($line = mysql_fetch_array($result)){
      echo $line['ID'];
    }
    """

atom-snippet

หลังจากสร้าง snippet เสร็จแล้ว ให้ลองสร้างไฟล์ test.php และใช้ ATOM เปิดไฟล์นี้ขึ้นมา จากนั้นพิมพ์คำว่า sqls เราจะเห็นว่ามี snippet ของเราขึ้นมาให้ใช้งานแล้วครับ

atom-snippet

โดย LookHin ณ 6 May 2016 08:32 GMT

4 May 2016

Thep

From C++ to Python (2)

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

Container สำเร็จรูป

ภาษาไพธอนมาตรฐานมาพร้อมกับ container สำเร็จรูป คือ list, dictionary และ set โดยสามารถเก็บข้อมูลหลายชนิดปนกันได้ตามธรรมชาติของภาษา dynamic type (heterogeneous list ที่ต้องอาศัย polymorphism หรือ generic programming ใน C++ กลายเป็นเรื่องที่แสนธรรมดาเมื่อมาเขียนไพธอน) การมี container สำเร็จรูปทำให้เขียนโปรแกรมได้สะดวกขึ้นมาก

list (และ tuple ที่เป็น immutable list) นั้น มีแนวคิดเหมือนลิสต์ของภาษา Lisp ที่สามารถบรรจุข้อมูลหลากชนิดคละกันได้ รวมทั้งเก็บลิสต์ในลิสต์ กลายเป็น tree ก็ยังได้ (ยังมีอิทธิพลของภาษา Lisp ในไพธอนอีกอย่าง คือ lambda expression) แต่ implement ด้วย dynamic array เพื่อรองรับ syntax ในการเข้าถึงสมาชิกในแบบแอร์เรย์อย่างมีประสิทธิภาพ แลกกับ cost ในการเพิ่ม/ลบสมาชิกเล็กน้อย list ของไพธอนจึงทำให้สามารถทำงานกับ collection ของข้อมูลได้สะดวกโดยไม่ต้องคิดเรื่องวิธีจองหน่วยความจำ

dictionary ทำให้การใช้งาน associative array ที่พบบ่อยในโปรแกรมต่าง ๆ กลายเป็นเรื่องง่าย (กลไกภายในคือ hash table) แม้แต่ตัว interpreter ของไพธอนเองก็ยังใช้ dictionary เป็นกลไกในการทำงานหลายส่วน เช่น ใช้ในการเก็บ attribute และ method ของออบเจกต์ต่าง ๆ แบบ dynamic, การทำ symbol table ของโปรแกรม ฯลฯ

set เป็นการ implement แนวคิดของ ทฤษฎีเซ็ต ในทางคณิตศาสตร์นั่นเอง การใช้เซ็ตในโปรแกรมได้ ทำให้สามารถเขียนโปรแกรมได้ใกล้เคียงกับนิพจน์คณิตศาสตร์มากขึ้น

การมีเครื่องมือแบบนี้ พร้อม syntax ที่เรียบง่ายในการเข้าถึงในระดับตัวภาษาเอง ทำให้เขียนโปรแกรมได้สั้นกระชับ

else ในที่ต่าง ๆ

นอกจาก else ใน if แล้ว ไพธอนยังมี else ในลูป while, for, และใน exception handling ด้วย ซึ่งคนที่เขียนโปรแกรม C/C++ มาเยอะหน่อยอาจเคยพบกรณีที่ else เหล่านี้ช่วยลดขั้นตอนลงได้

สมมุติว่ามีการค้นหาสมาชิกในลิสต์ที่สอดคล้องกับเงื่อนไขที่กำหนด

for (const Elm* p = students.first(); p; p = p->next()) {
  log_visited (p);
  if (p->id() == id) {
    report_matched (p);
    break;
  }
  mark_unmatched (p);
}

if (!p) {
  // search exhausted
  report_no_match();
}

เราไม่จำเป็นต้องเช็กค่า p อีกครั้งหลังจบลูปถ้าเราใช้ else หลัง for แบบนี้ในไพธอน:

for s in students:
  log_visited (s)
  if (s.id == id):
    report_matched (s)
    break
  mark_unmatched (s)
else:
  # search exhausted
  report_no_match()

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

guess = 0;
while (guess != secret) {
  std::cout << "Guess the number: ";
  std::cin >> guess;

  if (guess <= 0) {
    std::cout << "Sorry that you're giving up!" << std::endl;
    break;
  }

  if (guess > secret)
    std::cout << "The number is too large." << std::endl;
  else if (guess < secret)
    std::cout << "The number is too small." << std::endl;
}

if (guess == secret)
  std::cout << "Congratulations. You made it!" << std::endl;

ด้วย else ในไพธอน คุณก็ไม่ต้องเช็กค่า guess ซ้ำหลังจบลูป:

guess = 0
while guess != secret:
  guess = int (input ("Guess the number: "))

  if guess <= 0:
    print ("Sorry that you're giving up!")
    break

  if guess > secret:
    print ("The number is too large.")
  elif guess < secret:
    print ("The number is too small.")
else: 
  print ("Congratulations. You made it!")

โค้ดแบบนี้ผมเจอค่อนข้างบ่อยใน C/C++ บางทีคิด ๆ เหมือนกันว่าถ้าใช้ goto แทน break ซะก็อาจไม่ต้องมาเช็กซ้ำ พอมาเจอ else ของลูปในไพธอนก็เข้าใจได้ทันที

List Comprehension

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

เช่น ถ้าต้องการหารายการข้อมูลในลิสต์ data ที่สูงกว่าค่าเฉลี่ย:

avg = sum(data)/len(data)
print([x for x in data if x > avg])

หรือแม้กระทั่งจะหาจำนวนเฉพาะทั้งหมดที่น้อยกว่าจำนวนที่กำหนด:

from math import sqrt
def primes(n):
  sqrt_n = int(sqrt(n))
  no_primes = {j for i in range(2, sqrt_n) for j in range(i*2, n, i)}
  return [i for i in range(2, n) if i not in no_primes]

พี่จะสั้นไปไหนครับ!

ในบทที่ว่าด้วย Lambda operator, map, filter, reduce บอกไว้ที่ส่วนต้นว่า Guido van Rossum ผู้สร้างและดูแลภาษาไพธอนได้แสดงความประสงค์ที่จะ ตัด lambda, map, filter, reduce ออกใน Python 3 เพราะ list comprehension ทำสิ่งเดียวกันได้ชัดเจนและเข้าใจง่ายกว่า แต่สุดท้ายก็ทนแรงต้านจากผู้นิยม Lisp, Scheme ไม่ไหว จำเป็นต้องคงไว้ ตัดออกเฉพาะ reduce() โดยย้ายไปไว้ในมอดูล functools

เทียบกันแล้ว list comprehension ถอดแบบมาจาก set-builder notation ในทฤษฎีเซ็ต ส่วน lambda นั้น ถอดแบบมาจาก lambda calculus เห็นได้ชัดว่าทฤษฎีเซ็ตเป็นที่คุ้นเคยและเข้าใจง่ายกว่า สิ่งที่ lambda ทำได้มากกว่า list comprehension ก็คือ reduce() ซึ่งในความเห็นของผู้สร้างไพธอนแล้ว ทำให้โค้ดซับซ้อนเกินไป ยอมเขียนเป็นลูปเพื่อความชัดเจนเสียจะดีกว่า

ไหนลองเขียนด้วย lambda ดูซิ:

หาข้อมูลที่สูงกว่าค่าเฉลี่ย:

avg = sum(data)/len(data)
print(list(filter(lambda x : x > avg, data)))

หาจำนวนเฉพาะ:

from math import sqrt
from functools import reduce
def primes(n):
  sqrt_n = int(sqrt(n))
  np_series = list(map(lambda i : set(range(i*2, n, i)), list(range(2,sqrt_n))))
  np_set = reduce(lambda a, b : a | b, np_series)
  return list(filter(lambda i : i not in np_set, list(range(2,n))))

จะเห็นว่า lambda ยาวและเข้าใจยากกว่า list comprehension

Generator

ลูป for ในไพธอนจะไม่มีรูปแบบการใช้ตัวนับเหมือนภาษาทั่วไป แต่จะใช้ iterator ล้วน ๆ คือเป็นลูป foreach นั่นเอง

เช่น ลูปหาผลรวมของกำลังสองของจำนวนเต็มบวก n ตัวแรกที่เขียนในภาษา C++ อาจเป็นแบบนี้:

int sum_sq (int n)
{
  int sum = 0;
  for (int i = 1; i <= n; i++)
    sum += i*i;
  return sum;
}

แต่ลูป for ในไพธอนจะใช้ฟังก์ชัน range() สร้าง iterator สำหรับไล่เรียง:

def sum_sq (n):
  sum = 0
  for i in range (1, n+1):
    sum += i*i
  return sum

หรือจะให้ pythonic จริง ๆ ก็ใช้ list comprehension:

def sum_sq (n):
  return sum([i*i for i in range (1, n+1)])

iterable object ต่าง ๆ เช่น list, tuple, dictionary, set สามารถใช้เป็น iterator ได้ทันที นอกจากนี้ ยังสามารถสร้าง iterator ขึ้นเองได้ โดยทำตามโพรโทคอลที่กำหนด (สร้างคลาสที่มีเมธอด __iter__(), next() โดย next() คืนค่าตัววิ่งแต่ละขั้น และ raise StopIteration exception เมื่อวิ่งสุดแล้ว) แต่เพื่ออำนวยความสะดวกยิ่งขึ้น ไพธอนได้บัญญัติสิ่งที่เรียกว่า generator ที่ใช้วิ่งลูปได้เหมือน iterator แต่เขียนง่ายกว่า

ตัวอย่างเช่น ถ้าจะเขียน generator สำหรับไล่ลำดับ Fibonacci:

def fibo (n):
  a, b = 0, 1
  for i in range(n):
    yield a
    a, b = b, a + b

(yield ทำหน้าที่คล้าย return สำหรับแต่ละรอบ และรอบต่อไปก็จะเริ่มทำงานต่อจากบรรทัดที่ yield ไว้)

จากนั้นก็สามารถไล่ลำดับ Fibonacci ได้ตามต้องการ:

>>> list(fibo(10))
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
>>> for x in fibo(5):
...   print (x)
... 
0
1
1
2
3
>>> [x for x in fibo(10) if x % 2 == 0]
[0, 2, 8, 34]

การมี construct แบบ generator ก็ทำให้มีความยืดหยุ่นของการเขียน iterator เช่น สามารถเขียน generator แบบ recursive ได้ หรือกระทั่งเขียน generator ซ้อน generator ได้ อ่านเพิ่มเติม

เมื่อมองย้อนกลับไปถึงตอนแรกที่เราพบว่าไพธอนมีแต่ลูป foreach เท่านั้น ก็ไม่ได้ทำให้ความสามารถด้อยไปกว่าภาษาที่มีลูปตัวนับแต่อย่างใด (ในเมื่อมีฟังก์ชัน range()) แต่กลับมีความยืดหยุ่นสูงมากในการวนลูปที่ซับซ้อน

Decorator

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

สมมุติว่าเราต้องการนับจำนวนการเรียกฟังก์ชันต่าง ๆ ในโปรแกรมของเรา เราสามารถเขียน wrapper function มาดักการเรียกของผู้ใช้แล้วแอบเพิ่มตัวนับก่อนเรียกฟังก์ชันตัวจริง และไพธอนมีวิธีการสร้าง wrapper ที่ว่านี้อย่างแนบเนียน

def call_counter (func):
  def wrapper (*args, **kwargs):
    wrapper.calls += 1
    return func (*args, **kwargs)
  wrapper.calls = 0
  wrapper.__name__ = func.__name__
  return wrapper

@call_counter
def square (x):
  return x*x

print (square.calls)
for i in range (10):
  print (square (i))
print (square.calls)

บรรทัด @call_counter คือ syntax ของไพธอนในการ decorate ฟังก์ชัน โดยโค้ดนี้:

@call_counter
def square (x):
  return x*x

มีความหมายเทียบเท่ากับ:

def square (x):
  return x*x
square = call_counter (square)

กล่าวคือ เป็นการส่งออบเจกต์ของฟังก์ชัน square() ให้กับฟังก์ชัน call_counter() แล้ว call_counter() คืนค่า wrapper() ซึ่งเป็นฟังก์ชันภายในมา จากนั้น ก็ใช้ค่าที่คืนมานี้ assign ค่าทับลงไปใน symbol square() เสีย ทำให้การเรียก square() หลังจากนี้ไปจะเป็นการเรียกตัวฟังก์ชัน wrapper() ที่ได้แอบเพิ่มตัวนับก่อนเรียกฟังก์ชัน square() ตัวจริงที่ได้ส่งมาก่อนหน้านี้ในพารามิเตอร์ชื่อ func

(คำอธิบายค่อนข้างซับซ้อนวนเวียนสักหน่อย หากงงก็ขอแนะนำให้อ่านรายละเอียดจาก บทเรียน นอกจากนี้ยังมี blog ที่ artima และ blog ของ Simeon Franklin ที่ให้คำอธิบายอย่างละเอียด)

อีกวิธีหนึ่งคือเขียน wrapper เป็นคลาสที่ callable ซึ่งดูสะอาดกว่า:

class call_counter:

  def __init__ (self, func):
    self.func = func
    self.calls = 0

  def __call__ (self, *args, **kwargs):
    self.calls += 1
    return self.func (*args, **kwargs)

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

Library

นอกจากตัวภาษาเองแล้ว ไพธอนยังมาพร้อมกับไลบรารีมาตรฐานอีกเพียบ ซึ่งผมคงต้องศึกษาเพิ่มเติมไปเรื่อย ๆ เท่าที่ได้ผ่านมาก็คือเรื่องการใช้ regular expression

ดูยังมีอะไรอีกเยอะให้ศึกษาข้างหน้า ที่สำคัญคือการฝึกฝนให้เกิด pythonic way ในการเขียนโค้ด และการใช้แพกเกจต่าง ๆ ให้เหมาะกับงาน

Update (2016-05-04): แก้เนื้อหาเรื่อง implementation ของ list หลังจากที่คุณวีร์ทักท้วงมาใน facebook ว่า list ของไพธอน implement ด้วย array ไม่ใช่ linked list เหมือนใน Lisp

โดย Thep (noreply@blogger.com) ณ 4 May 2016 05:36 GMT

2 May 2016

MrChoke

AUDAX 300 RAYONG CHAN

AUDAX เป็นรายการการปั่นจักยานทางไกลที่ผู้เข้าร่วมต้องช่วยเหลือตัวเองทุกอย่าง ในไทยมีตั้งแต่ 200 300 400 600 และ 1000 กิโลเมตร มีบางรายการเปืด 100 กม. แต่ไม่ได้ record เคยปั่น 200 และ 400 มาสองรายการความเหี้ยมโหดและความบันเทิงของแต่ละรายการไม่เหมือนกันขึ้นกับเส้นทาง ครั้งนี้เข้าร่วม 300 เส้นทางระยอง จันทบุรี ต้องยอมรับเลยว่าพังมากขึ้นๆลงๆเนินตลอดเส้นทาง คือเบื่อเนินไปเลย แถมอากาศร้อนอีก ปล่อยตัวตั้งแต่ตีห้าที่ลาดหินขาว หาดแม่รำพึง ประสบการณ์จาก 400 สอนว่าไม่ควรเอาอะไรแบกไปให้มากมายเพราะทุกอย่างคือภาระ โหลดของใส่กระเป๋าเสื้อจักรยานเต็มพอดี ไม่มีเป้นอก โหลดอะไรไปบ้าง? 1. สูบพก 2. น้ำยาอุดรูรั่ว ขวดครึ่ง 3. ปะแจแอลหนึ่งชุด 4. เลนส์แว่นกลางคืน 5.ถุงตังและบัตรประชาชน 6. Power bank 7. สายชาร์จ usb ทั้ง มือถือ และการ์มิน 8. [...]

โดย MrChoke ณ 2 May 2016 10:56 GMT