6 November 2018

Thep

Fonts-TLWG 0.7.0 and 0.7.1

Fonts-TLWG 0.7.0 ออกไปแล้วเมื่อปลายตุลาที่ผ่านมา หลังจากสะสมงานพัฒนามาได้ครึ่งปี โดยมีการเปลี่ยนแปลงตามลำดับเวลาดังนี้:

หลังจาก อัปโหลด แพกเกจเข้า Debian ไปแล้ว ก็รอตรวจสอบหน้า reproducible build ของ fonts-tlwg ใน unstable ปรากฏว่ายังไม่ผ่าน ยังคงมีประเด็นตกค้างอยู่ ซึ่งเมื่อตรวจสอบ diff ดูแล้ว พบว่ามาจาก date stamp ที่เกิดจากฟิลด์ UniqueID ใน TTF Names ที่ Fontforge เติมให้โดยอัตโนมัติสำหรับฟอนต์ที่ไม่ได้จัดเตรียมไว้

(สังเกตที่คำว่า date stamp ซึ่งเป็นสาเหตุที่ทำให้มันหลุดรอดการทดสอบก่อนออกรุ่น 0.7.0 เพราะผมไม่ได้ทดสอบแบบข้ามวัน ทดสอบกี่รอบ date stamp มันก็ไม่เปลี่ยน)

Fonts-TLWG 0.7.1 จึงเกิดขึ้นตามมาเพื่ออุดช่องโหว่ดังกล่าว โดยเติมฟิลด์ UniqueID ใน TTF Names ให้ครบทุกฟอนต์เสีย

ขณะเดียวกัน เป็นธรรมเนียมของ Fonts-TLWG ที่จะ release พร้อมกับฟอนต์ OTF, TTF, WOFF ที่ build สำเร็จรูปแล้ว นอกเหนือจากซอร์สของฟอนต์ เพื่ออำนวยความสะดวกผู้ใช้ฟอนต์ทั่วไปที่ไม่สะดวกจะ build ฟอนต์เอง ซึ่งในทุกรุ่นที่ผ่านมา ผมสร้าง tarball เหล่านี้แบบ manual ด้วยการ configure และ build สามแบบเพื่อเก็บเข้า tarball ทีละก้อน ซึ่งถ้านาน ๆ ทำทีก็ไม่รู้สึกลำบาก แต่พอออกรุ่นนี้ไล่หลังรุ่นที่แล้วแบบค่อนข้างกระชั้นชิด เลยรู้สึกว่ามันควร automate มาตั้งนานแล้ว

จึงได้เป็น automation สำหรับการ build font tarballs โดยอิงอาศัย make rule ชุดเดิมที่เคยใช้ build ZIP file สำหรับ CTAN upload

พร้อมกันนี้ ในรุ่นนี้ผมเริ่มเผยแพร่ฟอนต์สำเร็จรูปในรูปแบบ ZIP file นอกเหนือจาก tarball ด้วย เพื่อส่งเสริมการใช้งานในวินโดวส์หรือแฟลตฟอร์มอื่นด้วย เพราะที่ผ่านมา Fonts-TLWG ถูกมองจากผู้ใช้ทั่วไปว่าเป็น ฟอนต์สำหรับ LaTeX บ้าง ฟอนต์สำหรับลินุกซ์ บ้าง ทั้งที่มันใช้ได้ในแพลตฟอร์มทั่วไป

upload เข้า Debian แล้ว ต่อไปก็รอดู reproducibility test ต่อไป

ทางด้าน CTAN ก็ได้ upload ไล่หลัง Debian แล้วทั้งสองรุ่น

โดย Thep (noreply@blogger.com) ณ 6 November 2018 06:46 +0700

21 October 2018

Thep

Reproducible Fonts-TLWG

ความเปลี่ยนแปลงล่าสุดใน Fonts-TLWG คือเรื่อง reproducibility คือการ build ที่ให้ผลลัพธ์เป็น binary file ที่เป็นข้อมูลเดิมทุกบิตทุกครั้งที่ build โดยไม่ขึ้นกับสภาวะที่ใช้ในการ build

สำหรับฟอนต์จากโครงการ Fonts-TLWG มีปัญหา reproducibility ตามที่รายงานโดย Debian คือ modification timestamp ที่เกิดจาก Fontforge script ที่ใช้ build โดยมีการเปลี่ยนแปลงข้อมูลของฟอนต์ระหว่างทาง ทำให้ timestamp ของการเปลี่ยนแปลงถูกปรับเป็นเวลาขณะ script ทำงานนั้น และทำให้ข้อมูลฟอนต์ผลลัพธ์แปรเปลี่ยนไปตามเวลาที่ build

Modification กลางอากาศ

script ที่ใช้ generate ฟอนต์ชนิดต่าง ๆ จะมีการเปลี่ยนแปลงข้อมูลฟอนต์กลางอากาศขณะ build ดังนี้

PUA Glyphs

PUA (Unicode Private Use Area) glyphs สำหรับสระบน-ล่างและวรรณยุกต์ที่เลื่อนหลบหางพยัญชนะ เป็นสิ่งจำเป็นสำหรับการ render ข้อความในสภาวะที่ไม่มีเทคโนโลยี OpenType เช่น บน Windows XP และการใช้ virtual font ใน TeX engine เก่า (เช่น pdfTeX) ซึ่งเราได้ตัดสินใจยกเลิกการรองรับ TTF แบบเก่าไปนานแล้ว แต่ยังไม่สามารถตัดการรองรับ TeX engine เก่าได้ จึงยังคง PUA glyphs ไว้ใน source ของฟอนต์ แต่ใช้วิธีลบกลางอากาศขณะ gen OTF และ TTF เอา

แต่การลบ glyph กลางอากาศนี่เองที่เป็นสาเหตุหนึ่งที่ทำให้ modification timestamp ของฟอนต์เปลี่ยน และทำให้ได้ไฟล์ฟอนต์ที่ไม่ reproducible

วิธีแก้ปัญหาก็เป็นไปได้สองทาง:

  1. ไม่ต้องตัด PUA glyphs เลย ใส่เกินไว้ในฟอนต์อย่างนั้นแหละ การมีอยู่ของ OpenType tables ต่าง ๆ จะทำให้ shaping engine อย่าง Harfbuzz ไม่ fallback มาใช้ PUA shaping เมื่อเจอ PUA glyphs ในฟอนต์
  2. ตัด PUA glyphs ออกจาก source ไปเลย ซึ่งจะหมายถึงการตัดการรองรับ shaping ผ่าน TeX virtual font ด้วย ผลคือ ตัดการรองรับ pdfTeX ไปเลย และหยุดอัปเดตแพกเกจ fonts-tlwg บน CTAN ไปเสีย

ทางเลือก 2 ดูจะเป็นเรื่องใหญ่ ผมคิดว่าควรชะลอไปก่อน และเลือกทางเลือก 1 ไว้ก่อน และได้ commit ไปตามนี้

TrueType Instructions

เพื่อเพิ่ม hint ให้กับฟอนต์ TrueType ในขณะที่ source ของเราอยู่ในรูป cubic spline ตัว script จึงใช้วิธีแปลง spline ให้เป็น quadratic ก่อน แล้ว apply AutoInstr กลางอากาศก่อน generate TTF

ซึ่งการแปลงและสั่ง AutoInstr ทำให้ modification timestamp ของฟอนต์เปลี่ยน ทำให้ได้ไฟล์ฟอนต์ที่ไม่ reproducible อีกเช่นกัน

ผมค้นคิดวิธีที่จะแก้ปัญหานี้ไปเรื่อย ๆ จนในที่สุดก็ได้ไอเดียการทำ mixed layers โดยมีหลักการคือ:

เมื่อได้หลักการเช่นนี้แล้ว ก็ได้แตก branch mixed-layer-ttf เพื่อดำเนินการ โดยตั้งชื่อ quadratic layer ให้เหมือนกันทุกฟอนต์ว่า Quad เพื่อจะได้ใช้ชื่อนี้ใน script ให้ทำงานได้ทุกฟอนต์ และเปลี่ยนมาใช้ Python script สำหรับ TTF แทน native script เดิม

ด้วยหลักการเช่นนี้ source สำหรับ TTF ก็จะเตรียมพร้อมอยู่ใน source สำหรับ generate ได้โดยไม่ต้องแก้ไขกลางอากาศอีก

ทำเสร็จหมดแล้ว ก็ merge เข้า master เสีย เป็นอันเสร็จพิธี

ส่วน LaTeX fonts ไม่มีประเด็นอะไรต้องแก้ ผลคือ ขณะนี้ fonts-tlwg สามารถ build แบบ reproducible ได้ทั้งหมดแล้ว

อนาคต

ประเด็นที่น่าจะทำในอนาคต:

โดย Thep (noreply@blogger.com) ณ 21 October 2018 10:36 +0700

29 August 2018

Thep

thpronun

ประกาศเปิดตัวโครงการ thpronun ซึ่งเป็นซอฟต์แวร์เสรีสำหรับวิเคราะห์เสียงอ่านของข้อความภาษาไทย (grapheme-to-phoneme) ภายใต้การสนับสนุนของ บริษัท เมตามีเดีย เทคโนโลยี จำกัด

ซอฟต์แวร์เสรีที่สนับสนุนโดยเอกชน

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

เมื่อได้ข้อตกลงแล้ว ผมจึงนั่งร่างโปรแกรมใน local Git จนโปรแกรมพร้อมทดสอบ จึงได้หารือเรื่อง repository ที่จะใช้ส่งโค้ดระหว่างกัน ซึ่งคุณภัทระก็เสนอให้ใช้ tlwg บน GitHub ไปเลย ดังนั้น TLWG จึงได้เกิดโครงการน้องใหม่คือ thpronun ด้วยประการฉะนี้

นอกจากนี้ ในระหว่างการพัฒนา ก็ได้รับ contribution ใน libthai 0.1.28 เป็นอานิสงส์ด้วย

สัญญาว่าจ้างสิ้นสุดลงเมื่อผมออกรุ่นแรกสู่สาธารณะ (คือ รุ่น 0.2.0) หลังจากนี้ไปก็จะพัฒนาในแบบชุมชนโอเพนซอร์สตามปกติ ส่วนเมตามีเดียก็จะมี customization เชิงพาณิชย์สำหรับลูกค้าต่อไป

ลักษณะของโปรแกรม

ตัวโปรแกรมเป็นคำสั่ง command line รับข้อมูลเข้าเป็นข้อความภาษาไทย แล้วจะให้ข้อมูลออกเป็นคำอ่านที่เป็นไปได้ทั้งหมดของข้อความนั้น โดยสามารถเลือกรูปแบบของคำอ่านได้จาก command-line option

$ thpronun --help
Usage: thpronun [OPTION] [WORD...]

Thai word pronunciation program.

It reads Thai words from command-line arguments, or from standard input
if no argument is given, and generates all possible pronunciations
of the words.

Options:

General:
  -V, --version  Displays program version info
  -h, --help     Displays help
  -d<DICTPATH>   Use exception dict from <DICTPATH>
  -n             Turns off word segmentation

Output structures:
  -j             Turns on JSON output
  -g             Turns on grouping in JSON output (implies '-j')

Output notations:
  -r             Outputs Romanization
  -t             Outputs Thai pronunciation
  -p             Outputs Phonetic form
  -w             Outputs Raw pronunciation code
  -s             Outputs Soundex code

ตัวอย่างคำอ่านภาษาไทย:

$ thpronun -t เถลไถล
เถลไถล:
ถะ-เหฺล-ถะ-หฺลัย
เถน-ถะ-หฺลัย
เถ-ละ-ถะ-หฺลัย

Romanization:

$ thpronun -r เถลไถล
เถลไถล:
thalethalai
thenthalai
thelathalai

phonetic:

$ thpronun -p เถลไถล
เถลไถล:
thah1 ley4 thah1 lahy4
theyn4 thah1 lahy4
they4 lah3 thah1 lahy4

soundex:

$ thpronun -s เถลไถล
เถลไถล:
Ta_-le_-Ta_-lay
Ten-Ta_-lay
Te_-la_-Ta_-lay

หรือกระทั่ง raw code ตามที่เก็บในโปรแกรม:

$ thpronun -w เถลไถล
เถลไถล:
T_a_1@-3,l_E_4@3,T_a_1@-306,l_ay4@6
T_En4@3,T_a_1@-306,l_ay4@6
T_E_4@2,l_a_3@3,T_a_1@-306,l_ay4@6

กลไกภายใน

ตัวโปรแกรมพัฒนาด้วย C++14 (ควรคอมไพล์ด้วย GCC 6.1 ขึ้นไป หรือ Clang 3.4 ขึ้นไป) ซึ่งมีสิ่งอำนวยความสะดวกครบครันอย่างที่ภาษาโปรแกรมในยุคนี้ควรมี ทำให้ได้โค้ดที่กระชับและใช้เวลาพัฒนาไม่นานเกินไป โดยเฉพาะเมื่อเทียบกับ C++ สมัยก่อน ๆ

build-dependencies:

กลไกภายใน ใช้ hard-coded rule base แบบดิบ ๆ เลย ซึ่งมีข้อดีคือไม่ต้องเสียเวลาเตรียม corpus และสามารถปรับแก้กฎต่าง ๆ ได้ตามต้องการภายในกำหนดเวลาพัฒนาที่มี แต่ข้อเสียนอกเหนือจากเรื่อง human error ที่ต้องตามแก้ในกฎก็คือ ไม่สามารถให้น้ำหนักคำอ่านแต่ละแบบตามความน่าจะเป็นได้ ซึ่งเผอิญว่าโจทย์ที่ต้องการคือการค้นฐานข้อมูล ไม่ใช่การสังเคราะห์เสียงพูดที่ต้องเลือกคำอ่านเพียงแบบเดียว จึงยังพอกล้อมแกล้มได้

เมื่อแจงรูปแบบพยางค์ของ input ด้วยกฎแล้ว ก็จะได้ abstract representation ของคำอ่าน ซึ่งสามารถใช้ polymorphism ในการ generate รูปแบบคำอ่านสุดท้ายที่ต้องการ ไม่ว่าจะเป็น romanization, คำอ่านเรียงพยางค์ด้วยอักษรไทย, คำอ่านแบบ phonetic หรือกระทั่ง soundex

องค์ประกอบหลักของแต่ละพยางค์ประกอบด้วย:

  1. เสียงพยัญชนะต้น
  2. เสียงพยัญชนะควบกล้ำ (ถ้ามี)
  3. เสียงสระ
  4. เสียงพยัญชนะสะกด
  5. เสียงวรรณยุกต์

นอกจากนี้ ยังมี requirement เพิ่มเติมจากเมตามีเดียที่ต้องการให้จัดโครงสร้างข้อมูลเป็น lattice โดยแทนที่จะ enumerate คำอ่านทุก combination เป็น list เส้นตรง ก็ให้จัดเป็น lattice โดยแยกเส้นทางคำอ่านเฉพาะในช่วงที่อ่านได้หลายแบบ แล้ว merge กลับเมื่อถึงจุดร่วม โดยให้จัดรูปแบบ output เป็น nested list ของ JSON (ไม่เกิน 2 ชั้น)

$ thpronun -t -g เถลไถล
เถลไถล:
[[[["เถ","ละ"],["เถน"],["ถะ","เหฺล"]],[["ถะ","หฺลัย"]]]]

โครงสร้างดังกล่าวสามารถแทนได้ด้วย Directed Acyclic Graph (DAG) โดยแต่ละ vertex ของกราฟแทนตำแหน่งอักขระจบพยางค์ในข้อความ input และแต่ละ edge แทนเสียงอ่านที่เกิดขึ้นระหว่างตำแหน่งที่มันเชื่อมโยง

ด้วย requirement นี้ ทำให้ทุกฟีเจอร์ที่จะเพิ่มต้องคำนึงถึงการแปลงเข้าสู่ DAG และการทำ output grouping เสมอ จึงต้องเพิ่มข้อมูลตำแหน่งอักขระจบพยางค์เป็นองค์ประกอบที่หกของทุกพยางค์ด้วย โดยบางพยางค์ที่เพิ่มเข้ามาเพราะหลักอักษรนำ (เช่น ถะ ใน เถล และ ไถล ข้างต้น) ต้องแทนด้วยเลขลบที่ encode ขอบเขตพยางค์ที่มันเกาะอยู่ไปด้วยในเวลาเดียวกัน (ในทางเทคนิค สูตรที่ใช้คือ -(ตำแหน่งต้นพยางค์ * 100 + ตำแหน่งท้ายพยางค์))

ข้อยกเว้น

กฎที่ใช้แจงพยางค์จะพยายามครอบคลุมพยางค์ทั่ว ๆ ไป แต่จะไม่เจาะจงข้อยกเว้นบางอย่าง เช่น ทร ที่อ่านเป็น ซ, ฑ นางมณโฑ ที่อ่านเป็น ด, เสียงวรรณยุกต์ของคำแผลง (เช่น กำเนิด, ตำรวจ), การันต์ซับซ้อน (เช่น กษัตริย์, สิริกิติ์, รามเกียรติ์, สุรเกียรติ์) ฯลฯ ซึ่งกรณีเหล่านี้จะจัดการด้วยพจนานุกรมคำยกเว้น (exception dictionary) เพราะการพยายามรวมในกฎจะทำให้เกิด noise เป็นคำอ่านที่ผิดเจือปนเข้ามาโดยไม่จำเป็นสำหรับกรณีทั่วไป

โดยปกติ thpronun จะมีพจนานุกรมคำยกเว้นมาให้อยู่แล้ว แต่คุณก็สามารถสร้างพจนานุกรมคำยกเว้นเองได้ โดยดัดแปลงจากไดเรกทอรี data/ ใน source tree และใช้ตัวเลือก -d<DICTPATH> ใน command line เพื่อระบุพจนานุกรมคำยกเว้น

เนื้อหาของพจนานุกรม จะ map จากตัวสะกดคำไทยไปเป็นคำอ่านในรูป raw code ซึ่งเป็นรูปแบบภายในของโปรแกรมที่แสดงจากตัวเลือก -w เช่น:

ทรง s_og0@3
ทรัพย์ s_ap3@6

การแบ่งคำ

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

โดย Thep (noreply@blogger.com) ณ 29 August 2018 05:57 +0700

23 August 2018

Thep

LibThai 0.1.28 and its Consequences

บันทึกการเปลี่ยนแปลงต่าง ๆ ที่มาใน LibThai 0.1.28 และผลพวงทั้งหลายหลังจากนั้น

LibThai 0.1.28 ออกไปตั้งแต่ต้นเดือน โดยรุ่นนี้มีรายการเปลี่ยนแปลงสำคัญ ๆ คือ:

จากนั้นก็ได้ upload debian package พร้อมความเปลี่ยนแปลงอย่างอื่น คือ เพิ่ม pkg-config ให้เป็น dependency ของ libthai-dev เพื่อให้แน่ใจว่า libthai.pc จะสามารถทำงานได้แม้ในระบบที่ติดตั้งแบบเล็กที่สุด (เป็นปัญหาที่พบระหว่างที่ทำงานชิ้นหนึ่งร่วมกับ metamedia technology) และ การรองรับการ build ที่ไม่ต้องใช้ (fake)root

รายการคำจากพจนานุกรมตัดคำของ libthai ก็ได้นำไปใช้ สร้าง hyphenation pattern ที่โครงการ thailatex ซึ่งขณะนี้กลายสภาพเป็นเพียงที่พักงานพัฒนา hyphenation pattern เท่านั้น จากนั้นจึงได้เสนอ pull request สำหรับ update hyphenation pattern สำหรับภาษาไทยในโครงการ TeX hyphenation patterns ซึ่งต้องรอการ merge เพื่อให้มีผลที่ต้นน้ำต่อไป

จาก TeX hyphenation pattern ก็ต้อง sync มายังเครื่องมือตัดคำสำหรับเอกสาร LaTeX ด้วย คือ swath ซึ่งนอกจากการปรับพจนานุกรมแล้ว ก็ได้ปรับโค้ดเล็ก ๆ น้อย ๆ ตามที่เคยทำในทุกรุ่นที่ผ่านมา โดยสิ่งที่ทำในรุ่นนี้คือ:

แล้วก็ออกรุ่น swath 0.6.1 ตามมาด้วย Debian upload ซึ่งก่อนอัปโหลดก็ได้ปรับ branch layout ของ swath packaging ตาม DEP-14 ด้วย

โดย Thep (noreply@blogger.com) ณ 23 August 2018 05:20 +0700

21 August 2018

Thep

DEP-14 Note

บันทึกเตือนความจำสำหรับการทำตาม DEP-14: Recommended layout for Git packaging repositories เพื่อนำไปใช้ทำกับแพกเกจอื่น ๆ ในความดูแลของผมต่อไป

สำหรับ Debian package ปกติที่จัดการเวอร์ชันบน Git และใช้ git-buildpackage ในการ build นั้น จะมี branch layout ดังนี้:

master
pristine-tar
upstream

ศึกษารายละเอียดเพิ่มเติมได้ที่:

DEP-14 ได้แนะนำให้ใช้ branch layout แบบใหม่ เพื่อให้ Debian derivatives ต่าง ๆ ทำงานได้สะดวกขึ้น พร้อมกับเป็นการเตรียมการสำหรับเครื่องมือสร้างแพกเกจบน Git ต่าง ๆ ที่จะมีต่อไปในอนาคต

สำหรับแพกเกจใน Debian เอง โดยสรุปแล้วจะมีการเปลี่ยนแปลง branch layout ภาคบังคับอยู่ 2 รายการ คือ:

ทำให้มี branch layout ขั้นต่ำคือ:

debian/master
pristine-tar
upstream/latest

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

สำหรับแพกเกจที่ผมดูแล ส่งตรงจาก linux.thai.net ซึ่งที่ผ่านมามีแต่ release เป็นเส้นตรง ไม่มีแยกแขนง ก็มักไม่มีความซับซ้อนอะไร (ยกเว้นตอนที่มี security update) สิ่งที่ต้องทำในตอนนี้จึงมีเพียง 3 ขั้นตอน:

  1. เปลี่ยนชื่อ branch upstream เป็น upstream/latest
  2. เปลี่ยนชื่อ branch master เป็น debian/master
  3. เพิ่มไฟล์ debian/gbp.conf เพื่อระบุให้ใช้ branch ชื่อใหม่

เปลี่ยนชื่อ branch upstream

การเปลี่ยนชื่อ Git remote branch สามารถทำได้ตามขั้นตอนดังนี้

  1. เปลี่ยนชื่อ local branch
    $ git branch -m upstream upstream/latest
    
  2. ลบ remote branch upstream
    $ git push origin :upstream
    
  3. push local branch ชื่อใหม่ไปที่ remote
    $ git push --set-upstream origin upstream/latest
    

เปลี่ยนชื่อ branch master

โดยหลักการแล้วก็ทำเหมือนตอนเปลี่ยนชื่อ branch upstream นั่นแหละ แต่จะมีความไม่ตรงไปตรงมานิดหน่อย

  1. เปลี่ยนชื่อ local branch
    $ git branch -m master debian/master
    
  2. ลบ remote branch master

    ขั้นตอนนี้แหละที่ tricky ที่สุด เพราะ คุณกำลังจะลบ default branch (master) ออกจาก repository!

    ถ้าคุณใช้ Salsa ล่ะก็ hook script ของมันจะปฏิเสธไม่ให้ลบ default branch ผ่านการ push เลยทีเดียว คุณต้องทำผ่าน web interface ดังนี้

    1. เปลี่ยน default branch ไปที่อื่นก่อน โดยใช้เมนู Settings > General > Default Branch
    2. ลบ branch master โดยใช้เมนู Repository > Branches สังเกตว่า branch master จะถูก protect ไว้ ไม่สามารถลบผ่านการ push ได้ แต่ใช้ web interface ลบได้ โดยมันจะถามยืนยันก่อนลบ
  3. push local branch ชื่อใหม่ไปที่ remote
    $ git push --set-upstream origin debian/master
    
  4. เปลี่ยน default branch ให้ชี้มาที่ debian/master โดยใช้เมนู Settings > General > Default Branch

เพิ่มไฟล์ debian/gbp.conf

คุณอาจจะต้อง clone Git repository ใหม่อีกครั้ง เพื่อให้ค่าต่าง ๆ ของ origin ตรงกับของ remote (เช่น HEAD)

จากนั้น เพิ่มไฟล์ debian/gbp.conf ที่มีเนื้อหาดังนี้:

[DEFAULT]
pristine-tar = True
debian-branch = debian/master
upstream-branch = upstream/latest

ก็จะสามารถ build package ด้วย git-buildpackage ได้ตามปกติผ่าน branch layout ตาม DEP-14

โดย Thep (noreply@blogger.com) ณ 21 August 2018 08:09 +0700

13 July 2018

Thep

Midyear Thanks

ขอขอบคุณ ทุกท่านที่ได้ สนับสนุน งานพัฒนาซอฟต์แวร์เสรีของผมในช่วงครึ่งปีที่ผ่านมาครับ

ขอขอบคุณผู้สนับสนุนดังนี้:

ขอให้ทุกท่านมีความเจริญก้าวหน้าในกิจที่ทำอยู่ครับ May the Source be with you!

สรุปกิจกรรมเกี่ยวกับซอฟต์แวร์เสรีในครึ่งแรกของปีนี้ของผม:

โดย Thep (noreply@blogger.com) ณ 13 July 2018 01:44 +0700

19 June 2018

Thep

libdatrie 0.2.12

libdatrie 0.2.12 ออกแล้ว ไล่หลัง 0.2.11 เพียง 2 เดือน หลังจากผ่านการทำความสะอาดโค้ดมาระยะหนึ่ง

เริ่มจากผมได้รับแพตช์จากคุณ Peter Moulder ทางเมลส่วนตัว ซึ่งเสนอปรับแก้ 3 รายการคือ:

นั่นนำไปสู่การตรวจสอบหาประเด็นอื่น ๆ ต่อ โดยใช้ CFLAGS="-ansi -pedantic -Wall" รวมถึงการใช้ CC=clang ด้วย ทำให้จับประเด็นเพิ่มได้อีกหลายรายการ หนึ่งในนั้นมีผลข้างเคียงเป็นการป้องกันการตัดท้ายชื่อพาธของพจนานุกรมที่ยาวมาก ๆ ด้วย

เหลือประเด็นที่ยังคงไว้ คือการใช้ "%ls" ใน printf() format string เพื่อพิมพ์ข้อความยูนิโค้ดที่อยู่ในรูป wide char string ซึ่งไม่มีใน C90 โค้ดนี้เป็นโค้ดที่อยู่ใน test ในส่วนแสดงข้อมูลการทำงานของ test เท่านั้น ไม่ได้อยู่ในโค้ดของ library และไม่ใช่ส่วนสำคัญที่ชี้ขาดผลการ test จึงปล่อยไว้อย่างนั้น เพราะหากพยายามทำให้ได้ตาม C90 จริง ๆ จะยุ่งยากเกินจำเป็น

ตามมาด้วย Debian upload ซึ่งเพิ่ม pkg-config เข้าใน dependency ของ libdatrie-dev เพื่อประกันว่า datrie-0.2.pc สามารถทำงานได้แม้ในระบบที่ติดตั้งแบบ minimal จริง ๆ

โดย Thep (noreply@blogger.com) ณ 19 June 2018 15:03 +0700

8 May 2018

bact

เขียนและออกแบบหน้าตานโยบายความเป็นส่วนตัว-นโยบายการใช้ข้อมูล

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

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

หน้าแรกของนโยบายความเป็นส่วนตัวของเว็บไซต์ Juro
หน้าแรกของนโยบายความเป็นส่วนตัวของเว็บไซต์ Juro

 

โดย bact ณ 8 May 2018 13:37 +0700

6 May 2018

bact

เจ้าหน้าที่รัฐกับ gated community

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

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

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

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

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

เรื่องนี้สำคัญ เพราะ *ถ้า* ในทางปฏิบัติแล้ว ผู้พิพากษาไม่ได้อยู่ในสังคมเดียวกับเรา ก็แปลว่าคำพิพากษาและการตีความกฎหมายใดๆ ที่จะส่งผลผูกพันกับเราทุกคน กลับไม่มีโอกาสผูกพันกับตัวผู้พิพากษาเอง พูดอีกแบบคือ มีแนวโน้มจะเป็นการตัดสินแบบไม่จำเป็นต้องมี accountability หรือความรับผิดรับชอบใดๆ

เป็นผู้พิพากษาที่ลอยมาจากสวรรค์ ตัดสินชี้ชะตามนุษย์เสร็จก็บินกลับไปนอนอยู่บนเมฆสวยๆ ไม่ต้องทุกข์ร้อนจากการกระทำของตัว

ต่อให้ไปสร้างหมู่บ้านในเมือง ไม่ยุ่งกับป่า ผมว่าถ้ายังเป็นรูปแบบนี้ก็มีปัญหาข้างต้นอยู่ดี

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

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

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

ถ้าคิดว่าวาระสำคัญของชาติคือการ “ปรองดอง” ก็ควรจะออกมาดองกับคนอื่นบ้างน่ะครับ

….

ค้นคำว่า “gated community” เจอบทความนี้ของ นิธิ เอียวศรีวงศ์ จาก มิ.ย. 2560 – “ฐานทางสังคมของเผด็จการ”

(เผยแพร่ครั้งแรกในเฟซบุ๊ก 29 เม.ย. 2018)

ภาพประกอบ “Gated” โดย Gordon Joy สัญญาอนุญาตครีเอทีฟคอมมอนส์แบบแสดงที่มา-อนุญาตแบบเดียวกัน

โดย bact ณ 6 May 2018 04:53 +0700

5 May 2018

bact

ทำเว็บไซต์ให้ปลอดภัยขึ้นอีกนิดนึง ไม่ยากเกินไป ถ้าเขียนเว็บได้ก็น่าจะทำได้ #websecurity

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

เครื่องมือตรวจสอบเบื้องต้น (ส่วนใหญ่ฟรี)

ใครเป็นคนดูแลเว็บ ลองใช้เครื่องมือในลิงก์นี้ตรวจสอบเบื้องต้นก่อนก็ได้ครับ ว่าเว็บไซต์เรายังโอเคไหม: 12 Online Free Tools to Scan Website Security Vulnerabilities & Malware

เข้าไล่มา 12 เครื่องมือ ผมก๊อปมาให้ดูตรงนี้อีกที (บางตัวก็ทำงานคล้ายๆ กัน)

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

ส่วนใหญ่จะฟรี บางอันต้องลงทะเบียนก่อน หรือต้องยืนยันสิทธิ์ก่อนว่าเราเป็นผู้ดูแลของเว็บไซต์นั้นจริงๆ (ด้วยการเอาไฟล์บางอย่างไปวางไว้ในเครื่องเรา – ยังไงก็ตรวจสอบดีๆ ก่อนจะเอาไฟล์อะไรไปวางนะครับ มันควรจะเป็น text/html file ที่เราเปิดเข้าไปอ่านๆ ได้ ถ้าดูแปลกๆ ก็อย่าทำต่อ)

* สำหรับตัวที่มีการทดสอบ SQL injection ให้ระวังด้วยว่ามันจะพยายามยิงอะไรบางอย่างเข้าไปในฐานข้อมูลของคุณ เพื่อจะทดสอบ แปลว่ามันอาจจะทำให้เกิดขยะในฐานข้อมูลได้  ดังนั้นไม่ควรทดสอบกับระบบที่ใช้อยู่จริง (on production) นะครับ ให้ทดสอบกับระบบที่เอาไว้ทดสอบเท่านั้น ถ้าเจอรูก็รีบอุด พอแน่ใจแล้วค่อยไปอัปเดตโค้ดในส่วนของ production ครับ [ขอบคุณคุณ Thitipong Samranvarnich ในกลุ่มสมาคมโปรแกรมเมอร์ไทย ที่เตือนเรื่องนี้ครับ]

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

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

(แต่ถ้าไม่พบ ก็ไม่ได้แปลว่าไม่มีนะครับ อาจจะแค่หาไม่เจอ)

ป้องกันคนมาดูภาพหรือไฟล์ที่ยังไม่พร้อมเผยแพร่

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

ถ้าเว็บเซิร์ฟเวอร์ใช้ Apache HTTP Server ก็ทำได้ด้วยการแก้ไขไฟล์ .htaccess โดยเพิ่มบรรทัด

Options -Indexes

ทีนี้ก็จะยังมีปัญหาอยู่บ้าง คือถ้าคนรู้ชื่อไฟล์ (อาจจะเดาไปเรื่อยๆ) เขาก็จะยังดูได้อยู่ดี

อันนึงที่ทำได้ก็คือ อย่าตั้งขึ้นไฟล์ให้มันเดาง่ายนัก (พวกรันเลขเรียงลำดับไปเรื่อยๆ นี่เดาสบายเลย)

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

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

Please do not leave the key in the lock

ปกปิดข้อมูลเว็บเซิร์ฟเวอร์

อีกอันที่ทำได้ไม่ยาก และช่วยให้การเจาะเว็บเราวุ่นวายขึ้นมาอีก “เล็กน้อย” คือปิดข้อมูลเกี่ยวกับเว็บเซิร์ฟเวอร์เราครับ

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

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

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

ยังไงก็ควรหมั่นอัปเดตรุ่นของซอฟต์แวร์ที่เขาแก้ไขเรื่องความปลอดภัยครับ

WordPress และ CMS อื่นๆ

ใครใช้เวิร์ดเพรส ลองดูหน้านี้ครับ มีอะไรที่พอทำตามได้บ้าง เช่นการตั้ง permission ของ directory ต่างๆ การปิดไม่ใช้แก้ไขไฟล์ของเวิร์ดเพรสผ่านหน้า dashboard ได้
https://codex.wordpress.org/Hardening_WordPress

คนใช้ Joomla, Drupal หรือ CMS อื่นๆ ลองเสิร์ชดูครับ ผมว่ามีแน่ๆ
https://docs.joomla.org/Security
https://www.keycdn.com/blog/drupal-security/

พอทำได้เบื้องต้นไปก่อน-แต่ในระยะยาวก็ต้องลงทุนน่ะ

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

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

คำเตือน

ผมไม่ใช่ผู้เชี่ยวชาญด้านนี้ ไม่ต้องมาถามผมเรื่องนี้ lol
ทั้งหมดนี้อาศัยจำจากเพื่อนๆ ที่เขาทำงานพวกนี้ และอ่านๆ เอาในเน็ตทั้งนั้น

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

ชุมชนความปลอดภัยเว็บ

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

https://www.facebook.com/groups/2600Thailand/
https://www.facebook.com/groups/owaspthailand/

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

อีกกรุ๊ปในเฟซบุ๊กที่ก็เข้าไปถามได้เหมือนกัน คือกลุ่มสมาคมโปรแกรมเมอร์ไทยครับ กลุ่มนี้ใหญ่และหลากหลายครับ https://www.facebook.com/groups/ThaiPGAssociateSociety/

เพิ่มเติม

(เผยแพร่ครั้งแรกในเฟซบุ๊ก 1 พ.ค. 2018)

ภาพประกอบ “Key locker” โดย Jonathan O’Donnell สัญญาอนุญาตครีเอทีฟคอมมอนส์แบบแสดงที่มา-อนุญาตแบบเดียวกัน

โดย bact ณ 5 May 2018 16:19 +0700

เก็บตกวันแรงงาน #MayTheForthBeWithYou #8hourday

“By extending the working day, therefore, capitalist production…not only produces a deterioration of human labour power by robbing it of its normal moral and physical conditions of development and activity, but also produces the premature exhaustion and death of this labour power itself.”
Karl Marx

Socialists in Union Square, N.Y.C., 1 May 1912
Socialists in Union Square, N.Y.C., 1 May 1912

(เผยแพร่ครั้งแรกในเฟซบุ๊ก 4 พ.ค. 2018)

 

โดย bact ณ 5 May 2018 15:32 +0700

29 April 2018

bact

Timeline of SIM registration in Thailand + Notes on regulatory impact assessment

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

Vietnam is about to adopt mandatory SIM registration policy. Last Friday, BBC Vietnamese interview me for background and thoughts on SIM registration in Thailand. This is my rough notes for the interview. For more details on this, from the beginning in 2004 up until 2013, see this blog post (in Thai).

Rational

In general, Thai government and the telecom regulator (National Broadcasting and Telecommunications Commission – NBTC) put concerns on criminal activities (like identity fraud) and on terrorism (like using phone call to activate bombs).

History

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

Cases

Recent cases related to personal data breach/fraud

Assessment

Question on the policy. Should there be a Regulatory Impact Assessment (RIA) for a public policy with wide impact like this?

Some thoughts…

WITHOUT SIM registration:

WITH SIM registration:

Last Point

Do we pay the high prices of our personal data for, in the end, low or no benefits at all?

โดย bact ณ 29 April 2018 06:45 +0700

28 April 2018

bact

อุตสาหกรรมไอทีล้มเหลวที่จะปกป้องผู้ใช้ เพราะเรา move fast and break things?

“Move fast and break things. Unless you are breaking stuff, you are not moving fast enough”

— Mark Zuckerberg

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

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

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

Move Fast and Break Things.

“Move fast and break things.” (ให้แปลก็คงทำนองว่า พุ่งให้เร็ว ใส่ไม่ยั้ง พังไม่เป็นไร) เป็นคำขวัญที่โด่งดังของเฟซบุ๊ก เป็นหลักคิดที่ดีเพื่อการสร้างนวัตกรรม ทดลองทำ ดูว่าใช้ได้หรือไม่ เก็บข้อมูล ตรงไหนไม่ดีก็ทำใหม่ ทำซ้ำวนรอบไปเรื่อยๆ

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

ถ้า things ที่จะถูก break เป็น status quo หรือเป็นวิธีการทำธุรกิจแบบเก่าๆ น่ะ break ไปเถอะครับ break คนที่โดยเปรียบเทียบแล้วมีอำนาจมากกว่า

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

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

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

อ้อ เฟซบุ๊กเปลี่ยนคำขวัญแล้วตั้งแต่ปี 2014 มาใช้ของใหม่ว่า “Move fast with stable infrastructure.”

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

โดย bact ณ 28 April 2018 21:12 +0700

ประชารัฐ? มีบริการสาธารณะอะไรบ้างไหม ที่ไม่ควรให้เอกชนทำ?

“TurboTax’s powerful lobbying against tax simplification is a great example of what happens when tech is deployed to ‘solve’ a political problem.”

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

บทความ Why I’m boycotting TurboTax this year พูดถึงความพยายามของรัฐบาลสหรัฐที่จะออกกฎหมายสร้างระบบให้ประชาชนไม่ต้องกรอกแบบฟอร์มภาษีหรือกรอกให้น้อยที่สุด และความพยายามล็อบบี้โดยบริษัทซอฟต์แวร์ช่วยกรอกแบบฟอร์มภาษีที่จะไม่ให้กฎหมายดังกล่าวผ่าน

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

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

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

บทความวิชาการนี้น่าสนใจ

Pasquale, Frank A., A Rule of Persons, Not Machines: The Limits of Legal Automation (March 6, 2018). George Washington Law Review, Forthcoming; U of Maryland Legal Studies Research Paper No. 20018-08. Available at SSRN: https://ssrn.com/abstract=3135549

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

ภาพประกอบ “Tabletop Assistant” โดย Matthew Hurst สัญญาอนุญาตครีเอทีฟคอมมอนส์แบบแสดงที่มา-อนุญาตแบบเดียวกัน

โดย bact ณ 28 April 2018 20:33 +0700

“ทำหน้าที่ตัวเองให้ดีที่สุด” พอไหม? ลองพูดในภาษาโปรแกรมเมอร์

เมื่อวานคุยกับมิตรสหายท่านหนึ่ง นึกออกมาเร็วๆ ได้ว่า

การทำหน้าที่พลเมืองในส่วนของตัวเองให้เต็มที่ นี่เหมือนกับการเขียนโค้ดให้มันดีที่สุด

แต่สุดท้ายมันจะดีได้ถึงแค่จุดๆ หนึ่ง

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

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

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

โดย bact ณ 28 April 2018 20:15 +0700

Science Communication สื่อสารวิทยาศาสตร์ให้สาธารณะเข้าใจ

สิ่งที่ทำให้วงการวิทยาศาสตร์ในต่างประเทศก้าวหน้า ไม่ใช่เพียงทรัพยากรในการพัฒนาตัวความรู้ แต่มีเรื่องของการสื่อสารความรู้ด้านวิทยาศาสตร์สู่สาธารณะด้วย

….

ในไทยเห็นเพจ Science Communication Thailand สื่อสาระวิทยาศาสตร์ไทย พูดถึงวิชา Science Storytelling ที่บางมด ก็น่าสนใจดี เหมือนจะเป็นการเอานักวิทยาศาสตร์มาเล่าเรื่อง?

ข้อควรระวังหนึ่งของ science communication, science journalism นอกจากการตีความข้อค้นพบอย่างผิดพลาดหรือพูดอย่างตีขลุมเกินไปแล้ว ก็คือการเป็นกระบอกเสียง (โดยรู้ตัวหรือไม่รู้ตัว) ให้กับอุตสาหกรรมที่เกี่ยวข้องกับการค้นพบทางวิทยาศาสตร์ ตัวอย่างที่ชัดเจนคืออุตสาหกรรมอาหารเสริมและยา หรือที่เป็นประเด็นมากขึ้นตอนนี้คืออุตสาหกรรมพลังงาน (ว่าด้วยเรื่องโลกร้อนไม่ร้อน อะไรปล่อยคาร์บอนมากกว่า ฯลฯ)

บางที่หลักสูตรพวกนี้ก็ไปอยู่ในคณะวิทยาศาสตร์ บางทีก็คณะวารสารศาสตร์/นิเทศศาสตร์

….

เว็บไซต์ Knight Science Journalism at MIT https://ksj.mit.edu/ รวมทรัพยากรและสถานศึกษาเกี่ยวกับเรื่องนี้ไว้ ใครสนใจไปกดดูได้ครับ (อยู่ในหน้า Resources)

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

โดย bact ณ 28 April 2018 19:02 +0700

25 April 2018

Thep

Fonts-TLWG 0.6.5

Fonts-TLWG 0.6.5 ออกแล้ว โดยมีความเปลี่ยนแปลงที่สำคัญคือการแก้บั๊กของฟอนต์ Laksaman เมื่อใช้กับเอกสาร LaTeX โดยผมได้รับรายงานปัญหานี้จาก อ. กิตติพิชญ์ มีสวาสดิ์ ในการประชุม โสเหล่ ของ KKLUG เมื่อเดือนมีนาคมที่ผ่านมา

อาการคือ คำที่มี ff, ffi, ffl จะไม่มี ligature สามชุดนี้ปรากฏ ผมสร้างเอกสารทดสอบ โดยในข้อความแต่ละชุด บรรทัดแรกจะป้อนข้อความปกติ ส่วนบรรทัดที่สองจะเลี่ยง ligature:

if iff film flow difficult affluent

if if{}f f{}ilm f{}low dif{}f{}icult af{}f{}luent

ผลลัพธ์คือ:

Laksaman bug on LaTeX

สังเกต ligature ที่หายไปในบรรทัดแรกของข้อความแต่ละชุด

ในฟอนต์ต้นทาง คือ TH Sarabun New นั้น มี ligature ของละตินมาให้เพียงสองตัว คือ fi และ fl แต่ในกฎ LIGKERN ของ TeX จะใช้ทั้งหมด 5 ตัว โดยอีก 3 ตัวที่ยังขาดคือ ff ffi และ ffl เมื่อสร้าง glyph ทั้งสามตัวเพิ่มเข้าไปก็จะได้ผลลัพธ์ที่ควรจะเป็น:

Laksaman fixed for LaTeX

ผลข้างเคียงก็คือ ฟอนต์ Laksaman เมื่อใช้บนเดสก์ท็อปหรือบนเว็บจะมี ligature ครบกว่า TH Sarabun New ซึ่งความแตกต่างนี้ต้องสังเกตใกล้ ๆ อย่างละเอียดพอสมควร

ก่อนแก้:

Laksaman on Firefox, before

หลังแก้:

Laksaman on Firefox, after

ขอขอบคุณ อ. กิตติพิชญ์ ผู้ใช้ LaTeX ตัวจริงคนหนึ่งมา ณ ที่นี้ ที่จับบั๊กนี้ได้ครับ

นอกจากนี้ยังมีความเปลี่ยนแปลงอื่น ๆ คือ:

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

ส่วนบนเดสก์ท็อปนั้น ก็ได้อัปโหลด 1:0.6.5-1 เข้า Debian เรียบร้อยแล้วครับ

โดย Thep (noreply@blogger.com) ณ 25 April 2018 04:52 +0700

23 April 2018

Thep

libdatrie 0.2.11

libdatrie 0.2.11 ออกแล้ว หลังจากที่ไม่ได้ออกรุ่นมาเลยถึงสองปีครึ่ง และนับเป็น release แรกของ libdatrie ที่ออกจาก github หลังจากที่ปล่อยให้แพกเกจอื่น ๆ ทยอยออกรุ่นกันไปเยอะแล้ว

รุ่นนี้มีความเปลี่ยนแปลงที่สำคัญนอกเหนือจากการย้ายมา Github คือ:

ถือว่ารุ่นนี้ได้รับ contribution จากผู้ใช้ค่อนข้างหลากหลาย โดยเฉพาะการช่วยวิเคราะห์ปัญหาที่น่าประทับใจ และได้รู้เพิ่มเติมว่ามีการใช้งาน libdatrie กับ PHP ด้วย

และเช่นเคย upload 0.2.11-1 เข้า Debian เรียบร้อยแล้ว พร้อมความเปลี่ยนแปลงอื่น ๆ เพิ่มเติม เช่น การรองรับการ build ที่ไม่ต้องใช้ (fake)root

โดย Thep (noreply@blogger.com) ณ 23 April 2018 15:52 +0700

9 April 2018

Kitt

สงกรานต์ ๒๕๖๑

สงกรานต์ปี 2561 เป็นปี จ.ศ. (2561 – 1181) = 1380 วันเถลิงศก ตรงกับ (1380 * 0.25875) + floor(1380 / 100 + 0.38) - floor(1380/ 4 + 0.5) - floor(1380 / 400 + 0.595) - 5.53375 = 357.075 + 14 - 345 - 4 - 5.53375 = 16.54125 = วันที่ 16 เมษายน 2561 เวลา 12:59:24 วันสงกรานต์ ตรงกับ 16.54125 … Continue reading สงกรานต์ ๒๕๖๑

โดย kitty ณ 9 April 2018 13:19 +0700

15 March 2018

Kitt

A command for Pi Day

Well, the command is … $ date -u '+%-m.%d%-H%M%S' If you execute at the right time, you get this:

โดย kitty ณ 15 March 2018 08:59 +0700

19 February 2018

bact

ทดลอง Tesseract 4.0alpha กับภาษาไทย

Tesseract เป็นซอฟต์แวร์และไลบรารีแปลงภาพข้อความ (ที่คนอ่านเข้าใจ) ให้เป็นข้อความ (ที่คอมพิวเตอร์อ่านเข้าใจ) หรือที่เรียกกันว่า OCR

สาเหตุที่ Tesseract ได้รับความนิยม เพราะมันเป็นซอฟต์แวร์เสรี (free software ไม่ต้องจ่ายเงิน มีซอร์สโค้ดให้ดูและแก้ไขเผยแพร่ต่อได้ และประสิทธิภาพมันก็ดี จะเรียกใช้ตรงๆ ทาง command line ก็ได้ หรือจะเขียนโปรแกรมเชื่อมกับ API มันก็ได้ — ดู wrapper และ GUI อื่นๆ ได้ที่หน้า Add Ons ของโครงการ

ภาพที่จะส่งมา Tesseract ต้องเป็นภาพที่ปรับแต่งมาให้เหมาะกับการอ่านข้อความแล้ว คือหมุนมาค่อนข้างตรง และปรับแสงและสีให้อ่านง่าน พื้นหลังสีขาวหรือสีอ่อน ตัวอักษรสีดำ ใน StackOverflow มีคนอธิบายการใช้ OpenCV ปรับภาพเพื่อ OCR เอาไว้

Tesseract รองรับภาษาไทย (น่าจะตั้งแต่รุ่น 3) ตอนนี้รุ่น 4 กำลังจะออก เพิ่มเอนจินที่ใช้โมเดล Deep Learning แบบ LSTM เข้ามา เท่าที่ทีมพัฒนาทดสอบกันเอง มีข้อผิดพลาดน้อยกว่าเอนจินของรุ่นก่อน

โพสต์นี้จะพูดถึงการทดสอบรุ่น 4.0alpha บน macOS และทดลองเพิ่ม/ลดคำในรายคำศัพท์ที่ตัวเอนจิน LSTM จะเอาไปใช้

ส่วนใครจะใช้รุ่นที่ released แล้ว ติดตั้งด้วยวิธีปกติของแต่ละระบบปฏิบัติการได้นะครับ วิธีตามเอกสาร

ติดตั้งไลบรารีที่จำเป็น

brew install autoconf-archive leptonica icu4c pango

ไลบรารี icu4c (เอาไว้จัดการ Unicode) กับ pango (จัดการการวาดตัวอักษร) ติดตั้งเฉพาะถ้าเราต้องการฝึกโมเดลใหม่

อาจจะมีไลบรารีอื่นที่ต้องใช้เพิ่มเติม ลองอ่านที่ configure มันแจ้ง และติดตั้งตามที่มันบอกครับ

ICU ที่มากับ macOS ไม่มีไฟล์ header มาด้วย ดังนั้นใช้คอมไพล์ไม่ได้ ต้องลงใหม่ครับ

ตั้งค่า environment

ในไฟล์ ~/.bash_profile

export PATH="/usr/local/opt/icu4c/bin:$PATH"
export PATH="/usr/local/opt/icu4c/sbin:$PATH"
export LDFLAGS="-L/usr/local/opt/icu4c/lib"
export CPPFLAGS="-I/usr/local/opt/icu4c/include"

อันนี้ผมใช้ brew ปกติของมันจะเอาไลบรารีและเฮดเดอร์ต่างๆ ไปไว้ที่ไดเรกทอรี /usr/local/opt/ ถ้าใครติดตั้งไว้ที่อื่นก็เปลี่ยนตามนั้นครับ

ดาวน์โหลดโค้ดและเตรียมคอมไพล์

โค้ด Tesseract ตัวล่าสุดอยู่ที่ https://github.com/tesseract-ocr/tesseract ก็ไปโคลนหรือฟอร์กมาได้เลย

จากนั้นในไดเรกทอรีของ tesseract เราก็สร้างไฟล์คอนฟิกเพื่อเตรียมคอมไพล์

./autogen.h

และ

./configure

จากนั้นก็คอมไพล์และติดตั้งตัว tesseract

make
make install

และคอมไพล์และติดตั้งตัวโปรแกรมสำหรับฝึกและแก้ไขรายการคำ

make training
make training-install

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

ใช้งาน Tesseract

การจะใช้งาน Tesseract ได้ ต้องมีไฟล์ข้อมูลภาษาให้มันด้วย ซึ่งดาวน์โหลดได้จาก https://github.com/tesseract-ocr/tessdata_best และ https://github.com/tesseract-ocr/tessdata_fast ตัวแรกจะแม่นกว่า ตัวหลังจะเร็วกว่า

โมเดลภาษาไทยชื่อ tha.traineddata
โมเดลภาษาอังกฤษชื่อ eng.traineddata

ตัวอย่างการเรียกใช้งานจาก command line:

tesseract input.png output --oem 1 -l tha -c preserve_interword_spaces=1 --tessdata-dir ./tessdata_best/

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

แก้ไขไฟล์ wordlist

ไฟล์ tha.traineddata จริงๆ ข้างในมีข้อมูลอยู่หลายประเภท เราสามารถแตกมันออกมาเป็นไฟล์ย่อยๆ ได้

combine_tessdata -u ./tessdata_best/tha.traineddata ./tessdata_TEST/tha.

จะได้ไฟล์ unicharset และไฟล์ dawg (Directed Acyclic Word Graphs) ออกมา ซึ่งจากไฟล์เหล่านี้ เราใช้สร้างรายการคำศัพท์ได้

dawg2wordlist ./tessdata_TEST/tha.lstm-unicharset ./tessdata_TEST/tha.lstm-word-dawg ./tessdata_TEST/tha.lstm-word-list

พอได้รายการคำศัพท์มาแล้ว เราแก้มันได้ด้วย text editor ทั่วไปเลย — 1 บรรทัด 1 คำ

พอแก้ไขเสร็จแล้ว ก็ทำกลับกัน คือแปลงรายการคำศัพท์ให้เป็น unicharset และ dawg

wordlist2dawg ./tessdata_TEST/tha.lstm-word-list ./tessdata_TEST/tha.lstm-word-dawg ./tessdata_TEST/tha.lstm-unicharset

และรวมทั้งหมดเข้าด้วยกันเป็นไฟล์ traineddata เพื่อเอาไปใช้งานกับ tesseract

combine_tessdata ./tessdata_TEST/tha.

เราสามารถลองใช้โมเดลใหม่นี้ได้โดยบอก tesseract ผ่านพารามิเตอร์ –tessdata-dir ให้มาใช้ข้อมูลในไดเรกทอรีนี้

(วิธีการจัดการกับไฟล์คำศัพท์นี้ ขอบคุณ Shreeshrii ที่ช่วยอธิบายอย่างละเอียด)

ผลการทดสอบ

เท่าที่ทดสอบเร็วๆ การ preprocess ประมวลภาพก่อนจะส่งให้ Tesseract มีผลมาก แค่ปรับภาพจากสีเป็นขาวดำ ก็ทำให้อ่านข้อความได้เพิ่มขึ้น และยิ่งเราตัด (crop) ภาพมาเฉพาะส่วนที่มีข้อความ มันก็จะแม่นขึ้นอีก อย่างไรก็ตามการ postprocess อย่างการทำ spellcheck แก้คำผิด ก็ยังจำเป็นอยู่ ถ้าต้องการความแม่นยำที่เพิ่มขึ้นครับ

ด้านล่างเป็นผลทดสอบด้วยโมเดลจาก tessdata_best โดยไม่ได้ปรับแต่งอะไรเพิ่ม

Pantip on Facebook Color - read with Tesseract
ภาพจากสื่อสังคม (ไม่ได้ preprocess เลย) เมื่อทดสอบอ่านด้วย Tesseract
Pantip on Facebook Black and White - read with Tesseract
ภาพจากสื่อสังคม (ปรับสีเป็นขาวดำ) เมื่อทดสอบอ่านด้วย Tesseract
Pantip on Facebook Black and White, Cropped - read with Tesseract
ภาพจากสื่อสังคม (ปรับสีเป็นขาวดำและตัดมาเฉพาะส่วนที่เป็นข้อความ) เมื่อทดสอบอ่านด้วย Tesseract

ใครลองเล่นแล้วได้ผลอย่างไรบอกกันได้ครับ

โดย bact ณ 19 February 2018 06:50 +0700

22 January 2018

bact

ทำเว็บ ทำแอป ให้รองรับหลายภาษา หลากวัฒนธรรม

ไลบรารี/เฟรมเวิร์กสำหรับการทำให้แอป/เว็บไซต์รองรับหลายภาษา/วัฒนธรรม หรือที่เรียกว่า “internationalization” ทั้งส่วนหน้าตาและการประมวลผลอื่นๆ เช่น เรียงลำดับตามพจนานุกรม ปฏิทิน รูปแบบวันเวลา สกุลเงิน

โพสต์เรื่องนี้ไปที่กรุ๊ปสมาคมโปรแกรมเมอร์ไทยและใน Medium ขอโพสต์ซ้ำที่นี่

อะไรคือ Internationalization?

หลักๆ ในเรื่องนี้มี 2 คำ คือ internationalization (i18n) กับ localization (L10n)

ส่วนของโค้ดจะเป็นการทำ internationalization รองรับไว้ คือเตรียมให้รองรับหลายภาษา/วัฒนธรรม ไม่ hardcode ภาษาลงในโค้ด คนเขียนโค้ดไม่ทึกทักเรื่องเกี่ยวกับภาษาและวัฒนธรรมไปเอง

สำหรับข้อความ/ข้อมูลสำหรับแต่ละภาษาแต่ละประเทศจะเก็บเป็นก้อนๆ เอาไว้ เรียกว่า locale

การจัดเตรียมข้อมูล locale พวกนี้เรียกว่า localization ซึ่งมีทั้งการแปลข้อความ และการเตรียมข้อมูลที่เจาะจงกับประเทศ/เขตการปกครอง/วัฒนธรรม

(ตัวย่อ i18n และ L10n มาจากอักษรแรกสุด+จำนวนตัวอักษรระหว่างอักษรแรกสุดกับอักษรท้ายสุด+อักษรท้ายสุด ใช้ i ตัวเล็ก และ L ตัวใหญ่ เพื่อให้เห็นแตกต่างจากเลขหนึ่ง 1)

ข้อมูลจำเพาะท้องถิ่น (locale)

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

ส่วนข้อมูลที่เป็นพื้นฐานสำหรับแต่ละภาษาแต่ละประเทศ ที่ไม่ขึ้นกับแอป มีคนทำเอาไว้แล้วที่โครงการ Unicode Common Locale Data Repository (CLDR)

เฟรมเวิร์กเกือบทั้งหมดรองรับการดึงข้อมูลจาก CLDR นี้ (และเราไม่ควรคิดใช้อะไรที่ต่างไปจาก CLDR ถ้าไม่ชัวร์จริงๆ ว่าคิดดีแล้ว)

ชื่อเรียก locale มีมาตรฐานกำหนดวิธีเรียกไว้ อยู่ในรูปแบบ:

เช่น th_TH คือภาษาไทยที่ใช้ในประเทศไทย, en_GB คือภาษาอังกฤษที่ใช้ในสหราชอาณาจักร, en_MY ภาษาอังกฤษที่ใช้ในมาเลเซีย, my_MM “ภาษาเมียนมาร์” ที่ใช้ในประเทศเมียนมาร์

รหัสภาษาและรหัสประเทศ​ โดยทั่วไปแล้วจะใช้ตามมาตรฐาน ISO ซึ่งจะมีทั้งแบบ 2 ตัวอักษร และแบบ 3 ตัวอักษร — โปรดสังเกตว่า รหัสภาษาและรหัสประเทศอาจจะแตกต่างกัน เช่น ภาษาญี่ปุ่นคือ ja ส่วนประเทศญี่ปุ่นคือ JP, หรือ MY ถ้าเป็นประเทศคือมาเลเซีย แต่ถ้าภาษา my คือ “ภาษาในเมียนมาร์”

บางทีเราจะเห็นชื่อ locale ในรูปแบบ รหัสภาษา_รหัสประเทศ_รหัสประเทศ อันนี้ต้องไปอ่านเอกสารของเฟรมเวิร์กนั้นๆ อีกทีว่าหมายความว่าอะไร เพราะมันไม่ใช่มาตรฐาน

เช่น th_TH_TH ใน Java จะหมายถึง ภาษาไทย, ในประเทศไทย, และใช้เลขไทยด้วย หรือ ja_JP_JP จะหมายถึง ภาษาญี่ปุ่น, ในประเทศญี่ปุ่น, และใช้การนับปีปฎิทินแบบญี่ปุ่น (Imperial calendar)

(ภาษาบางภาษาไม่มีโค้ดแบบ 2 ตัวอักษร แต่มีโค้ดแบบ 3 ตัวอักษร เช่น bur คือภาษาพม่า)

การทำงานของโค้ดที่ถูก internationalized แล้ว

ในการทำงานของโค้ด หลังจากโค้ดทราบภาษา/ประเทศของผู้ใช้ (จากที่ผู้ใช้ตั้งค่าเอง หรือจากการ detect/เดา หรือใช้ค่าจากระบบปฏิบัติการ) ตัวโค้ดก็จะไปดึงข้อมูลที่ตรงกันมาใช้ เพื่อกำหนดการแสดงผลหรือประมวลผล

เช่นถ้าทราบว่าเป็นผู้ใช้ภาษาอังกฤษ (en) ที่อยู่ในประเทศไทย (TH) ก็จะโหลด locale en_TH ขึ้นมาใช้ ซึ่งในการทำงานก็เป็นไปได้ว่า หน้าจอจะแสดงเป็นภาษาอังกฤษ แต่วันหยุดต่างๆ ใช้ตามปฏิทินของไทย

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

โค้ดสามารถโหลดข้อมูล locale ได้จากทั้งฐานข้อมูล ใน string array ใน JSON หรือในแฟ้มต่างหาก อันนี้ก็ต้องไปตัดสินใจกันว่าทำงานแบบไหนสะดวกกว่า

i18n Library / Framework

ไลบรารี/เฟรมเวิร์กสำหรับ JavaScript ที่พบตอนนี้มีดังนี้

มีคนทำตารางเปรียบเทียบไว้ https://github.com/rxaviers/javascript-globalization/blob/master/README.md

สำหรับ PHP มีคนแนะนำวิธีต่างๆ ไว้ https://lingohub.com/blog/2013/06/php-internationalization-i18n-mechanisms-tutorial/

สำหรับ Ruby on Rails มีตัวนี้อีกตัว https://github.com/fnando/i18n-js คุณ Vittayasak Rujivorakul แนะนำมา

จบดื้อๆ แค่นี้ มีอะไรไปคุยกันได้ในเฟซบุ๊กกรุ๊ป สมาคมโปรแกรมเมอร์ไทย ครับ https://www.facebook.com/groups/ThaiPGAssociateSociety/

โพสต์(อาจจะ)ที่เกี่ยวข้อง

โดย bact ณ 22 January 2018 13:16 +0700

13 January 2018

bact

National Digital ID

Aadhaar เป็นระบบยืนยันตัวตนแห่งชาติของอินเดีย ดูแลโดยหน่วยงานชื่อ UIDAI (Unique Identification Authority of India) ถ้าจะเทียบกับของไทยตอนนี้ก็คือโครงการ National Digital ID

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

แต่ก็นั่นแหละ ตั้งแต่เปิดใช้มา มีข่าวเจ๊ง หลุด รั่ว ล่ม แทบทุกสัปดาห์ (ลองดูข่าวที่ Software Freedom Law Centre, India และ Centre for Internet and Society รวบรวมมา) และปัญหาที่เกิด ไม่ได้มีเพียงปัญหาทางเทคโนโลยี แต่มีปัญหาที่เกิดระหว่างชิ้นส่วนที่เอามาประกอบกันด้วย และรูรั่วอีกมาจากคนหรือระบบการทำงานขององค์กร

Sunil Abraham จากศูนย์ Centre for Internet and Society ที่อินเดีย เขียนไว้น่าสนใจว่ามันอาจจะเกิดความผิดฝาผิดตัวในสมมติฐานการออกแบบระบบ

“This is because the digital identity solution for the nation as conceived by Aadhaar architects is based on the problem statement of digital identity within a firm. Within a firm all internal entities can be trusted. But in a nation state you cannot make this assumption.”

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

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

ก็เรียนรู้จากบทเรียนในอดีตของเรา กับบทเรียนในปัจจุบันของประเทศอื่นกันไปครับ

ใครสนใจโครงการ Digital ID Platform ของไทย เชิญได้ที่เว็บไซต์ www.digitalid.or.th ครับ มีร่าง White Paper ให้โหลดไปอ่านด้วย นอกจากนี้ยังมีกิจกรรม open forum อยู่เป็นระยะ ถ้าสนใจเข้าร่วมก็ติดต่อทีมงานได้ครับ ข่าวสารส่วนหนึ่งเผยแพร่ทางเฟซบุ๊กด้วยที่เพจ National Digital ID

 

โดย bact ณ 13 January 2018 12:10 +0700

11 January 2018

bact

ตรวจสอบการจัดหาข้อมูลเข้าสำหรับระบบปัญญาประดิษฐ์

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

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

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

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

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

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

ถ้าเป็นแบบนี้ การประเมิน “ข้อมูลเข้า” (1) อย่างเดียวก็จะไม่พอไหม ต้องประเมิน “การจัดหาข้อมูลเข้า” (0) ด้วยอีกที?

ก่อนหน้านี้มันเป็น คอมเล่มเกมกับคอมกันเอง เพื่อฝึกฝน
ต่อไปมันจะเป็น คอมสร้างเกมขึ้นมาให้คนเล่นตามเกมนั้น เพื่อฝึกฝน

Collect -> Input -> Process -> Output

โดย bact ณ 11 January 2018 15:59 +0700

9 January 2018

Thep

Thanks for the Last Year

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

ขอขอบคุณผู้สนับสนุนดังนี้:

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

สำหรับปีที่ผ่านมา นอกจากงานยืนพื้นที่ผมแวะเวียนมาทำอยู่ตลอดเมื่อมีโอกาส คืองานแปล Xfce แล้ว ในช่วงปลายปีราวเดือนกันยายนเป็นต้นมา ผมถูกกระตุ้นด้วย issue จำนวนหนึ่งในโครงการ fonts-tlwg จากคุณ Abhabongse Janthong จนได้ออกรุ่น 0.6.4 ประเดิมเป็นงานแรกของปี แล้วก็ตามมาด้วย fonts-sipa-arundina 0.2.2 ที่หยิบยืมแพตช์ของคุณ Abhabongse มาใช้ด้วย

จากนั้นก็ติดลมมาถึงซีรีส์ของ libthai ที่ได้ทำสะสมมาตลอดปี ได้เป็นรุ่น 0.1.27 แล้วก็เอา word list ที่ได้ไปปรับใส่ใน TeX hyphenation และออก swath 0.6.0 พร้อมกับการปรับกลไกภายในขนานใหญ่ของตัวตัดคำของ swath เอง

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

โดย Thep (noreply@blogger.com) ณ 9 January 2018 05:22 +0700

8 January 2018

bact

ตัวชี้วัดเป็นคนละอย่างกับสิ่งที่มันวัด

ในหนังสือ Algorithms to Live By: The Computer Science of Human Decisions มีอยู่ตอนหนึ่งที่ยกตัวอย่างน่าสนใจดี (ได้จำเอาไปคุยกับนักศึกษาวิชา Computer Ethics and Law ที่ลาดกระบังด้วย)

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

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

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

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

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

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

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

การประกันคุณภาพหรือการป้องกันการทุจริตด้วยการตั้ง KPI ตั้งตัวชี้วัดต่างๆ นานาขึ้นมา ก็น่าจะคิดถึงเรื่องนี้ด้วย

ว่าเรากำลังจะมองหาคุณสมบัติเฉพาะบางอย่างที่มันมีประโยชน์กับงานจริงๆ โดยมองผ่านทางตัวชี้วัด

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

โดย bact ณ 8 January 2018 06:07 +0700

31 December 2017

bact

Consumer information security tools – Thai localization 2017 summary

การแปลโปรแกรมรักษาความปลอดภัยในการใช้คอมใช้เน็ต สำหรับผู้ใช้ทั่วไป สรุปสิ้นปี 2017

Thanks COCONET: Southeast Asia Digital Rights Camp and Localization Lab for a localization sprint this year for Thai, Bahasa Indonesia, Burmese, and Khmer. Events like that help volunteer translators get connected to people who close to developers, and it helps the translation submission goes more smooth.

รอผู้พัฒนาดำเนินการต่อ

แปล 100% รีวิว 100% รอให้าทางผู้พัฒนาทดสอบการใช้งานในแอป

A chart showing that Signal on Android 100% translated to Thai

ยังแปลไม่เสร็จ

รอให้ทางโครงการเพิ่มภาษาไทย

สำหรับโปรแกรมที่อยู่บน Transifex แล้ว ใครสนใจช่วยแปล สามารถสมัครสมาชิก Transfex (ฟรี) แล้วไปที่หน้าโครงการ กด Join Team ได้เลยครับ — ถ้าโปรแกรมเหล่านี้เป็นภาษาไทย ก็มีโอกาสที่คนไทยจะสามารถใช้โปรแกรมช่วยความปลอดภัยเหล่านี้ได้มากขึ้นครับ

สวัสดีปีใหม่ 2018 ทุกท่าน ขอให้เป็นปีที่ปลอดภัย คิด ทำ พูด ได้อย่างมั่นใจ 🙂

โดย bact ณ 31 December 2017 11:17 +0700

16 December 2017

Kitt

พิธีพระราชทานปริญญาบัตร มข. พ.ศ. ๒๕๖๐

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

โดย kitty ณ 16 December 2017 11:42 +0700

1 December 2017

Thep

swath 0.6.0

swath 0.6.0 ออกแล้วเมื่อวันก่อน โดยมีลำดับความต่อเนื่องนับจากการปรับพจนานุกรมใน libthai 0.1.27 ดังนี้:

แต่การปรับพจนานุกรมตัดคำก็เป็นแค่น้ำจิ้มสำหรับ swath รุ่นนี้ เพราะมีการปรับซอร์สโค้ดตามที่เคยทำมาต่อไป โดยในครั้งนี้เป็นครั้งแรกที่ล้วงเข้าไปปรับกลไกภายในของการตัดคำ หลังจากที่รุ่นก่อน ๆ ทำแค่ส่วน command line parsing และ input/output filter ต่าง ๆ เท่านั้น

สรุปความเปลี่ยนแปลงที่สำคัญคือ

ด้วยความเปลี่ยนแปลงขนานใหญ่ในกลไกภายใน จึงได้ปรับเลข minor version แทนที่จะปรับแค่ micro version โดยเปลี่ยนจากซีรีส์ 0.5.x ขึ้นเป็น 0.6.0

ในส่วนของ Debian upload ก็ได้เพิ่ม test suite สำหรับ autopkgtest ในทำนองเดียวกับ libthai ด้วย

โดย Thep (noreply@blogger.com) ณ 1 December 2017 10:11 +0700

17 November 2017

Ott

คุณเป็นผู้นำหรือผู้ตาม?


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



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

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

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

หากท่านต้องการเป็นผู้ตามที่ดี ก็ต้อง

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

โดย Pattara Kiatisevi (noreply@blogger.com) ณ 17 November 2017 17:41 +0700