Theppitak's blog

My personal blog.

19 มิถุนายน 2561

libdatrie 0.2.12

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

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

  • แก้การประกาศฟังก์ชันที่ไม่รับพารามิเตอร์ด้วยรูปแบบ f(void) แทน f() เนื่องจากรูปแบบ f() เป็นเพียงการประกาศแบบ K&R ซึ่งไม่ระบุข้อมูลเกี่ยวกับพารามิเตอร์ ซึ่งในการ call จริงอาจใส่อาร์กิวเมนต์ใด ๆ มาก็ได้ ในขณะที่แบบ f(void) จะแสดงความชัดเจนว่าไม่รับพารามิเตอร์ใด ๆ
  • เปลี่ยนการกำหนดชนิด Bool ซึ่งเดิมกำหนดเป็น enum TRUE, FALSE ซึ่งจะไปชนกับค่าในซอร์สโค้ดอื่นได้ง่ายมาก จึงเปลี่ยนชื่อหลบแล้ว define TRUE, FALSE แบบมีเงื่อนไขเอา
  • ตัด typedef ชนิด byte, word, dword ที่ไม่มีการใช้งานใน libdatrie แต่มีโอกาสชื่อชนกับซอร์สอื่นที่ไปใช้ร่วมสูงมาก

นั่นนำไปสู่การตรวจสอบหาประเด็นอื่น ๆ ต่อ โดยใช้ 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 จริง ๆ

ป้ายกำกับ:

25 เมษายน 2561

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 ตัวจริงคนหนึ่งมา ณ ที่นี้ ที่จับบั๊กนี้ได้ครับ

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

  • แปลงแฟ้มต้นฉบับของฟอนต์เป็นฟอร์แมตของ Fontforge รุ่นล่าสุด
  • ปรับ configure script ให้ตรวจรุ่นของ fontforge ตามรูปแบบเลขรุ่นที่เปลี่ยนไป จากแบบตัวเลขมาเป็นแบบวันที่
  • ย้ายที่ติดตั้งแฟ้ม fontconfig template ทั้งหลาย จาก /etc/fonts ไปไว้ที่ /usr/share/fontconfig ตามการเปลี่ยนแปลงใน fontconfig ล่าสุด
  • ปรับค่า TTFWeight ของฟอนต์น้ำหนักปกติทุกฟอนต์ให้เป็นค่า 400 (Regular) ทั้งหมด เนื่องจากบางฟอนต์ที่ยังมีค่าเป็น 500 (Medium) นั้น ทำให้แอปบางตัว (เช่นที่รายงานใน Issue #5 คือ EditPad) จัดฟอนต์ให้ไปอยู่ในกลุ่มตัวหนา

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

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

ป้ายกำกับ: ,

23 เมษายน 2561

libdatrie 0.2.11

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

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

  • ตรวจสอบ error จาก iconv() ได้ถูกต้องยิ่งขึ้น จากรายงานของ Daniel Macks ใน Issue #3
  • ปรับคำบรรยายแพกเกจใน README เนื่องจาก @flackbash ทักท้วงมาใน Issue #4 ว่า complexity ของการ search ของ trie เป็น O(m) เมื่อ m คือความยาวของคีย์ ไม่ใช่ O(1) เสียหน่อย ซึ่งอันที่จริง การอ้าง O(1) ก็เป็นเพียงการบอกว่า เวลาที่ใช้มันไม่ขึ้นกับขนาดของฐานข้อมูลเท่านั้น ในทำนองเดียวกับที่ hash table มักจะอ้าง compexity O(1) เหมือนกัน ทั้ง ๆ ที่เวลาที่ใช้ในการคำนวณค่า hash โดยปกติก็เป็น O(m) อย่างไรก็ดี ถูกทักท้วงมาเช่นนี้ก็แก้ไขตามนั้น แต่ยังคงเน้นว่ามันไม่ขึ้นกับขนาดของฐานข้อมูล
  • ปรับแก้การทำงานของ trie_state_get_data() ซึ่งเดิมทำงานไม่ถูกต้องในกรณีที่คีย์ที่ใช้ค้นนั้นเป็นส่วนต้นของคีย์อื่น (เช่น กา เป็นส่วนต้นของ การ) ซึ่งทำให้โครงการ pytries หันไปใช้วิธีเพิ่มฟังก์ชันใหม่ โดยส่งแพตช์มาให้ผมในเมลส่วนตัว ผมจึงแสดงความเห็นไปว่าน่าจะปรับแก้ฟังก์ชันเดิมให้ทำงานให้ถูกต้อง แทนที่จะเพิ่มฟังก์ชันใหม่ เรื่องเงียบไประยะหนึ่ง จนกระทั่งมีการผลักดันแพกเกจ python-datrie เข้า Debian (ITP) Andreas Tille จึงหันมากระทุ้งผมเรื่องนี้อีกครั้ง (Debian #894278) จนในที่สุดผมก็เลยแก้ปัญหานี้ (commit) และ Filip Pytloun ก็ได้ช่วยทดสอบให้ และปรับแก้ที่ pytries ให้
  • แก้ปัญหา segfault เมื่อใช้งานกับ alpha map แบบเต็มช่วง (0-255) โดย Xiao Wang รายงานใน Issue #6 ว่าเขาพบเมื่อใช้งานกับ PHP ซึ่งผมยังไม่มีเวลาไปตรวจสอบ จึงทิ้งช่วงมาจนกระทั่ง @nevermatch เข้ามาวิเคราะห์และชี้จุดผิดพลาดให้ ซึ่งผมก็ยังคง reproduce ไม่ได้อยู่ดี คือมันไม่ segfault แต่พบความผิดปกติตามที่เขาชี้จริง จึงถือว่ามีข้อมูลเพียงพอที่จะแก้ปัญหาได้แล้ว ซึ่งต้องขอขอบคุณทั้งสองท่านอย่างมากที่ช่วยตรวจสอบปัญหานี้ให้

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

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

ป้ายกำกับ:

09 มกราคม 2561

Thanks for the Last Year

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

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

  • เดือนเมษายน 2560
    • คุณวิทยา ไตรสารวัฒนะ
  • เดือนมิถุนายน 2560
    • คุณวิทยา ไตรสารวัฒนะ
  • เดือนสิงหาคม 2560
    • คุณวิทยา ไตรสารวัฒนะ
  • เดือนธันวาคม 2560
    • คุณวิทยา ไตรสารวัฒนะ

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

สำหรับปีที่ผ่านมา นอกจากงานยืนพื้นที่ผมแวะเวียนมาทำอยู่ตลอดเมื่อมีโอกาส คืองานแปล 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 พันกว่าข้อความ แถมมีศัพท์เทคนิคทางมัลติมีเดียเต็มไปหมด ความคืบหน้าจึงค่อนข้างช้า แต่ก็ตั้งใจว่าจะลุยแปลให้ได้มากที่สุดเท่าที่จะทำได้ครับ

ป้ายกำกับ:

01 ธันวาคม 2560

swath 0.6.0

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

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

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

  • ตัดตัวเลือก -l ซึ่งไม่มีเอกสารอธิบายว่าเอาไว้ทำอะไร
  • refactor dictionary ออกจากตัวตัดคำ ทำให้แยก lifetime ของพจนานุกรมออกจากตัวตัดคำ ซึ่งในอนาคตอาจเรียกตัวตัดคำซ้ำหลายครั้งได้โดยไม่ต้องเปิด dictionary ใหม่ หรือสามารถเรียกตัวตัดคำตัวเดิมซ้ำโดยเปลี่ยน dictionary ได้ เป็นต้น
  • simplify โค้ดของตัวตัดคำให้เข้าใจง่าย ลดความซับซ้อน ตัดส่วนที่ไม่จำเป็น รวมส่วนที่สามารถรวมได้
  • แก้ไขการทำงานของ longest matching scheme ที่เดิมทำงานไม่ถูกต้อง เพราะโค้ดทำงานง่ายเกินเหตุ ไม่มีการ backtrack ทำให้ได้คำตอบผิดพลาดในบางกรณี ในรุ่นนี้ได้แก้ให้ทำงานถูกต้องแล้ว (พร้อม test case สำหรับยืนยัน)
  • จัดระเบียบโค้ดยิบย่อยเพื่อความเป็นระเบียบ (ยังเหลือให้ปรับได้อีกในรุ่นถัด ๆ ไป)
  • ปรับแก้การใช้คำพูดใน manpage พร้อมกับการอ้างถึงโปรแกรม trietool ของ libdatrie แทน trietool-0.2 ซึ่งเป็นชื่อเก่า

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

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

ป้ายกำกับ:

25 ตุลาคม 2560

LibThai 0.1.27 & Word Suggestion Channel

LibThai 0.1.27 ออกแล้ว โดยห่างจาก รุ่นที่แล้ว ถึง 10 เดือน ก็สมควรแก่เวลาปล่อยข้อมูลพจนานุกรมที่แก้ไขสะสมไว้ในช่วงเวลาดังกล่าว รวมถึงแก้ปัญหา reproducibility ที่ถูกจับโดยโครงการ Reproducible Builds ของ Debian

พูดถึงประเด็นหลังก่อน ปัญหา reproducibility ที่ตรวจพบก็คือ มีการ capture build path ลงใน document ที่สร้างด้วย doxygen ทำให้เนื้อหาที่ได้มีความแตกต่างเกิดขึ้นในกรณีที่ build path ต่างกัน ก็แก้ไขด้วยการ strip path prefix ออกเสีย

เกี่ยวกับเรื่องพจนานุกรมตัดคำ รุ่นนี้เพิ่มคำเข้ามา 175 รายการ ทำให้จำนวนคำเพิ่มจาก 24,294 คำในรุ่นที่แล้ว เป็น 24,469 คำในรุ่นนี้ โดยคำที่เพิ่ม แบ่งเป็น:

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

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

ในส่วนของ Debian upload นอกเหนือจากการปรับรุ่นของต้นน้ำแล้ว ก็ได้เพิ่ม test suite สำหรับ autopkgtest เพื่อรองรับ CI (Continuous Integration) Test ของ Debian โดยในการอัปโหลดแพกเกจอื่นที่เกี่ยวข้อง เช่น libdatrie ก็จะเพิ่มการรองรับนี้ต่อไปในอนาคตเช่นกัน

ป้ายกำกับ:

20 ตุลาคม 2560

Fonts-SIPA-Arundina 0.2.2

Fonts-SIPA-Arundina 0.2.2 ออกแล้ว รุ่นนี้ปรับปรุงความสามารถของ LaTeX package โดยดึงมาจาก Fonts-TLWG 0.6.4 สองเรื่อง คือ

  • ตัวเลือก sans เพื่อกำหนดให้ใช้ฟอนต์ sans-serif เป็นฟอนต์ปริยายของเอกสาร
  • ตัวเลือก scale=value เพื่อกำหนดอัตราย่อ-ขยายของตัวอักษร

นอกจากนี้ ยังมีรายการเปลี่ยนแปลงเล็กน้อยเกี่ยวกับ CTAN คือผมพยายามจะเปลี่ยนชื่อแพกเกจจาก fonts-sipa-arundina ให้เป็น fonts-arundina เพื่อความกระชับในการเรียก โดยได้ทำไปแล้วสองส่วน คือ ชื่อโครงการที่ GitHub และในชื่อแพกเกจ LaTeX ซึ่งผู้ใช้สามารถเรียกใช้ด้วยคำสั่ง \usepackage{fonts-arundina} ได้

ส่วนที่ทำเพิ่มในรุ่นนี้ก็คือ การเปลี่ยนชื่อไดเรกทอรีที่ CTAN จาก /fonts/thai/fonts-sipa-arundina ให้เป็น /fonts/thai/fonts-arundina เฉย ๆ เพื่อให้สอดคล้องกับชื่อแพกเกจจริง รวมทั้งเปลี่ยนชื่อ source directory ใน CTAN ZIP file ด้วย

ส่วนที่ยังเหลือ คือ ชื่อ Debian package และ ชื่อ FTP directory ที่ LTN ซึ่งทั้งสองส่วนยังเกี่ยวพันกันอยู่ และการเปลี่ยนชื่อแพกเกจใน Debian จะมีรายละเอียดให้ทำพอสมควร เช่น การรอคิว NEW, การทำ package transition, การ clean config file เก่า ฯลฯ จึงยังคงชะลอไว้ก่อน จนกว่าจะมีเวลาเป็นเรื่องเป็นราวกว่านี้

เนื่องจาก LaTeX package ของฟอนต์ Arundina ยังไม่ได้เป็นส่วนหนึ่งของ TeXLive เหมือนกับชุด fonts-tlwg และเสิร์ฟให้ผู้ใช้ Debian ผ่านแพกเกจ latex-fonts-sipa-arundina โดยตรง ผู้ใช้ LaTeX ผ่าน Debian unstable จึงสามารถอัปเกรดและทดลองใช้ได้ทันที

ป้ายกำกับ: ,

hacker emblem