Theppitak's blog

My personal blog.

31 กรกฎาคม 2551

Dynamic Debian Mirroring

ดูแล Debian mirror ที่ debianclub.org มาได้จะครบปีแล้ว โดยอาศัย rsync ตาม วิธีการของ Debian โดย sync วันละสองรอบ เช้า-เย็น พร้อมกับ ป้อนต่อไปอีกสองแห่ง คือ LTN และ mirror ใน มข.

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

สำหรับปัญหาที่พบ ไม่มีอะไรร้ายแรงเหมือน สมัยทำที่ LTN แต่ก็ยังมีเรื่องจุกจิกอยู่บ้าง พอสรุปได้ดังนี้

  • แหล่งที่อยู่ใกล้ไม่ค่อย update ในสมัยเริ่มแรกนั้น แหล่งที่ใกล้ที่สุดคือฮ่องกง แต่การ update จะไม่สม่ำเสมอ แถมในช่วงแรกยังไม่เปิด anonymous rsync ให้อีกต่างหาก จึงต้องใช้แหล่งถัดไป คือที่สเปน แต่แล้วก็ต้องเปลี่ยนไปมา เพราะหลายครั้งที่สเปนก็ไม่ update ก็เข้าไปเปลี่ยนแหล่ง sync เป็นคราว ๆ ไป เนเธอร์แลนด์บ้าง นิวซีแลนด์บ้าง แต่โดยเฉลี่ยแล้ว แหล่งในเอเชียไม่ค่อย update ในช่วงแรก แถมระยะทางในเครือข่ายยังไล่เลี่ยกับยุโรปอีกต่างหาก
  • การ update ล่าช้า โดยปกติผมตั้ง cron ไว้ให้เริ่ม sync หลังกำหนด update ของ ftp-master 2 ชั่วโมง โดยกะว่า mirror หลักต่าง ๆ คง sync กันพอสมควรแล้ว แต่ก็ปรากฏว่า บางวันพอถึงกำหนดที่ว่า mirror ก็ยัง sync กันไม่เสร็จ อาจเป็นเพราะวันนั้นมี update เป็นปริมาณมาก หรือไม่ก็มีปัญหาบางจุดในเครือข่าย
  • สคริปต์ rsync ตายกลางคัน อันนี้นาน ๆ จะเจอที เนื่องจาก debianclub อาจจะอยู่ใกล้ backbone แต่ถ้าเป็นสมัย LTN ล่ะก็ เจอประจำ

เหล่านี้ ทำให้ต้องเข้าไปสั่งแบบ manual เป็นครั้งคราว สั่งบ่อยเข้า ก็พบว่าตัวเองกำลังทำงานเป็นแพตเทิร์นบางอย่างซ้ำ ๆ เลยชักเบื่อ เขียนเป็นสคริปต์เลือก mirror รายวันเลยดีกว่า

สคริปต์นั้น จะเลือก mirror ที่ดีที่สุด (ใกล้และ update ที่สุด) โดยแบ่งการทำงานเป็น 2 ขั้น:

  1. รอให้ master เปลี่ยนแปลง เพื่อจัดการกับปัญหาการ update ล่าช้า โดยแทนที่สคริปต์จะเริ่ม sync ทันที ก็เช็ก master เสียก่อน ว่าเปลี่ยนแปลงหรือยัง ถ้ายัง ก็ sleep ไปก่อน โดยตื่นขึ้นมาเช็กเป็นระยะ ๆ จนกว่าจะพบการเปลี่ยนแปลง จึงจะทำงานต่อไป
  2. เลือก mirror ที่ดีที่สุด โดยทำ ranking 20 อันดับแรกของ mirror ต่าง ๆ ด้วย netselect เอาไว้ แล้วไล่เช็ก timestamp ของแหล่งต่าง ๆ เริ่มจากแหล่งที่ใกล้ที่สุดก่อน ไล่ไปเรื่อย ๆ จนพบแหล่งที่ timestamp มากกว่าหรือเท่ากับของ master ถ้าไล่จนหมดรายชื่อแล้วไม่มีใครใหม่เลย ก็ sleep คอยเช็กเป็นระยะ ๆ ถ้าทำทั้งหมดนี้แล้ว ยังไม่พบ mirror ที่ดี ก็ค่อยบังคับ sync จาก master เป็นคำตอบสุดท้าย

ตัวสคริปต์มีเนื้อหาดังนี้ (license: GPL-2):

การอ่าน timestamp ของ mirror

get_site_stamp()
{
  SITE=$1
  wget -q -t 1 -T 5 -O - ftp://$SITE/debian/project/trace/ftp-master.debian.org
}

ตัวเลือกต่าง ๆ ของ wget มีเหตุผลดังนี้

  • -q ให้มันเงียบ ๆ ไม่ต้องแสดง progress
  • -t 1 ลองครั้งเดียวพอ ไม่ต้องลองซ้ำหลายครั้ง เนื่องจากถ้าเจอปัญหา mirror ล่มไป จะได้ไม่ต้องเสียเวลาคอยนาน
  • -T 5 หยุดรอแค่ 5 วินาที ซึ่งเป็นเวลาที่มักจะได้คำตอบจาก mirror ที่ตอบสนองปกติ และถ้า mirror ไหนล่มไป ก็ไม่ต้องคอยนาน
  • -O - เพื่อให้เขียนเนื้อหาออก stdout เป็นผลลัพธ์ของฟังก์ชันนี้
  • แฟ้ม timestamp ใช้ ftp ไม่ใช่ http เพื่อเลี่ยงการได้เนื้อหาที่ค้างใน proxy หรือในกรณีที่บาง mirror ห้าม access ไดเรกทอรีนี้ผ่าน http

การเปรียบเทียบ timestamp

date_cmp()
{
  DATE1=`date -d "$1" "+%Y%m%d%H%M%S"`
  DATE2=`date -d "$2" "+%Y%m%d%H%M%S"`
  expr $DATE1 - $DATE2
}

timestamp จากเซิร์ฟเวอร์ จะได้มาในรูปวัน-เวลาแบบนี้

Wed Jul 30 20:00:01 UTC 2008

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

การรอ master เปลี่ยนแปลง

wait_master_change()
{
  LOCAL_STAMP=`get_site_stamp localhost`
  MASTER_STAMP=`get_site_stamp ftp.debian.org`
  RETRIES=0
  while [ `date_cmp "$MASTER_STAMP" "$LOCAL_STAMP"` -le 0 ] \
          && [ $RETRIES -lt 15 ]
  do
    RETRIES=`expr $RETRIES + 1`
    date "+%H:%M:%S [$RETRIES] - Master unchanged, sleeping." >&2
    sleep 600
    MASTER_STAMP=`get_site_stamp ftp.debian.org`
  done
  if [ `date_cmp "$MASTER_STAMP" "$LOCAL_STAMP"` -le 0 ]; then
    # master not changed, return failure code
    return 1
  else
    # master changed, return sucess code
    return 0
  fi
}

วนอ่าน timestamp ของ master (ทึกทักเอา ftp.debian.org เป็น master แต่ความจริงเป็นคนละเซิร์ฟเวอร์กับ ftp-master) มาเปรียบเทียบกับในเครื่อง รอจนกว่า timestamp ของ master จะล้ำหน้าของเครื่องเรา (มีบางขณะเหมือนกัน ที่ของเราล้ำหน้าของ master อันเนื่องมาจากเวลาที่เหลื่อมกันเล็กน้อยระหว่างการ sync ของ ftp.debian.org กับการ sync ของ mirror อื่น) หรือถ้าครบกำหนดการวนอ่าน (คิดเป็นเวลาหลับ ๆ ตื่น ๆ ก็ร่วม 2 ชั่วโมงครึ่ง) แล้วคืนค่าเป็นรหัสบอก

ฟังก์ชันนี้คืนค่าเป็น return code ของเชลล์ คือ 0 = สำเร็จ, 1 = ล้มเหลว

การตรวจหา mirror ที่ดีที่สุด

choose_best_mirror()
{
  MASTER_STAMP=`get_site_stamp ftp.debian.org`
  if [ $? -ne 0 ]; then
    echo "Failed to fetch master timestemp." >&2
    exit 1
  fi
  if [ ! -f /var/local/debian-mirrors-rank ]; then
    echo "/var/local/debian-mirrors-rank missing." >&2
    echo "Run '/usr/local/bin/rank-debian-mirrors' to update it." >&2
    exit 1
  fi
  for site in `cat /var/local/debian-mirrors-rank`; do
    SITE_STAMP=`get_site_stamp $site`
    if [ ! -z "$SITE_STAMP" ] \
         && [ `date_cmp "$SITE_STAMP" "$MASTER_STAMP"` -ge 0 ]
    then
      echo $site
      return
    fi
  done
}

ผมตั้ง cron ในรอบต่างหากนอกสคริปต์นี้ เพื่อทำ ranking ของ mirror ด้วย netselect แล้วเขียนลงในไฟล์ debian-mirrors-rank เก็บไว้ เพื่อให้สคริปต์นี้ไปอ่าน rank มาใช้

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

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

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

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

ป้ายกำกับ: ,

18 กรกฎาคม 2551

Thai XIM and Conversion Bug on UTF-8 Locale

อีกบั๊กหนึ่งที่ทีมสุริยันจับได้ คือ XIM ไทยไม่รับสระบน-ล่างใน UTF-8 locale ซึ่งมีสาเหตุมาจากโค้ดของผมใน Xlib ที่ทำไว้ตั้งแต่สมัยที่ยังไม่มี UTF-8 locale เกิดขึ้น โดยไปทึกทักเอาว่า ถ้า string conversion callback ที่ไปอ่าน text input buffer ของ app มานั้น ได้ string มาในรูป multi-byte ก็แปลว่าเป็น TIS-620 เสมอ ซึ่งใช้ไม่ได้กับ UTF-8 locale

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

ยังต้องรอรีวิวเพื่อ check-in ต่อไปครับ แต่โพสต์ไว้เผื่อใครจะเอาไปใช้หรือช่วยทดสอบในระหว่างนี้

ก่อนหน้าจะ file bug นั้น ก็ได้ file GNOME #484653 เพื่อแก้ให้ imxim immodule ของ GTK+ ส่ง surrounding text กลับให้ XIM ในรูป wide char แทน multi-byte ไปพลาง แต่ปรากฏว่า การใช้ wide char เองก็มีปัญหาของมัน เนื่องจากขนาด wide char เองก็เริ่มไม่คงที่ คือเป็น multi-word ในบางแพลตฟอร์มที่ใช้ wide char 16 บิต โดย encode ในรูป UTF-16 แทนที่จะเป็น UCS ตรง ๆ หลังจากคิดตลบสอง ก็คิดว่าแก้ที่ XIM เองให้อ่าน multi-byte ให้ถูกต้อง น่าจะตรงประเด็นกว่า แล้วก็ใช้ multi-byte เหมือนเดิมต่อไป

สรุปบั๊กใน Xlib ที่ผ่านมา:

เพิ่งได้ check-in แค่หนึ่งในสี่แพตช์ครับ

ป้ายกำกับ:

15 กรกฎาคม 2551

Thai XIM and NumLock/CapsLock Bug

บั๊กที่เกิดจากปุ่ม CapsLock/NumLock ใน input method ภาษาไทยนี่ ผมตามแก้โค้ดตัวเองมาหลายที่ละ ทั้งใน gtk-im-libthai, ใน GTK+ stock immodule แล้วก็ล่าสุด ใน Xlib เอง ทั้งนี้เพราะผมใช้โค้ดเดิม ๆ ซ้ำในแพตช์ที่ส่งไป โดยในระหว่างทำแพตช์นั้น ผมใช้แป้นพิมพ์ของโน้ตบุ๊ก เลยไม่เคยใช้ NumLock/CapsLock เลย จนกระทั่ง MrChoke รายงานมาเป็นครั้งแรกใน gtk-im-libthai เมื่อนานมาแล้ว

ล่าสุด (ก็หลายเดือนมาแล้วเหมือนกัน) ทีมสุริยันเจอบั๊กนี้อีกใน XIM คือถ้า NumLock/CapsLock ติดอยู่ XIM ภาษาไทยจะไม่กรองลำดับอักขระเลย ผมเคยเจอปัญหาและทางแก้จาก GTK+ immodule แล้ว ก็เลยเสนอแพตช์ลักษณะเดียวกันเข้า Xlib แต่ปรากฏว่า มันไม่ง่ายอย่างที่คิด

CapsLock นั้น ไม่มีปัญหา แป้นพิมพ์แทบทุกระบบจะใช้ modifier mask ตรงกัน คือใช้แมโคร LockMask ใน <X11/X.h> ได้เลย แต่สำหรับ NumLock นั้น ไม่ได้มีในแป้นพิมพ์ทุกรุ่น แถมแต่ละรุ่นก็ยัง map modifier แตกต่างกันไป การที่ผมใช้ xev จับ keyboard event ได้ mask เป็น Mod2Mask นั้น บังเอิญใช้ได้แค่บนลินุกซ์เท่านั้น แต่ในระบบอื่น เช่น AIX มีคนบอกว่า map เป็น Mod5 และวิธีที่ปลอดภัยที่สุด คือ ตรวจสอบกับ X server ด้วย XkbGetVirtualMods

อ่าน man page ก็แล้ว อ่าน spec และ โพรโทคอล ของ XKB ก็แล้ว นั่งทดลองไปมาก็ไม่สำเร็จซะที ดูเหมือนจะมีปัญหาเกี่ยวกับ config บางอย่างของ XKB ที่ทำให้ฟังก์ชันมัน return BadAlloc มาตลอด ราวกับ X server ไม่รองรับ XKB เลย สุดท้าย เลยโกงนิดหน่อย ด้วยการแอบดูโค้ดของชาวบ้าน คือ NumLockX และ gkleds (Debian: gkrellm-leds)

แกะไปแกะมา NumLockX นั้น เขามีสองวิธี คือใช้ XKB ก่อน ถ้าเหลวก็มาใช้ XGetModifierMapping แทน ซึ่งหลังจาก trace ดูแล้ว มันทำงานได้ผลด้วยวิธีหลัง ไม่ใช่เพราะ XKB ส่วน gkleds นั้น ไม่มีอะไรเกี่ยวกับ modifier mask เลย เพราะมันมีหน้าที่แค่แสดง indicator เท่านั้น ไม่ใช่เซ็ต NumLock ด้วยเหมือน NumLockX ก็เลยไม่มีโค้ดอะไรที่เกี่ยวข้อง

ก็เลยดัดแปลงวิธีของ NumLockX มาใช้ แล้ว update patch ใน Freedesktop #12517 เสีย

หุ ๆ โอเพนซอร์สก็ดียังงี้แหละ ขัดสนอะไรก็หยิบยืม/ต่อยอดกันได้ (โดยไม่ต้องแจ้งเป็นลายลักษณ์อักษร :P) ต้องขอบคุณ NumLockX ที่ทำให้ได้ solution

ตอนนี้ xorg เขายังไม่รับแพตช์ครับ รอรีวิวต่อไป..

ป้ายกำกับ:

13 กรกฎาคม 2551

DIP-SIPA Fonts License

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

สืบเนื่องมาจาก ฟอนต์ประกวดของ DIP-SIPA ซึ่ง (ตามที่ระบุใน license) “มีวัตถุประสงค์เพื่อก่อให้เกิดความร่วมมือในการสร้างสรรค์ฟอนต์ในวงกว้าง รวมทั้งเพื่อประโยชน์ทางด้านการศึกษาและการแบ่งปันความรู้และพัฒนาโปรแกรมคอมพิวเตอร์ฟอนต์นี้” ซึ่งโดยเจตนารมณ์แล้ว สมควรที่จะผลักดันเข้า distro ต่าง ๆ เพื่อเผยแพร่ในวงกว้างต่อไป แต่มาติดปัญหาที่ตัว license โดยขอคัดฉบับภาษาอังกฤษมาอ้างอิง ส่วนฉบับภาษาไทยนั้น มีความกำกวมในคำแปล ซึ่งจะพูดถึงต่อไป:

  1. Allow to use without any charges and allow to reproduce, study, adapt and distribute this Font Computer Program. Neither the original version nor adapted version of Font Computer Program may be sold by itself, except bundled and/or sold with any computer program.
  2. If you wish to adapt this Font Computer Program, you must notify copyright owners (DIP & SIPA) in writing.
  3. No adapted version of Font Computer Program may use the Reserved Font Name(s), the name(s) of the copyright owners and the author(s) of the Font Computer Program must not be used to promote or advertise any adapted version, except obtaining written permission from copyright owners and the author(s).
  4. The adapted version of Font Computer Program must be released under the term and condition of this license.

สาระก็คือ ห้ามขายตัวฟอนต์เดี่ยว ๆ นอกนั้นให้แจกจ่าย ดัดแปลงได้ โดย ต้องแจ้งเจ้าของเป็นลายลักษณ์อักษรก่อน และห้ามใช้ชื่อที่สงวนไว้ (ซึ่งในตอนต้นของ license มีการประกาศรายชื่อ “Reserved Font Name(s)” ไว้แล้ว) ปิดท้ายด้วยข้อบังคับว่า ฟอนต์ที่ดัดแปลงแล้วต้องเผยแพร่ด้วย license เดียวกันนี้

ทุก ๆ ข้อ ดูจะโอเค และมีสาระเหมือน Open Font License (OFL) รุ่นเก่าของ SIL ยกเว้นข้อ 2. ที่ระบุให้แจ้งเจ้าของเป็นลายลักษณ์อักษรก่อน ซึ่งไม่มีใน OFL

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

ซอฟต์แวร์เสรีทั่วไป จะอนุญาตให้ผู้ได้รับซอฟต์แวร์ใช้สิทธิ์ได้ทันที โดยไม่ต้อง “call home” และเขาจะ contribute กลับหรือแจ้งเจ้าของหรือไม่ ก็ให้เป็นสิทธิ์ของเขาเอง ซอฟต์แวร์ที่ต้องแจ้งก่อนแก้แบบนี้ จึงไม่ได้รับการยอมรับเข้าไปอยู่ในส่วนแกนหลักของ distro อย่าง Debian หรือ Ubuntu (หรือจะเป็น RedHat/Fedora ก็เคร่งครัดเรื่อง license ไม่แพ้กัน จากที่ผมเคยได้รับการติดต่อมา) อย่างดีก็อยู่ในหมวด non-free หรือ restricted ซึ่งไม่มีการ maintain เพราะจะมีอุปสรรคในการแจ้งเป็นลายลักษณ์อักษรก่อนแก้บั๊ก ทั้งการแยกออกไปจากส่วนหลักยังเป็นการป้องกันผู้ใช้จากปัญหาทางกฎหมายขณะใช้ซอฟต์แวร์ต่าง ๆ เยี่ยงซอฟต์แวร์เสรีทั่วไปอีกด้วย

ผมเองได้รับการว่าจ้างจาก SIPA (ผ่าน metamedia) ให้ทำ deb สำหรับฟอนต์ชุดนี้ พร้อมทั้ง “ผลักดันเข้าสู่ Debian/Ubuntu” ซึ่งผมทำได้เพียงส่วนแรก คือดัดแปลงฟอนต์ประกวดชุดนี้ โดยแจ้งเป็นลายลักษณ์อักษร พร้อมทั้งเปลี่ยนชื่อฟอนต์หลบชื่อสงวนก่อน build เป็น deb เผยแพร่ในซีดีชุดสุริยัน แต่ส่วนหลัง คือการผลักดันเข้า Debian/Ubuntu นั้น จำเป็นต้องทำความกระจ่างเกี่ยวกับเงื่อนไขข้อ 2. ของ license ก่อน ว่าจะผลักดันเข้า main หรือ non-free เนื่องจากสามารถตีความได้สองทางคือ:

  1. ผมได้แจ้งเป็นลายลักษณ์อักษรแทนผู้ที่จะดัดแปลงต่อจากชุดที่ผมดัดแปลงแล้ว ดังนั้น ใครจะดัดแปลงต่อจากผมก็ไม่ต้องติดเงื่อนไขข้อ 2. อีก ซึ่งถ้าตีความแบบนี้ ก็เท่ากับเข้าใน main ได้เลย
  2. เงื่อนไขข้อ 4. ที่บอกให้ฟอนต์ที่ดัดแปลงต้องอยู่ในเงื่อนไขของ license นี้ ก็หมายถึงครอบคลุมข้อ 2. เข้าไปด้วย ดังนั้น ใครจะดัดแปลงต่อจากผม ก็ไม่มีข้อยกเว้น ต้องแจ้งเจ้าของก่อนทั้งนั้น ซึ่งถ้าตีความแบบนี้ ก็ต้องเข้าหมวด non-free/restricted

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

แต่ปัญหาคือ เรื่องนี้หายเข้ากลีบเมฆ ตามธรรมเนียมราชการ

เพื่อความแน่ใจ ผมจึง โพสต์ถาม ทีมกฎหมายของ Debian อีกทางหนึ่ง เกี่ยวกับการตีความข้อกฎหมายในกรณีนี้ด้วย

ถ้าทุกอย่างไม่มีคำตอบ ก็คงจำเป็นต้องเสนอเข้าหมวด non-free แทน แม้จะขัดกับเจตนารมณ์เริ่มแรกของโครงการประกวดฟอนต์นี้ก็ตาม

ย้อนกลับมาที่ฉบับแปลไทยของ license นี้สักนิด ที่ผมพูดไว้ตอนต้นว่าแปลกำกวม คือเงื่อนไขข้อ 3. ซึ่งฉบับภาษาอังกฤษบอกว่า:

No adapted version of Font Computer Program may use the Reserved Font Name(s), ...

แต่ฉบับแปลไทยแปลไว้ว่า:

เมื่อดัดแปลงโปรแกรมคอมพิวเตอร์ฟอนต์นี้แล้ว ห้ามผู้ดัดแปลงใช้ชื่อฟอนต์เดิม ...

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

ความกำกวมของ license จึงอยู่ตรงนี้อีกจุดหนึ่ง แต่เมื่อเข้าไปอยู่ใน distro ผมคงต้องอ้างอิงฉบับภาษาอังกฤษเป็นหลัก

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

ป้ายกำกับ: , , ,

hacker emblem