การพบปะ Mozillian เมื่อ 29/5/2559

เพื่อพลักดันวงการซอฟต์แวร์เสรี (Free software; open source software) ในประเทศไทย โดยเฉพาะอย่างยิ่งทำให้ Firefox ใช้ภาษาไทยได้เต็ม ในวันอาทิตย์ที่ 29 พฤษภาคม พ.ศ. 2559 เราจึงนัดพบกันที่ Hubba ขอขอบคุณ Hubba ที่ให้ใช้สถานที่ประชุมกลางเมืองที่สะดวกสะบาย

Panansonic Lumix G 14mm f/2.5 ASPH

ประเด็นหลัก ๆ ที่คุยกันก็คือเราจะเลือกคำแปลอย่างไร เพราะว่ามันเลือกได้หลายอย่าง เช่น

  • Sync นี้
    • อาจจะทัพศัพท์ไปเลยว่า Sync ก็ได้
    • หรือจะทับศัพท์แต่แปลงตัวอักษรให้เป็นภาษาไทย เช่น ซิงค์
    • หรือจะแปลเป็นว่า
      • ประสานเวลา
      • ผสานเวลา
      • ฯลฯ
  • หรือว่า asynchronous แบบไม่ย่อนี้ควรแปลเป็นไทยว่าอะไรดี

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

  • ท็อปยกตัวอย่างหนึ่งว่า File ที่ถูกนั้นแปลว่าแฟ้ม แต่มักทำให้คนหนุ่มสาวเข้าใจผิดว่าแฟ้มคือ Folder หรือ Directory ดังนั้นควรจะทับศัพท์ File ว่า “ไฟล์” ไปเลยจะทำให้เข้าใจง่ายกว่าแปลว่าแฟ้ม
  • ถ้าจำไม่ผิดท็อปยกตัวอย่างว่าปุ่ม save ที่เป็นรูป floppy disk เดี๋ยวนี้เด็ก ๆ ไม่รู้แล้วว่ามันคืออะไร ก็อาจจะเป็นการสื่อสารที่ไม่สมประโยชน์
  • น้าธนายกอีกตัวอย่างเวลาเลื่อนหน้าจอขึ้นลง แต่ละคนเข้าใจไม่เหมือนกัน บางคิดแบบการรูด scrollbar บางคนคิดแบบ touchscreen เวลาบอกว่า รูดขึ้น ให้แต่ละคนรูดก็อาจจะรูดไปคนละทางกัน

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

ประเด็นย่อย ๆ ก็มีผมโชว์เครื่องแปลภาษาโดยใช้โปรแกรม Moses ไปนิดหน่อย คาดว่าจะเอาขึ้นบน server ให้ทุกคนได้ใช้กันเร็ว ๆ นี้

P5295079.JPG

หลังจากที่คุยกันอย่างเคร่งเครียดนายทุนของเรา – พี่เด่นสินก็พาไปเลี้ยงอาหารญี่ปุ่นที่ Gateway เอกมัย

P5295108.JPG

ขอบคุณน้าธนาสำหรับภาพถ่ายทุกภาพครับ

ผู้เข้าร่วมพบปะครั้งนี้คือ:

  1. Teerapat Taechaiya (ท็อป)
  2. พี่เด่นสิน
  3. น้าธนา
  4. ผม
  5. Rob Burns

หากต้องการพูดคุยเพิ่มเติมพบกันได้ที่ https://www.facebook.com/groups/mozth/ ครับ

ดูด parallel corpus จาก mozilla

  1. ดูดภาษาอังกฤษ hg clone http://hg.mozilla.org/mozilla-central mozsrc
  2. ดูดภาษาไทย hg clone http://hg.mozilla.org/l10n-central/th mozth
  3. แล้วลงตัวแกะ dtd https://github.com/veer66/dtdmsg สั่ง  mvn jetty:run
  4. แล้วก็ลงตัวดูด https://github.com/veer66/mcorpusext แล้วก็สั่ง ruby extract.rb ถ้าเจ็งก็แก้ config.yaml ก่อน
  5. ก็จะได้ parallel corpus อยู่ในรูปแบบ json

 

nsCoreFoundationBreaker

After talking to @kengggg, we are agree to implement NS_GetComplexLineBreaks without using deprecated UCFindTextBreak. So I try to rewrite nsCarbonBreaker by using Core Foundation API. However I don’t have Mac since 2008 so I didn’t test. In fact, I don’t even try to compile the code.

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
 *
 * The contents of this file are subject to the Mozilla Public License Version
 * 1.1 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * The Original Code is mozilla.org code.
 *
 * The Initial Developer of the Original Code is
 * Theppitak Karoonboonyanan <thep@linux.thai.net>.
 * Portions created by the Initial Developer are Copyright (C) 2007
 * the Initial Developer. All Rights Reserved.
 *
 * Contributor(s):
 * - Theppitak Karoonboonyanan <thep@linux.thai.net>
 *
 * Alternatively, the contents of this file may be used under the terms of
 * either of the GNU General Public License Version 2 or later (the "GPL"),
 * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 * in which case the provisions of the GPL or the LGPL are applicable instead
 * of those above. If you wish to allow use of your version of this file only
 * under the terms of either the GPL or the LGPL, and not to allow others to
 * use your version of this file under the terms of the MPL, indicate your
 * decision by deleting the provisions above and replace them with the notice
 * and other provisions required by the GPL or the LGPL. If you do not delete
 * the provisions above, a recipient may use your version of this file under
 * the terms of any one of the MPL, the GPL or the LGPL.
 *
 * ***** END LICENSE BLOCK ***** */

#include "nsComplexBreaker.h"
#include <CoreFoundation/CFStringTokenizer.h>
#include <CoreFoundation/CFBase.h>

// An imaginary nsCoreFoundationBreaker
// I don't have Mac since 2008 (Vee Satayamas)

void
NS_GetComplexLineBreaks(const PRUnichar* aText, PRUint32 aLength,
                        PRPackedBool* aBreakBefore)
{
  NS_ASSERTION(aText, "aText shouldn't be null");

  // I don't know whether CFStringCreateWithCharactersNoCopy will works.
  // Some conversions may be needed
  CFStringRef cfAText = CFStringCreateWithCharactersNoCopy(NULL, aText, aLength,
    kCFAllocatorNull);
  NS_ASSERTION(cfAText, "cfAText shouldn't be null");

  CFStringTokenizerRef tokenizer = tokenizerForString(cfAText);

  if(tokenizer)
  {
    CFStringTokenizerTokenType  tokenType; 
    // CFStringTokenizerGetCurrentTokenRange may have to be called before
    // CFStringTokenizerAdvanceToNextToken
    while(CFStringTokenizerAdvanceToNextToken(tokenizer) != 
      kCFStringTokenizerTokenNone) 
    {
      CFRange tokenRange = CFStringTokenizerGetCurrentTokenRange(tokenizer);
      aBreakBefore[tokenRange.location + tokenRange.length] = PR_TRUE;
    }
  }

  // Foundation.h must be included for CFRelease?
  CFRelease(cfAText);
}

double click เพื่อเลือกคำเดียวใน Firefox

ปกติกด double click ไปบน text แล้วมันควรเลือกคำเดียว แต่ว่า Firefox เวลาเจอภาษาไทยกลับไปเลือกก้อนใหญ่ๆ ผมก็เลยถามไปที่ Thai Linux/FOSS developers <a href="http://thep.blogspot.com/"ป๋าเทพบอกว่าน่าจะเป็น bug 425915

วันนี้ผมก็เลยลองดูสักหน่อย สำหรับกรณีปัญหาที่เกิดจากการเลือกคำด้วย double click ผมคิดว่า code ส่วนที่จะแก้คือ layout/generic/nsSelection.cpp ใน method ชื่อ nsTypedSelection::selectFrames โดยก่อนที่จะเรียก textFrame->SetSelectedRange(startOffset, endOffset, aFlags, mType); ค่า endOffset น่าจะหาโดยใช้ nsIWordBreak::FindWord

แต่ว่า nsIWordBreak ตอนนี้มี implementation แต่ nsSampleWordBreak ที่มี comment ข้างในว่า

// need to call Thai word breaker from here
// we should pass the whole Thai segment to the thai word breaker to
find a shorter answer

แต่ว่าไฟล์นี้ก็สร้างมาตั้งนานแล้วยังไม่มีการแก้ไขอะไร

ผมรู้สึกไม่มั่นใจเท่าไหร่ที่ต้องไปเรียก nsIWordBreak เองใน nsTypedSelection::selectFrames อยากจะถาม ท่านอื่นๆ ว่าน่าจะใช้ทางนี้หรือเปล่า หรือว่า nsIWordBreak ไม่ควรใช้ ถ้าหากควรใช้ ควรจะเอาไปใส่ใน nsTypedSelection::selectFrames หรือเปล่า?

ผมก็ถามไปใน group ด้วย

วันนี้ก็เอาไว้แค่นี้ก่อน ดึงจังหวะรอดู comment นิดนึง

Bug เกี่ยวกับการป้อนข้อมูลของ Firefox

หลังจากที่ลองลง Firefox รุ่นพัฒนาล่าสุดไป เพื่อที่จะลองดู bug ตามที่ป๋าเทพประกาศไว้.

วิธี reproduce (ทำให้ bug นั้นออกอาการอีกที) ทำแบบนี้จ๊ะ ใน $HOME/mozilla-central/objdir-ff-release/dist/bin

export XMODIFIERS="@im=BasicCheck"
export LC_ALL="th_TH"
./firefox

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

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

ช่วยแก้ ช่วย vote ฯลฯ ได้ที่ https://bugzilla.mozilla.org/show_bug.cgi?id=353776 ครับ

ป.ล. เหมือนจะยังขาดคน test อยู่ในครับ โดยเฉพาะบน Mac OS X และ Windows (บน GNU/Linux ก็เหมือนจะเงียบเหงาด้วย)

กลับมา build Firefox อีกแล้ว

ไม่ได้ build หรือทำอะไรต่างๆ นานากับ Firefox เสียนาน แต่ก็ไปเห็นเมลนี้ http://groups.google.co.th/group/thai-linux-foss-devel/browse_thread/thread/c571e26d6a1a8043 จริงๆ แล้วผมก็งงๆ ว่าลำดับภาษาไทยคืออะไร ลองอ่าน bug ก็ไม่ค่อยเข้าใจเท่าไหร่. แต่ก็ลองก่อนแล้วกัน แล้วลอง reproduce ตามข้อมูลที่มีอยู่ก็อาจจะเข้าใจขึ้นมาเอง.

แต่ก่อนอื่นต้องมี Firefox รุ่นล่าสุดใช้ก่อน สำหรับ Ubuntu นี้ build ง่ายมาก เดี๋ยวนี้เขาไม่ใช้ CVS แล้ว เปลี่ยนไปใช้ Hg แทน กว่าจะเอา source code มาได้หมดก็นานเหมือนเดิม (จะมากกว่าน้อยกว่าก็ไม่ทราบได้ เพราะผมหลับไปก่อน หลับจริงๆ นะ) วิธีตามนี้เลย https://developer.mozilla.org/En/Simple_Firefox_build

รอไปมันก็ build เสร็จเอง แต่ก็ดันมางงตอน run ทำไม่เป็นซะงั้น :-P. แต่ในที่สุดก็หาเจอ เข้าไปใน objdir-ff-release/dist/bin แล้วก็สั่ง ./firefox ก็ใช้งานได้เลย ^_^ (ทีแรกลืมปิดตัวเก่า พอปิดหมดแล้วตัวใหม่ก็ขึ้นมาสบาย)