Showing posts with label grep(1). Show all posts
Showing posts with label grep(1). Show all posts

Saturday, February 18, 2012

FreeBSD: system administrators tasks, package

ทุกข์ - อุปาทานในขันธ์ ๕
เจ็บนี้อีกนาน เจ็บจริงๆ
ความที่ใช้งานในสภาพแวดล้อมรุนแรง ความร้อนสูง ฝุ่นเยอะ ใช้งานต่อเนื่องนาน ... ฯลฯ ดังนั้นจึงเกิดกรณีที่เครื่องดับโดยไม่ทันได้ สั่งเสีย อะไรเลย กล่าวคือ ยังไม่ได้ unmount file systems และ shutdown operating system

ผลน่ะหรือ เมื่อเปิดเครื่องมาอีกครั้ง ก็จำต้องลงไปสู่ single user mode และสั่ง

# fsck -y

เท่านั้นเอง ซึ่งมันเป็นเหตุให้ บางส่วนของข้อมูล หายไป แล้วเราก็ไม่รู้ด้วยว่า ส่วนไหน หายไป โดยดูจาก messages ระหว่างที่ทำ ฟี้สกี้, fsck -y, นั้นแล้วบอกได้ว่า

อ้อ ส่วนนี้เน้าะ ที่หายไป ไม่เป็นไร นั่นมันแฟ้มขยะ ...

ไม่มีทางบอกได้เลยในขณะนั้น

ในครั้งนี้ ที่มันเกิดเหตุขึ้นมา ก็เพราะไปเผลอทำ portupgrade เข้า ข้อมูลส่วนที่ขาดหายไปจึงเป็นเพียง, เท่าที่รู้, package informations, ของหลายๆ packages เท่านั้น

ก็ยังนับว่าโชคดีไม่ใช่น้อยเลย

ที่ว่า ไม่ใช่น้อยนั้น ก็เพราะทุกครั้งที่ลงโปรแกรมผ่าน ports มักจะเก็บ binaries เอาไว้ในรูปแบบของ package เสมอ ก็ลำบากเพียงสั่ง

# make package

ก่อนสั่ง

# make clean

เท่านั้นเอง การนี้ มีข้อเสียคือเปลืองเนื้อที่ใน hard disk นอกนั้นแล้ว ไม่ว่าจะคิดในแนวไหนก็ล้วนแต่เป็นข้อดีไปทั้งสิ้น

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

ก็เลยตรวจดูว่ามีโปรแกรมไหนบ้าง ที่ package info[rmations] หายไปด้วยคำสั่ง

# pkg_info

แล้วดูผลลัพธ์ ที่บอกว่า

pkg_info: the package info for package '.....' is corrupt

นั่นแหละ โปรแกรม ..... นั่นแหละ ฐานข้อมูลเสียหาย

แก้ไม่ยาก ก็ลงโปรแกรมนั้นผ่าน port เสียใหม่อีกครั้ง ก็จบ

แฮ่ เครื่องของผม มันเก่ามาก และ  กรอบ มาก ทำงานหนักอีกไม่ไหวแล้วคร้าบ เพราะมั้นตั้ง ร่วมสามสิบโปรแกรม ที่เสียหายในลักษณะนี้

ยังนับว่าโชคดี ที่มี binaries ของโปรแกรมที่ข้อมูลส่วนที่เสียหายนี้อยู่ ครั้งที่สั่ง make package โน้น

เมื่อทราบดั่งนี้แล้ว แนวทางแก้ไขก็คือ
  1. ลบโปรแกรมเดิมที่ลงไว้แล้วนั้นออกไป
  2. ลงโปรแกรมเดิมนี้ จากคำสั่ง pkg_add โดยชี้ไปยังที่เก็บแฟ้มที่เราได้สร้างไว้แต่คราวสั่ง make package นั้น
เราทราบว่า โปรกรมดังกล่าว ดูได้ หรือ รู้ได้จากคำสั่ง pkg_info แล้วบรรทัดไหที่ขึ้นต้นด้วย pkg_info: ก็ นั่นแหละ โปรกรมนั้นแหละ ที่ฐานข้อมูลมันเสียหาย เราก็กรองเอามา ดังนี้

# pkg_info | grep ^pkg_info >  packages-info-brokens

จากนั้นก็ส่งไปเก็บไว้ในแฟ้ม ชื่อ packages-info-brokens อีกทีหนึ่ง โดยการ redirection ธรรมดาๆ

ตัวอย่างของแฟ้มที่ ฐานข้อมูลเสียหายก็ประมาณนี้

pkg_info: the package info for package 'mousepad-0.2.16_8' is corrupt
pkg_info: the package info for package 'mplayer-1.0.r20111218_3' is corrupt
pkg_info: the package info for package 'org-mode.el-emacs23-7.4' is corrupt
pkg_info: the package info for package 'p5-Compress-Raw-Bzip2-2.048' is corrupt
pkg_info: the package info for package 'p5-Parse-Yapp-1.05' is corrupt
pkg_info: the package info for package 'p5-Switch-2.16' is corrupt
pkg_info: the package info for package 'p5-XML-DOM-1.44' is corrupt
pkg_info: the package info for package 'p5-XML-RegExp-0.03' is corrupt
pkg_info: the package info for package 'p5-XML-XQL-0.68' is corrupt
pkg_info: the package info for package 'p5-YAML-Syck-1.19' is corrupt
pkg_info: the package info for package 'qt4-network-4.7.4' is corrupt
pkg_info: the package info for package 'qt4-opengl-4.7.4' is corrupt
pkg_info: the package info for package 'qt4-porting-4.7.4' is corrupt
pkg_info: the package info for package 'qt4-qt3support-4.7.4' is corrupt
pkg_info: the package info for package 'qt4-script-4.7.4' is corrupt
pkg_info: the package info for package 'qt4-sql-4.7.4' is corrupt
pkg_info: the package info for package 'qt4-sqlite-plugin-4.7.4' is corrupt
pkg_info: the package info for package 'qt4-svg-4.7.4' is corrupt
pkg_info: the package info for package 'qt4-uic3-4.7.4' is corrupt
pkg_info: the package info for package 'smplayer-0.6.10' is corrupt
pkg_info: the package info for package 'wxgtk2-common-2.8.12' is corrupt
pkg_info: the package info for package 'wxgtk2-contrib-2.8.12' is corrupt
pkg_info: the package info for package 'wxgtk2-contrib-common-2.8.12' is corrup

ตัวโปรแกรมนั้น จะอยู่ระหว่างเครื่องหมาย single quote ก็ง่ายเลย ใช้ awk(1) เขียน sh script มาจัดการได้เลย ง่ายๆสำหรับการลบออก

#  awk -F\' 'BEGIN {print "#\!/bin/sh\nset -x\n"} {print "/usr/sbin/pkg_delete -f "$2}' packages-info-brokens > z-d-pkgs-brokens

และการลงโปรแกรมที่ได้ลบออกไปด้วย

#  awk -F\' 'BEGIN {print "#\!/bin/sh\nset -x\n"} {print "/usr/sbin/pkg_add -ifF /kaitag/packages/All/"$2".tbz"}' packages-info-brokens > z-a-pkgs-brokens


แล้วก็กำหนด permission mode ให้เป็น +x ทั้งคู่


# chmod +x z-d-pkgs-brokens z-a-pkgs-brokens


ที่สุดก็ลำบากเพียงสั่ง


# ./z-d-pkgs-brokens
# ./z-a-pkgs-brokens


เท่านั้นเอง ก็ได้แต่หวังว่า คงพอเกิดประโยชน์กับเพื่อนๆบ้าง และ หวังว่าคงเกิดประโยชน์แต่เพียงประเทืองปัญญา แต่ไม่ได้หวังว่าจะได้ใช้ น่ะครับ
อ้อ ลืมไป ปกติ เวลาสั่ง make package นั้น binaries จะเก็บไว้ใน /usr/ports/packages/ ครับ แต่ ผมกำหนดให้ไปเก็บที่ /kaitag/packages/ ครับ และเขาจะนำไปเก็บภายใต้ ..../All/ นั้น อีกเตาหนึ่ง

ลืมไปอีกครับ  ยังคงลืมไป (ติดใจอยากอยู่ต่อ) เราต้องทำ pkgdb -F ด้วย เพื่อให้ฐานข้อมูลส่วนที่ขาดหายไปนี้ กลับมามีคืนดั่งเดิม

ทุกข์ ควรกำหนดรู้

    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

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

      Monday, October 11, 2010

      FreeBSD: command grep

      จากรูป อยากแปลข้อความจากฝรั่งเป็นไทย แล้วจะไล่หาแฟ้มได้ยังไง ไปแก้ที่แฟ้มไหน ฮึ

      ฮือแง ฮือแง

      ดีที่ไม่ลืมวิชาแมวแมว อย่าง มะขาม

      # grep -n -d recursive PATTERN directory

      ช่วยให้แก้ข้อความ Lite (archive) จากรูปได้ถูกแฟ้มอย่างง่ายเลย

      ในที่นี้ PATTERN คือ 'Lite (Archive)'

      directory คือ /usr/local/www/mybb


      ขอบคุณ คุณชายเกร้ป man grep

      ถ้าเราทริม หรือ ขลิบ ให้กระชับเข้ามาอีกนิด อย่างว่า เลือกเอาจำเพาะแฟ้ม .php เราก็เรียกด้วย option เพิ่มเติมมาอีก ดังนี้ งวดนี้ ให้ค้นคำว่า User CP

      # grep -n --include="*.php" -d recurse 'User CP' /usr/local/www/mybb

      ผลลัพธ์น่ะหรือครับ ดูเอาเอง

      /usr/local/www/mybb/inc/languages/english/admin/user_groups.lang.php:112:$l['can_access_usercp'] = "Can access User CP?";
      /usr/local/www/mybb/inc/languages/english/global.lang.php:23:$l['welcome_usercp'] = "User CP";
      /usr/local/www/mybb/inc/languages/english/misc.lang.php:37:$l['no_buddies'] = "<em>Your buddy list is currently empty. Use your User CP or visit a user profile to add users to your buddy list.</em>";
      /usr/local/www/mybb/inc/languages/english/usercpnav.lang.php:31:$l['ucp_nav_home'] = "User CP Home";


      ขอตัดทอนเอาส่วนที่มากมายเกินไปออกน่ะครับ ไม่นำมาแสดง
      อ้อ วานนี้, ๑๒ ตค ๒๕๕๓ , ปลิว แนะให้ใช้ FirePHP & FireBugs สำหรับดีบั้กโปรแกรมพีเอ้ชพี ขอบใจน่ะ

      Thursday, May 6, 2010

      FreeBSD: programming -->getopt



      commands

      เพื่อนๆ หลายท่านคงเคยใช้งานโปรแกรม แบบที่ต้องกำหนด option ด้วย เช่น
      % find -n -x pattern filename
      % grep -v R-dep


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

      n, x หรือ v ในตัวอย่างนั้น เรียกว่า option การกำหนด option ให้กับโปรแกรมที่เขียนขึ้น แม้จะทำได้เองโดยง่าย แต่ในโลกของ unix แล้ว การใช้บริการของ system functions นั้นเป็นสิ่งที่ ต้องทำ เพราะอย่างน้อย ก็ ลดภาระ ของผู้พัฒนาโปรแกรม และ ทำให้ ตัดความกังวล เรื่อง ความปลอดภัยของระบบไปได้มาก

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

      ในโอกาสพิเศษเช่นนี้ จึงใคร่ขอนำเสนอเรื่องสั้นๆ ไม่ยาวนัก แต่พอให้เกิดปัญญา มาตกลงปรองดองกันได้ ระหว่าง การเขียน code ขึ้นมาเอง กับการใช้บริการของ system functions (ผ่าน library)

      function ที่ว่านี้ เรียกว่า getopt(3) ซึ่งเมื่อเปิด manual page ใน section ที่ 3 ดูก็ทราบรายละเอียดได้ว่า
      1. ต้อง link กับ standard C library (-lc) ในตอน compile ตัวอย่างคือ
        % cc -o programme programme.c -lc
      2. function นี้กำหนด prototype ไว้แล้วใน unistd.h header files ทำให้เราต้องรวมบรรทัด
        #include <unistd.h>
        เข้าไปด้วย


      ตัวอย่าง ที่เขียนขึ้นจริงๆกับ โปรแกรมเรื่องสั้นภาค ๒ ที่เพิ่งส่งไปเมื่อวันอังคารที่ผ่านมานี้ ขอตัดมาให้ดูแต่เพียงบางส่วนเท่านั้น คือ
      @ |getopt(3)|, one of many functions from system services
      @<Getoption@>=
      sflag = 0;
      interactive=0;
      while ((ch = getopt(argc, argv, "is:d:")) != -1) { <----
        switch (ch) {
         case 'i':@/
            interactive = 1;@/
            break;@/
         case 's':
            if ((fp = fopen(optarg, "r")) == NULL) {
             fprintf(stderr,"%s: %s: %s\n",programme, optarg, strerror(errno));
             status = OPEN_FILE;
            }
            sflag = 1;
            strcpy(filename,optarg); /* for later used */
            break;
         case 'd':
            if ((fp = fopen(optarg, "r")) == NULL) {
             fprintf(stderr,"%s: %s: %s\n",programme, optarg, strerror(errno));
             status = OPEN_FILE;
             }
            strcpy(filename,optarg); /* for later used */
            break;
         case '?':@/
         default:@/
            fprintf(stderr,"usage: %s -[[i]s|[i]d] data-filename\n%s\n", programme,
            strerror(errno));
            status = USAGE;
            break;
         }
        }
      โดยที่ตรงบรรทัด while นั่นแหละ พอเดาออกน่ะครับว่า options ที่ใช้คือ i,s,d อันนี้ไม่ได้หมายถึง index for sustainable development ของการพัฒนาอย่างยั่งยืน อะไรหรอกน่ะ แต่มันเผอิญมาตรงกัน เท่านั้นเอง

      กล่าวคือ option ของโปรแกรมที่ใช้งานจริงจริง เมื่อเรียกใช้ ก็จะอยู่ในรูป
      % programme -i -sfilename | -dfilename
      หรือ
      % programme -isfilename | -idfilename
      หรือ
      % programme -sfilename | -dfilename
      จาก manual page ทราบว่า เรามีภาระเพียงกำหนด argument ที่ 3 ให้กับ system function นี้ ซึ่ง มีรูปแบบ ที่แน่นอน ไว้ให้แล้ว พร้อมกับเขียน code มาเพื่อรองรับ option ที่กำหนดไว้ ก็เท่านั้นเอง

      และในตัวอย่าง มะไฟ ก็เพียงเลือกเอาว่า จะใช้ option i,s,d โดยที่ ๒ อันหลังนั้นต้องมีชื่อแฟ้มตามมาด้วยเสมอ กล่าวคือ ต้องอยู่ในรูป
      % programme -sfilename
      หรือ
      % programme -dfilename
      ย่างนี้เป็นต้นเสมอ จะใช้แต่ option ใด option หนึ่งโดดๆ ไม่มีชื่อแฟ้มตามมาด้วย ไม่ได้

      ใน manual page นั้น เขาบอกไว้ชัดเจนว่า option ที่มี argument ตามมานั้น ให้ตามหลัง option นั้นด้วย : เสมอ เพื่อแยกจาก option อื่นที่ไม่มี argument ตามมาด้วย ส่วนที่ว่า argument ที่ตามมาด้วยนั้น จะเขียนติดต่อกันไปเลย อย่างในตัวอย่างที่ยกมาให้ดู หรือ จะมี space ตามเพื่อความสวยงาม ก็ได้ ไม่ว่ากัน

      ในตัวอย่างที่ยกมานั้น option s และ option d มี : ตามอยู่ด้วย ทำให้ทราบว่า ทั้ง ๒ option นั้นมี argument ตามมาแน่นอน ซึ่งก็คือชื่อของแฟ้มเอกสาร ที่จะเปิดเพื่ออ่านข้อมูลนั่นเอง

      ก็หวังว่าคงพอเข้าใจบ้าง

      และเมื่อลองเทียบ ความเรียบง่ายนี้ กับ codes ที่ต้องเขียนเองขึ้นมา โดยขอให้ไปดูจากหนังสือ The C Programming Language ในบทที่ ๕ section ที่ 10 Command-line Arguments ท่านก็จะพบว่า ยุ่งเหยิงมากกว่ากันเยอะเลย เอาแค่การตีความ precedence ของ pointers & operator ก็แทบจะพูดได้ว่า

      โชคดีแล้ว ที่ไม่ต้องเขียนเอง

      การใช้บริการของ system function ผ่าน library ทั้งหลายที่มีให้ จึงนับว่าดีที่สุด

      ขอยกคุณงามความดีนี้ ถวายเป็นราชพลี ถวายเป็นปฏิบัติบูชา ในวาระ ฉัตรมงคลสมัย อันประเสริฐยิ่งนี้

      อันใดที่บกพร่อง มะไฟ ฅนยาก ขอน้อมรับไว้แต่ผู้เดียว

      View My Stats