Showing posts with label cvs. Show all posts
Showing posts with label cvs. Show all posts

Monday, November 14, 2011

FDP และ cvsup server ของขวัญวันเกิดลูก

ขอขึ้นหัวเรื่องไว้ ภายในวันนี้ ก่อนที่จะหมดวัน
บุญเขาคุ้มพ่อ ก็ต้องตอบแทนกันหน่อย

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

เอาล่ะ ขอเข้าเรื่อง

หลักกว้างๆก็คือ ให้ cvsup เอาชุดเอกสารทั้งหมด มาไว้ที่ใดที่หนึ่ง ซึ่งทุกคนในระบบสามารถอ่านได้ เช่น /kaitag/ncvs ที่ทำอยู่ จากนั้นให้วิ่ง cvsupd ซึ่งเป็น cvsup server เพื่อให้บริการในระบบ จากนั้น, ลำดับที่ ๓ แล้วน่ะ, ให้ cvsup เอาเอกสารที่ต้องการ ออกมาจาก ที่ใดที่หนึ่ง ซึ่งได้นำมาวางไว้แต่แรกเริ่มนั้น

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

นั่นเป็นเรื่องของการ check out เอกสารออกมา ต่อไป เป็นเรื่องของ การแปลเอกสาร ที่ตั้งใจจะแปล คือ handbook ในการนี้ ให้เรา ศึกษาเรื่องของ sgml และ docbook ให้พอเข้าใจ จากคำแนะนำใน FDP Primer นั้น พอเข้าใจถึงวิธีการคร่าวๆ อย่างไรก็ดี ในส่วนที่ขาด ทีมงาน documentation project เขาจะช่วยเสริมให้เอง ลำดับถัดมา ให้เราแปลตัวเอกสาร book.sgml นั้น แล้วส่งไป ตามวิธีที่บอกไว้คือ ขั้นตอนการเตรียมเอกสารเพื่องส่งมอบ ( link ตรงนี้ เป็นต้นฉบับ ภาษาอังกฤษ บอกให้รู้ถึงวิธีการเตรียม ) แล้วส่งไป

คงพอได้ใจความน่ะ ขอขมวดประเด็น จากที่ว่า หลักการกว้างๆ... เป็นต้นมานั้น เป็นดังนี้คือ
  1. ศึกษาเรื่อง sgml และ docbook แต่พอให้เข้าใจถึงโครงสร้างทั่วไป จาก http://www.freebsd.org/doc/en_US.ISO8859-1/books/fdp-primer/index.html
  2. cvsup เอาเอกสารตั้นฉบับของระบบปฏิบัติการมาด้วย cvs-supfile
  3. วิ่ง cvsupd บนเครื่องของเรา ที่มีเอกสารจากข้อข้างบนนั้น
  4. cvsup เอาเอกสารที่ต้องการแปล มาไว้ยังที่ทำงานของเรา ก็ ที่เรา login เข้ามานั่นแหละ
  5. แปลเอกสาร book.sgml ออกมาเป็นภาษาไทย
  6. จัดการส่งมอบเอกสารที่แปลไว้ จะทั้งหมด หรือเท่าที่ทำอยู่ ไปให้กับทีมงาน FreeBSD ตาม FDP Primer ทีีบอกไว้แล้วนั้น
ลำดับต่อๆไปจะขอแจงรายละเอียดตั้งแต่ลำดับที่ ๒- ก่อนสุดท้าย มาให้พี่ๆ เพื่อนๆ พวกเรา ได้ทราบกัน

ตามที่บอกไว้แต่แรกว่า ให้เอาเอกสารต้นฉบับฯ ทั้งหมดมาไว้ในที่ใดที่หนึ่ง นั้น สืบเนื่องจาก ชุดเอกสารทั้งหมดนี้ มีขนาดพอสมควร จึงนำมารวมๆไว้กับ distfiles และ packages ของทั้งระบบ โดยแยกเก็บไว้กับ usb hard disk ที่ mount point /kaitag และสร้างสาระบบแฟ้ม ncvs ภายใต้ /kaitag นี้ เพื่อเก็บเอกสารทั้งหมด ที่มีขนาดประมาณ 5G อีกทีหนึ่ง นี่คือการเตรียมเนื้อที่สำหรับเก็บชุดเอกสารต้นฉบับฯไว้

จากนั้นให้ cvsup เอาด้วย supfile ดังต่อไปนี้

*default host=CHANGE_THIS.FreeBSD.org
*default base=/kaitag/db
*default prefix=/kaitag/ncvs
*default release=cvs
*default delete use-rel-suffix
*default compress
src-all
ports-all
doc-all
www
projects-all
cvsroot-all

ด้วยคำสั่งดังนี้

# cvsup -g -L 2 -h cvsup6.ru.freebsd.org supfile

ซึ่งนานมากในการดูดครั้งแรก แต่ครั้งต่อๆไปจะไม่กินเวลามากนัก  ความจริง supfile ที่ยกมานี้ ก็ปรับเอาจากที่มีมากับระบบนั่นเอง (ไปดูเอาได้ที่ /usr/share/examples/cvsup/cvs-supfile) จากคำสั่งสั้นๆ grep และ sed ดังนี้

% grep  -v  ^#   /usr/share/examples/cvsup/cvs-supfile  |  sed  -e  '/^$/d'   \
-e  's,/var/db,/kaitag/db,g'   \
-e  's,/home,/kaitag,g'  >  ~/supfile

ส่วน cvsup6.ru.freebsd.org นั้น สามารถหามาได้จากรายการของ cvsup server ที่เร็วที่สุดในอาณาบริเวณใกล้ๆกับที่ตั้งของเรา จากคำสั่ง

% fastest_cvsup  -c ru,sg,tw,th,in,jp

ซึ่งตอนที่ทำ เขาขึ้น cvsup6.ru.freebsd.org มาให้เป็นลำดับแรก ก็ใช้ host นั้นไป ทำให้สะดวก ไม่ต้องลำบากกำหนดใน supfile ตามที่เขาบอกให้แก้ ในบรรทัดแรกนั้น

ที่กล่าวมาคือข้อที่ 2 ต่อไปเรามาพูดถึงการเตรียม  cvsup server กัน ซึ่งคือข้อ 3 ข้างบนนั้น

เบื้องต้น ขอให้ login ด้วยฐานะ ผู้ใช้งานธรรมดา แล้วสร้างสาระบบแฟ้มดังนี้

% mkdir -p ~/base/sup/th-fdp
% cd  ~/base/sup/th-fdp

จากนั้นสร้างแฟ้มขึ้นมา ๒ แฟ้มชื่อ releases และ list.cvs โดยมีสาระภายในแต่ละแฟ้มดังนี้

cvs  list=list.cvs  prefix=/kaitag/ncvs
และ
upgrade doc

แฟ้มละ ๑ บรรทัด ตามลำดับ ย้ำน่ะครับ แฟ้มละ ๑ บรรทัดเท่านั้น ที่เขียนมานี้ ถอดความจาก CVSup FAQ แล้วปรับเอาให้เข้ากับที่ทำงานจริงๆ นี่คือส่วน แก่น ของ cvsup server เท่าที่จำเป็นตอนนี้ จากนั้น วิ่ง server ไปเลย ตามนี้น่ะ

% cvsupd  -b  ~/base

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

  1. login มาเป็นผู้ใช้งานทั่วไป
  2. สร้างสาระบบแฟ้มนี้ขึ้นมา, ทำหนเดียวพอ,
    • % mkdir -p ~/base/sup/th-fdp
    จากนั้นให้ลงไปยังสาระบบแฟ้มที่เพิ่งสร้างขึ้นมานั้น
  3. สร้างแฟ้มเอกสารมา ๒ แฟ้มชื่อ releases และ list.cvs ด้วยสาระภายในแฟ้มตามที่ได้บอกไว้ข้างบนนั้น
  4. cvsupd  -b  ~/base
ขอให้ท่านแทน ~ ด้วย /home/login-id ของท่านไปน่ะครับ อย่างในตอนนี้ login id เข้ามาด้วย motorc ดังนั้น ~ ก็คือ /home/motorc หวังว่าคงเข้าใจน่ะครับ  ก็มีเพียงเท่านี้ สำหรับส่วนของ server ที่เล็กที่สุด หากท่านสนใจ สามารถศึกษาเพิ่มเติมได้จาก FAQ ที่ได้ให้ link ไว้แล้ว

ต่อไป (ลำดับที่ (4) ในรายการงานบนสุดนู้น) เรามาสร้างแฟ้ม supfile เพื่อดูดเอกสารสำหรับ handbook มาแปลกัน ซึ่งโดยทั่วไปก็ดูดมาด้วยคำสั่งเดิมๆที่รู้กัน คือ

% cvsup -g -L 2 supfile

แต่สาระตอนนี้ คือ supfile และสาระบบแฟ้ม ที่เขาจะเก็บ checkout list เอาไว้   สาระของ supfile คือ

*default host=localhost
*default prefix=/home/motorc
*default base=/home/motorc/db
*default release=cvs tag=.
*default delete use-rel-suffix
*default compress
th-fdp

ซึ่ง ตรง base นี่เองเราต้องสร้างสาระบบแฟ้มชื่อ ~/db ขึ้นมา เพื่อบันทึก check out list เอาไว้ ดังนั้น ท่านต้องสร้างขึ้นมาด้วยน่ะ

% mkdir -p ~/db

หวังว่าคงจำกันได้ ในคราวเตรียม server นั้น เราได้เตรียมแฟ้ม list.cvs โดยสาระภายในของแฟ้มนั้นมีเพียง ๒ คำคือ upgrade doc และ ในแฟ้ม supfile ในตอนนี้นั้น เขาจะ checkout เอา doc ออกมาวางไว้ในสาระบบแฟ้ม ที่ระบุไว้ใน prefix ในตอนนี้

สำหรับบรรทัดล่างสุดของ supfile นั้น บอกว่า เราเอาแฟ้มทั้งหมดที่บอกไว้ใน สาระบบแฟ้มเดียวกันนี้ใน server เอามาไว้ใน client ของเรา

ในส่วนของ การ check out เอกสารออกมาด้วยการ cvsup ก็มีเพียงนี้ เอกสารทั้งหมด จะวางไว้ในสาระบบแฟ้ม ดังนี้


ตัวเอกสารที่ต้องแปล จากภาษาอังกฤษ มาไทยคือ book.sgml ที่อยู่ ภายใต้สาระบบแฟ้ม ดังที่แสดงให้ดูนั้น อนึ่ง ท่านต้องเข้าใจ sgml ได้ดีพอควร สำหรับการแปลเอกสารนั้นหมด ว่า ต้นฉบับบทนั้น มีชื่อนั้นๆ จะได้ตามไปแปลได้ถูก

ทั้งหมดนี้ คือการ checkout เอกสารที่จะแปล เอาออกมาไว้ยังที่ใดที่หนึ่งนั่นเอง และ เรื่อง ก็น่าจะจบตรงนี้ และลำบากเพียง แปล แต่ที่เล่ามาเป็นจุดเริ่มต้นเท่านั้นเอง ยังพอมีการ set up อีกนิดหน่อย เพื่อให้การทำงานดูว่า มีระบบ นั่นคือการนำเอกสารที่ check out ออกมานี้ ไปไว้ใน repository อีกทีหนึ่ง ดังนี้, สำหรับท่านที่คุ้นกับ cvs จะเข้าใจดี,

% mkdir ~/Repository-${USER}
% echo CVSROOT  ~/Repository-${USER} >> ~/.cshrc
% source ~/.cshrc
% cvs init
สี่คำสั่งนี้ ทำหนเดียว และ ${USER} นั้นเป็น login id ของท่านน่ะครับ
% cd ~/doc
ตรงนี้ ให้ลองสั่ง ll ดูครับ จำผลลัพธ์ไว้ด้วย
% cvs import -m 'initial import' doc psr th-FDP
อันนี้ ก็ทำหนเดียวเช่นกัน และให้เปลี่ยน psr เป็นชื่อของท่านน่ะ
% cd
% rm -rf doc
% cvs checkout doc
% cd doc
แล้วลองสั่ง ll ดูอีกที เปรียบเทียบกับ ที่สั่งดูทีแรกนั้นว่า ต่างกัน ตรงไหน ดูเอาเองน่ะ
% cd en_US.ISO8859-1/books/handbook

จากนั้น ให้ท่านลงมือแปลเอกสารในแฟ้ม book.sgml ไป ซึ่งคงไม่ได้แปลรวดเดียวหรอก เอาว่า พอเหนื่อยก็พัก ก่อนจะพัก ก็ทำอีกนิดหนึ่งน่ะ

% cvs commit  book.sgml

ก็ให้ท่าน บันทึกรายละเอียดลงไป ตอนที่ vi เขาขึ้นมาน่ะ ว่า ท่านได้ทำอะไรไปบ้าง เมื่อท่าน save & exit แล้ว แฟ้ม book.sgml ก็จะได้รับการ เก็บรักษา พร้อมประวัติการทำงาน ทันที ใน Repository นั่นแหละครับ

ทีนี้ ถ้าท่านหยุดพักไปนานๆ ก็เห็นสมควร สะสาง สาระบบแห้มนี้ออกไปก่อน ชั่วขณะได้ ดังนี้

% cd
% cvs release -d doc

ซึ่งแนวปฏิบัติอันนี้ ผมก็ใช้อยู่ แต่จะ release ต่อเมื่อ log out ออกจากระบปฏิบัติการเท่านั้น และเมื่อ  log in เข้ามาแล้ว เราก็ลำบากเพียง check out เอกสาร ทั้งยวง ออกมาจาก Repository ง่ายๆ ดังนี้

% cvs checkout doc

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

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

ขอได้รับการขอบคุณจาก มะไฟ

ป.ล
ท่านสามารถตรวจดูว่า แต่ละครั้งที่ท่าน commit ไปนั้น ท่านได้ทำอะไรไว้บ้าง ก็ดูจากคำสั่ง

% cvs log book.sgml

ง่ายง่ายครับ

    Thursday, June 10, 2010

    FreeBSD : ports --> qrfcview


    commands


    การขอความเห็น หรือ การรับฟังความเห็นจากผู้มีส่วนได้ส่วนเสีย หรือ การรับฟังความเห็นจากสาธารณะ แหม ความหมายมันมากซะเหลือเกิน เน้าะ กะอีแค่ รีเคว้สฟอคอมมเม้น request for comments หรือเรียกย่อๆว่า อาเอ้ฟซี RFC นี่น่ะ

    ถ้ายังยุ่งไม่พอก็ให้โยงไปสับสนกับ พับ-บะหลิก-เฮียริ่ง public hearing กันซะ แต่ขอบอกกันก่อนน่ะว่า คนละประเด็น เพราะ มะไฟ ไม่ค่อยรู้จักคำหลังเนี่ยนักว่า มา หรือ เป็นอย่างไร

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

    แต่ที่ไม่ลืมคือรู้ว่า ใน ports มีโปรแกรมที่ทำให้เราไปเอา rfc ต่างๆมาอ่านเล่นได้สบายใจ จะอ่านในยามที่ต้องการรู้ หรือ อ่านในยามฝนตก อย่างในวันวานนี้ ก็ได้

    ความจริงโปรแกรมนี้ก็ ลบลบลงลง อยากอ่านมีไรก็ลงทู้กที ก็แค่ไม่อยากใช้ vi อ่านเท่านั้นแหละ

    ลงโปรแกรมนี้ ก็ไม่ยากหรอก ใช้ ก็ยิ่งไม่ยากเลย ก็จะขอยกไปตอนท้ายก็แล้วกัน

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

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

    เผอิญว่า เคยได้อ่านหนังสือเกี่ยวกับ networking ที่ คนในวงการ เขามัก อ้างอิงหนังสือ ไว้หลายเล่ม ก็ตามไปอ่าน หนังสืออ้างอิง เหล่านั้น เลยทำให้ทราบถึงการทำงานเป็นองค์คณะ เช่น internet engineering task force ขึ้นมา ซึ่งเขาต้องออก หรือ กำหนดมาตรฐาน ขึ้นมา

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

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

    ก็ดูว่าจะชอบใจกัน และดูว่าท่าทางว่าจะไปได้ดี

    เอาเถอะ แม้ที่สุดหนังสือจะออกมาได้ แต่ มะไฟ ก็ต้องผละจากคณะทำงานนั้น โดยเขียนบทความสั้นๆขึ้นมา ถึงเรื่องการใช้งาน cvs, rfc, repository จิปาถะเหล่านั้น ให้ประธานฯท่านทราบ โดยบอกใน foot notes ว่า หากยังอยู่ต่อ อาจจะมีข้อเขียนอีกฉบับขึ้นมา ไม่กล้าลาออกตรงๆ เกรงใจท่านประธาน ก็เจ้านายที่ท่านลากไปทำงานด้วยนั่นแหละ แม้อย่างนั้น ท่านก็ยังเมตตา แม้จะออกจากคณะทำงาน ก็ยังคงชื่อไว้ในนั้นด้วย

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

    แต่ นั่นคือสิ่งเดียวที่มีให้ ที่มอบให้กับทางราชการ ตลอดชีวิตการทำงานนับจากปี ๒๕๒๐ - ๒๕๔๙ ซึ่งทีแรกก็นึกเอาเองว่า นี่รึเปล่า ที่เรามี แต่อย่างว่า ไปไปมามา ก็มีเท่านั้นจริงๆ เรื่องเดียว

    ซีงิต ก็อย่างนี้แหละ

    มาต่อกันถึงเรื่องตัว ports นี้ เขาอยู่ในพวก deskutils ชื่อ qrfcview ไปลงเลยครับ เวลาเรียกใช้งานหลังลงแล้วก็คือ

    % qRFCView

    ก็ไม่เข้าใจว่า ทำไมต้องมีตัวใหญ่ ตัวเล็กปะปนกันไปอย่างนี้





    Friday, September 4, 2009

    FreeBSD: FDP

    ก่อนจะลืมไปเลย เพราะเดี๋ยวหน้าหนาวแล้วไป เลย ไม่ได้ มันจะหนาวจนชักแหง็กๆๆๆ อะไรปานนั้น
    ผท ดูด documents ของ freebsd จำเพาะที่เป็นภาษาอังกฤษ มาไว้ที่เครื่อง ในฐานะ ผู้ใช้งาน ด้วยคำสั่ง

    % cvsup -g -L 2 -h cvsup.sg.freebsd.org -b /home/zulu/db /home/zulu/doc-supfile

    จากนั้น ก็ import ไปเก็บไว้ใน repository ส่วนตัว ตามนี้เลยน่ะ

    % cd doc
    % cvs import doc zulu start

    พอ safe แฟ้มแล้วก็

    % cd ..
    % rm -rf /home/zulu/doc
    % cvs checkout doc

    เพียงเท่านี้ เราก็ได้ เอกสารที่สามารถยำเอาได้ตามใจ
    อ้อ สำหรับ /home/zulu/db นั้น ถ้าเพื่อนๆพี่ๆทุกคน จะ import เข้าไปเก็บไว้ด้วย ก็ทำได้น่ะ แบบเดียวกันเด้ะเลย กับที่ทำกับ doc น่ะ
    อ้ออีกอ้อ คือ doc-supfile นั้น มีสั้นๆแค่นี้เอง

    *default host=cvsup.de.FreeBSD.org
    *default base=/var/db
    *default prefix=/home/zulu
    *default release=cvs tag=.
    *default delete use-rel-suffix

    *default compress

    doc-all

    ส่วนของ base นั้นผมใช้ command option แทนที่เอา
    อืมมม ลืมไปเลยอีกแล้ว มัวแต่เพลินอยู่แถวๆโคราช ให้เอา refuse ไว้ที่ /home/zulu/db/sup ด้วยน่ะ ไม่งั้น ทุกภาษาแหละ พวกจะดูดมาให้หมด ซึ่งรายละเอียดของ refuse ก็สั้นๆ ตามนี้น่ะ ไม่งั้นยัยเอียดเคืองแย่

    doc/bn_*
    doc/da_*
    doc/de_*
    doc/el_*
    doc/es_*
    doc/fr_*
    doc/hu_*
    doc/id_*
    doc/it_*
    doc/ja_*
    doc/mn_*
    doc/nl_*
    doc/no_*
    doc/pl_*
    doc/pt_*
    doc/ro_*
    doc/ru_*
    doc/sr_*
    doc/tr_*
    doc/zh_*
    ports/arabic
    ports/chinese
    ports/french
    ports/german
    ports/hebrew
    ports/hungarian
    ports/japanese
    ports/korean
    ports/polish
    ports/portuguese
    ports/russian
    ports/ukrainian
    ports/vietnamese

    ประเดี๋ยวถ้ายัยเอียดเคือง เธอจะเอาภาษาอื่นมาให้อีก แย่แน่เลย

    View My Stats