Showing posts with label sed(1). Show all posts
Showing posts with label sed(1). 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

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

    Friday, July 4, 2008

    shell(2)

    find

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

    find(1) ที่ใช้ค้นหาเอกสารนั้น มีรูปแบบง่ายๆ อย่างที่ยกมานั่นคือ
    # find  /usr/ports  -name work  -type d  -print
    ซึ่งมีความหมายตรงไปตรงมาคือ ให้หา จาก /usr/ports เอกสารชื่อ work ที่เป็น directory ส่วนที่เหลือนั้นบอกว่า ให้พิมพ์ออกมาเมื่อหาเจอ,  -print
    ผลลัพธ์ก็คือ, สำหรับ goffice2,
    /usr/ports/converters/fribidi/work
    /usr/ports/converters/psiconv/work
    /usr/ports/deskutils/glabels/work
    /usr/ports/deskutils/planner/work
    /usr/ports/devel/goffice/work
    /usr/ports/devel/libgsf-gnome/work
    /usr/ports/devel/goffice04/work
    /usr/ports/editors/abiword/work
    /usr/ports/editors/gnome2-office/work
    /usr/ports/graphics/dia/work
    /usr/ports/graphics/libwmf/work
    /usr/ports/math/gnumeric/work
    /usr/ports/textproc/wv/work

    ซึ่งเรียกกัน หรือ รู้กันว่า คือ temporary working directory, ${WRKDIR}, และจะพิมพ์ออกมาทาง standard output,  stdout ทีละบรรทัด ทีละบรรทัดไป และนี่แหละคือ ไฟ, find(1)

    ถ้าเป็นเช่นนี้ คงไม่ใช่ shell ที่เราต้องการ เพราะสิ่งที่เราต้องการคือ, ยกมาจำเพาะผลลัพธ์ บางส่วน,

    cd /usr/ports/converters/fribidi && make package
    cd /usr/ports/converters/psiconv && make package
    ....
    cd /usr/ports/textproc/wv && make package


    ก็แล้วเราจะเปลี่ยนให้ /usr/ports/converters/fribidi/work เป็น cd /usr/ports/converters/fribidi && make package ได้ยังไง ซึ่งก็นี่แหละคือหน้าที่ของ เสร็จ, sed(1) ไงละ

    sed
    คำสั่งเสร็จที่ใช้ในตัวอย่างที่ยกมาคือ
    # sed  -e 's,/usr,cd /usr,'  -e 's,/work, \&\& make package,'
    ซึ่งขอยกรูปแบบทั่วไปที่ใช้ตอนนี้มาให้เห็นคือ
    # sed   -e  'sDELIMITtextDELIMITnew textDELIMIT'
    โดยที่ input ของเสร็จ จะเป็น output ของ ไฟ เพราะส่งกันมาด้วย ท่อ, pipe อีกทีหนึ่ง ก็ต้องเป็นยังงี้แหละ เมื่อ ไฟ ส่งมา ๑ บรรทัด เสร็จ เขาก็จะ process ไป ๑ ที แล้วก็ส่งผลลัพธ์ไปที่ stdout

    คราวนี้คงง่ายแล้วใช่ไหม ในการที่จะอ่านสิ่งที่ ได้บอกไว้ตั้งแต่ ports(1) โน้น โดยที่เราเลือกที่จะใช้ตัว คอมม่า เป็นตัว DELIMIT เพื่อแก้ไขตัว text ให้ได้ตามใจ
    อ้อ เราต้องแก้ ๒ หนนะ ก็เลยต้องมี สีลบออง ๒ ลบอี sed  -e 's, , ,'  -e 's, , ,' โดยลบอีแรก เราแก้จาก /usr เป็น cd /usr และ ลบอีหลัง เราแก้จาก /work เป็น && make package แต่ สืบเนื่องจากตัว && นั้น มีความหมายพิเศษ เราจึง ยกความหมาย มันออกไปไว้ที่อื่นชั่วคราว ด้วยการใช้ ตัว \ ไงครับ

    เสร็จ เอ้ยจบ find & sed และย้ำว่า โปรดศึกษา find(1) & sed(1) เพิ่มเติมด้วย

    ขอย้ำว่า เรื่องของ sh ที่นำเสนอนี้ เป็นแต่เพียงสาระเบื้องต้นเท่านั้น และยังหยาบมากอยู่ เพราะยังขาด ในส่วนของการตรวจสอบข้อบกพร่อง ยังขาดการตรวจสอบ return code ของแต่ละคำสั่ง และยังขาดอีก ฯลฯ ขอให้ผู้ใฝ่รู้จงหาความรู้เพิ่มเติมเอาเองจาก sh(1)

    ขอให้ประสบความสำเร็จ และ โชคดี

    Saturday, June 28, 2008

    shell(1)

    จากข้อเขียนก่อน ขอขมวดถึง sh script ที่สร้างขึ้นมาจากการลง goffice2 ดังนี้

    #!/bin/sh
    set -x

    cd /usr/ports/converters/fribidi && make package
    cd /usr/ports/converters/psiconv && make package
    cd /usr/ports/deskutils/glabels && make package
    cd /usr/ports/deskutils/planner && make package
    cd /usr/ports/devel/goffice && make package
    cd /usr/ports/devel/libgsf-gnome && make package
    cd /usr/ports/devel/goffice04 && make package
    cd /usr/ports/editors/abiword && make package
    cd /usr/ports/editors/gnome2-office && make package
    cd /usr/ports/graphics/dia && make package
    cd /usr/ports/graphics/libwmf && make package
    cd /usr/ports/math/gnumeric && make package
    cd /usr/ports/textproc/wv && make package

    ขอทบทวนไวยากรณ์ของแต่ละบรรทัดพอให้ตามเรื่องราวได้โดยไม่หลงสักพอประมาณ
    บรรทัดแรก อันนี้ จำไว้อย่างเดียว จำไว้เลย shell script ต้องเริ่มอย่างนี้
    บรรทัดที่ ๒ จะทำให้การทำงานของแต่ละคำสั่ง แสดงผลออกมา ทุกรายคำสั่งย่อย
    บรรทัดที่ ๓ ว่างๆ เพื่อความสวยงาม อันนี้เป็นความชอบของแต่ละคนๆไป
    บรรทัดที่เหลือ ที่เริ่มด้วย cd /usr ... && make package นั้นคือ โครงสร้างทั่วไป ที่ควรศึกษาและจำไว้ คือ
    expression1  &&  expression2
    หรือที่เรารู้จักกันในรูป expression1  AND  expression2 ซึ่งทั้ง ๒ นิพจน์ ต้องเป็นจริงเท่านั้น
    นั่นคือสาระเล็กๆน้อยๆจาก sh script ที่เขียนขึ้น ทีนี้มาดูว่าเราเขียนขึ้นมาได้อย่างไร เพราะที่บอกไว้ใน ports(1) แล้วว่า ...ถ้าเราไปไล่สั่ง # make package ไปเสียทุกที่ มันก็จบ นั้นมันดูง่ายๆ แต่เราจะไปรู้ได้อย่างไรว่า มัน อยู่ ณ ที่ใดใน ports tree ตั้งหมื่นกว่าตัวนั้น และนี่เองคือที่มาของ ผู้ช่วย อย่าง find(1)
    ผลลัพธ์ของ find ดูแปลกดี เพราะไม่ว่าจะสั่ง make run-depends-list ก็พบว่ามีไม่มาก
    ท่านอาจจะแย้งเอาได้ แต่ถ้าคิดว่า บาง package นั้น ต้องการอันอื่น เพิ่มขึ้นมา เป็นการจำเพาะ ก็สมเหตุสมผลอยู่
    อีกประการหนึ่ง ผลลัพธ์ของ find(1) นั้นที่จริงจะเป็นอย่างนี้ สำหรับ gnome2-office
    /usr/ports/converters/fribidi/work
    /usr/ports/converters/psiconv/work
    /usr/ports/deskutils/glabels/work
    /usr/ports/deskutils/planner/work
    /usr/ports/devel/goffice/work
    /usr/ports/devel/libgsf-gnome/work
    /usr/ports/devel/goffice04/work
    /usr/ports/editors/abiword/work
    /usr/ports/editors/gnome2-office/work
    /usr/ports/graphics/dia/work
    /usr/ports/graphics/libwmf/work
    /usr/ports/math/gnumeric/work
    /usr/ports/textproc/wv/work
    เราจะเปลี่ยน หรือ แปลงสภาพ ที่เห็นอยู่นี้ ให้เป็น sh script ข้างบนนั้นได้ยังไง คำตอบก็คือ sed(1) ที่ปรากฏในช่วงท้าย ของบรรทัด find นั้น ซึ่งขอให้ศึกษาเอง เพราะไม่ยากเลย
    เรื่องของ shell ก็ขอยุติลงแต่เพียงนี้ หวังว่าท่านคงได้สาระบ้าง แลหากมีอันใดบกพร่อง มะขาม ขอน้อมรับไว้แต่ผู้เดียว หากจะมีความดีบ้าง ก็ยกให้กับ ไหมฟ้า ผู้ดูแลในปัจจุบัน และ กุสุมา ผู้ล่วงลับไปแล้ว ซึ่งหากปราศจาก สองท่านผู้ที่เอ่ยนามมานี้ ก็มิอาจมี มะขาม มาเขียนหนังสือได้ในวันนี้

    Thursday, June 19, 2008

    ports(1)

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

    เรื่องที่ไม่พอใจก็ส่วนที่สร้าง packages ที่เราได้จากการลง port นั้นๆ เท่านี้แหละ ที่ไม่ค่อยจะพอใจน่ะ เพราะเหตุว่า เวลาที่อยากเก็บ packages ทั้งหมดที่ได้จากคำสั่ง

    # make install

    ซึ่งพอเราสั่ง

    # make package-recursive

    แล้วมันมักจะทำ หรือ สร้าง packages มาหมดทุกตัว โดยไม่สนใจว่า packages อื่นที่เหลือนั้น สร้างมาก่อนหน้านี้แล้ว แบบว่า มันสร้างซ้ำอีกหนะ

    อันนี้แหละ ที่ไม่พอใจ เพราะไม่อยากเสียเวลาไปสร้างซ้ำอีก มันนานนะ ไม่มีอะไรเลย

    แล้วจะแก้ยังไง

    จากความรู้ที่ว่า เมื่อเราลง ports นั้น มันจะสร้าง work directory ขึ้นมาด้วย และจะยังคงอยู่ ตราบเท่าที่เราไม่ลบทิ้งด้วยคำสั่ง

    # make clean

    อีทีนี้ ถ้าเราไปไล่สั่ง # make package ไปเสียทุกที่ มันก็จบ

    เอาละ พอได้ไอเดียแบบนี้ ก็ลงมือทำเลย ง่ายแล้ว แต่ต้องเป็น root น่ะ ตามนี้น่ะ

    # touch pkgs
    # chmod +x pkgs
    # echo #\!/bin/sh > pkgs
    # echo set -x >> pkgs
    # echo >> pkgs
    # find /usr/ports -name work -type d -print | \
       sed  -e   's,/usr,cd /usr,'  -e   's,/work, \&\& make package,' >> pkgs

    จากนั้น เราก็ลำบากเพียงสั่ง

    # ./pkgs

    สิ่งที่ต้องการ ก็บรรลุผลสมดั่งใจ
    แล้วก็ อย่าลืมสั่ง clean ด้วยละ ไม่งั้นตัว work directory มันจะยังคงอยู่ และจะทำให้งวดต่อไป เราเองแหละที่ต้องทำซ้ำไปเสียเอง ส่วนที่ว่าจะสั่งให้เป็น make clean อย่างไร ไปคิดเอาเองน่ะ

    ตัว shell script ที่อยู่ในแฟ้ม pkgs นั้นจะเปลี่ยนไป ตัวอย่างในกรณีที่ลง webmin ซึ่งต้องการ p5-Authen-SSLea แต่ว่าได้ลงไปแล้วโดย ports อื่น ผลที่ได้จึงมีเพียงเท่านี้


    #!/bin/sh
    set -x

    cd /usr/ports/security/p5-Authen-PAM && make package
    cd /usr/ports/sysutils/webmin && make package


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

    ขอได้รับการขอบคุณอย่างมาก จาก มะไฟ ไว้ ณ ที่นี้ด้วย

    View My Stats