ป้ายกำกับ

วันศุกร์ที่ 12 เมษายน พ.ศ. 2556

Using Bugzilla Account with Subversion Problem

ผมได้พยายามติดตั้ง Bugzilla และ Subversion ให้ใช้งานร่วมกัน โดยอยากจะใช้ account ร่วมกัน ซึ่ง Bugzilla นั้น มีการจัดการ account ในฐานข้อมูล MySQL อยู่แล้ว ส่วน Subversion นั้นจัดการ account ผ่าน user ของระบบปฏิบัติการ แต่หากติดตั้งให้ทำงานผ่าน Apache Web Server เราก็สามารถควบคุมการ Authentication จาก account ในฐานข้อมูล MySQL ได้ด้วย module auth_mysql ได้

แต่ปัญหามีอยู่ว่า รหัสผ่านที่ Bugzilla เก็บไว้ในคอลลั่มน์ cryptpassword ของตาราง profiles ในฐานข้อมูลนั้น มีการเติมข้อความ "{ชื่อ digest algorithm}" ต่อท้ายไว้ ทำให้ auth_mysql ไม่สามารถเปรียบเทียบค่า digest ของรหัสผ่านได้ แม้จะใส่รหัสได้ถูกต้องตรงกันแล้วก็ตาม

ปัญหานี้ ได้มีการแนะนำให้เข้าไปแก้ไขไฟล์ Bugzilla/Constants.pm โดยกำหนดให้ตัวแปร PASSWORD_DIGEST_ALGORITHM ไม่ต้องใส่ค่าใดๆ

PASSWORD_DIGEST_ALGORITHM = ''

เมื่อเราเปลี่ยนรหัสผ่านใน Bugzilla รหัสใหม่ก็จะถูกเข้ารหัสด้วยฟังก์ชัน crypt() ของระบบปฏิบัติการ และไม่ใส่ข้อความชื่อ digest algorithm ต่อท้าย ซึ่งจะทำให้ได้ค่าตรงกับที่ auth_mysql ต้องการ

จากการศึกษา เพื่อพยายามแก้ปัญหานี้ ทำให้ผมรู้ว่า MySQL ไม่มีฟังก์ชันที่จะแปลงข้อความเป็น Base64 โดยเพิ่งจะมีใน version 5.6 ซึ่งเป็นรุ่นล่าสุดในปัจจุบัน แต่ Ubuntu 12.04 LTS ที่ผมใช้อยู่ มี MySQL 5.5 และได้รู้ว่า ฟังก์ชันเข้ารหัสของ MySQL นั้น มีหลายฟังก์ชัน แต่ทั้งหมดจะให้คำตอบมาเป็น hex ไม่ใช่ base64

วันเสาร์ที่ 22 ธันวาคม พ.ศ. 2555

Bugzilla sslbase Setting failed.

สำหรับใครที่ใช้ Bugzilla บน Ubuntu จะพบปัญหาว่า ถ้าอัพเกรดมาเป็น Ubuntu 12.04 LTS แล้ว จะไม่มีแพ็คเกจของ bugzilla มาให้ เนื่องจากปัญหาช่องโหว่ด้านความปลอดภัย และไม่มีอาสาสมัครเข้ามาดูแลโปรแกรมนี้เป็นเวลานาน (ถ้าจำไม่ผิด คือเกิน 6 เดือน) จึงทำให้ Debian ถอด bugzilla ออก ซึ่งก็ส่งผลกระทบมายัง Ubuntu ด้วย แต่จากการติดตามข้อมูล เข้าใจว่ามีอาสาสมัครเข้ามาดูแลและแก้ไขช่องโหว่นั้นไปนานแล้ว แต่ยังไม่ได้มีการนำ bugzilla กลับเข้ามา

อย่างไรก็ตาม ผู้ใช้ยังสามารถดาวโหลดโปรแกรมโดยตรงจากเว็บไซต์ของ bugzilla (http://www.bugzilla.org) ได้ และวิธีการติดตั้งก็ไม่ได้ยุ่งยากอะไรมากนัก ซึ่งผมคงไม่กล่าวถึงในบทความนี้ สิ่งที่อยากจะเล่าสู่กันฟังก็คือ ปัญหาตอนเริ่มต้นที่เราจะต้องเข้าไปเซ็ตค่าเริ่มต้น sslbase แล้วเกิด error โดยค่าเริ่มต้นอื่นๆคือ urlbase ssl_redirect และ cookiepath ไม่มีปัญหา

แต่เพื่อความปลอดภัย เราควรจะเซ็ตค่าให้ใช้ SSL เป็นหลัก นั่นคือ การกำหนดให้ ssl_redirect เป็น on ซึ่งถ้าผู้ใช้เรียกมาที่ urlbase (http://....) bugzilla ก็จะ redirect ไปที่ sslbase (https://...) แทน แต่ปรากฏว่าเมื่อป้อนค่าเสร็จ กดปุ่ม Save ก็เกิดข้อความ error ว่า "The new value for sslbase is invalid: Failed to connect to ...:443; unable to enable SSL." ดังภาพ



ผมได้ค้นดูจาก Google แล้ว ก็พบว่ามีคนแนะนำให้ใส่ URL ที่ต้องการ (secure url ที่ใช้ HTTPS) ไว้ที่ urlbase เลย โดยทิ้ง sslbase ให้ว่างไว้ ซึ่งก็ใช้งานได้ แต่จะไม่มีการ redirect เสมือนว่าเราเปิดใช้เฉพาะ https อย่างเดียว

ปัญหาที่เกิดขึ้นนี้ เนื่องจาก bugzilla จะตรวจสอบว่า sslbase ที่เรากรอกไว้สามารถเข้าถึงได้จริง ซึ่งเป็นการเรียกตัวเอง และปกติแล้ว เราอ้างถึงด้วย localhost ถ้าอ้างด้วยชื่อโดเมน ในบางระบบจะทำไม่ได้เนื่องจากเป็นระบบเครือข่ายภายใน ซึ่งอาจจะใช้ IP ไม่ตรงกับที่มองมาจากภายนอก

วิธีการแก้ปัญหาของผมคือ แก้ไขไฟล์ /etc/hosts โดยใส่ชื่อโดเมนที่ต้องการไว้คู่กับ localhost เช่น

127.0.0.1 localhost somchai.coe.psu.ac.th

เมื่อกรอกข้อมูลเสร็จ จะสามารถ Save ได้ไม่เกิด error อีก จากนั้น เราอาจจะแก้ไขไฟล์ /etc/hosts ให้กลับไปเหมือนเดิมก็ได้ ถ้าคงไว้ อาจจะมีปัญหาการ routing ในบางกรณี ขึ้นอยู่กับระบบเครือข่าย

สมชัย หลิมศิโรรัตน์

วันศุกร์ที่ 6 กรกฎาคม พ.ศ. 2555

Fuzzy Logic

Fuzzy Logic เป็นเรื่องของตรรกะคลุมเครือ (Uncertainty) ซึ่งจะต่างจากตรรกะปกติ (อุดมคติ) ตามที่เราได้เรียนกันมาตั้งแต่สมัยมัธยมนั้น เป็นตรรกะที่มีเพียงสองค่า (bivalent logic) คือ จริง (true) กับ เท็จ (false) เท่านั้น แต่ fuzzy จะมีตรรกะมากกว่าสองค่า หรือที่เรียกว่า multivalent logic ซึ่งโดยทั่วไปแล้วจะใช้ค่า 0 = เท็จ, 1=จริง และ ค่าระหว่าง 0-1 จะเป็นดีกรีของค่าจริง

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

Membership Functions

เมื่อเราต้องการระบุถึงสิ่งใดสิ่งหนึ่งที่มีความคลุมเครือ เราสามารถใช้ fuzzy ระบุถึงความเป็นสิ่งนั้นได้ด้วยฟังก์ชันค่าความเป็นสมาชิก หรือที่เรียกว่า membership function โดยที่ฟังก์ชันนี้จะให้ค่าอยู่ในช่วง 0-1 เป็นการระบุค่าดีกรีของความเป็นสิ่งนั้นว่ามากน้อยเพียงไร

โดยปกติแล้ว เพื่อให้ง่ายต่อการคำนวณ เรามักจะใช้สมการเส้นตรงระบุค่าความเป็นสมาชิก เช่น





Operators
เมื่อต้องการประมวลผลค่าความเป็นสมาชิกของหลายๆสิ่ง มีวิธีการคำนวณดังนี้
M(not A) = 1 - M(A)
M(A) and M(B) = MIN(M(A), M(B))
M(A) or M(B) = MAX(M(A), M(B))
ส่วนเงื่อนไข IF A THEN B นั้น ปกติแล้ว เรามีเงื่อนไขเทียบเท่าคือ not A or B
ซึ่งสามารถคำนวณด้วย not และ or ได้

แต่เพื่อความสมเหตุสมผลมากกว่านี้ Godel ได้เสนอเงื่อนไข IF A THEN B ใหม่เป็นเทียบเท่ากับ (A <= B) or B

Rules
เมื่อเรานำเอาเงื่อนไข IF A THEN B มาใช้งาน โดยใช้เป็นกฏของการพิจารณาเรื่องที่เราสนใจเป็นข้อๆ ทำให้เราสามารถสร้างเงื่อนไขที่ซับซ้อนขึ้นได้ แต่จากกฏแต่ละข้อ เราสามารถคำนวณหาค่าความเป็นสมาชิกของเงื่อนไข IF A THEN B ได้ไม่ยาก แต่เมื่อนำค่าที่ได้จากกฏหลายๆข้อมารวมกัน เราจะต้องมีวิธีการรวมกันที่เหมาะสม เช่น ถ้ากฏแต่ละข้อ เป็นเงื่อนไขของแต่ละกรณีที่ไม่เกี่ยวข้องกัน เรามักจะเอาผลลัพธ์ของกฏแต่ละข้อมารวม(บวก)กัน แต่ถ้าเป็นกฏที่ขัดแย้งกัน เราก็จะรวมกันแบบ and เป็นต้น

Defuzzification
นอกจากนี้ เนื่องจาก B ยังเป็น fuzzy อยู่ เราก็จะต้องแปลงคำตอบที่ได้กลับไปเป็นค่าจริง โดยใช้วิธีการหา center of gravity ของคำตอบ B

สมชัย หลิมศิโรรัตน์

วันอังคารที่ 12 มิถุนายน พ.ศ. 2555

Ubuntu MAAS Provision

ผมได้ทดลองติดตั้ง Ubuntu 12.04 LTS เพื่อเป็น MAAS (Metal As A Service) Server ขึ้นมา และได้ทำตามเอกสารแนะนำในเว็บไซต์แล้ว เดิมทีผมเข้าใจว่า Ubuntu MAAS จะเป็น Cloud สำเร็จรูปให้เราได้ใช้งานกันเลย แต่จริงๆแล้ว นี่เป็นเพียงแค่การเริ่มต้นเท่านั้น

เมื่อติดตั้ง maas server แล้ว สิ่งที่จะได้ตามมาก็คือ maas-provision ซึ่งมีชื่อว่า Cobbler

Cobbler เป็น provision ซึ่งไม่ใช่ hypervisor แต่มันครอบ hypervisor อีกที ตามคำอธิบายจากคำสั่ง man cobbler ที่ว่า
Cobbler is a provisioning (installation) and update server. It supports deployments via PXE (network booting), virtualization (Xen, QEMU/KVM, or VMware), and re-installs of existing Linux systems. The latter two features are enabled by usage of 'koan' on the remote system. Update server features include yum mirroring and integrating of those mirrors with kickstart. Cobbler has a command line interface, Web UI, and extensive Python and XMLRPC APIs for integration with external scripts and applications.

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

สมชัย หลิมศิโรรัตน์

วันอาทิตย์ที่ 3 มิถุนายน พ.ศ. 2555

BPM คืออะไร

พอดีได้ค้นหาเรื่องเกี่ยวกับ workflow แล้วก็เจอคำย่อว่า BPM ก็เลยงง หาไปหามา ก็พบว่ามันย่อมาจากคำว่า Business Process Management นั่นเอง

ค้นไปค้นมาเจอแหล่งความรู้เกี่ยวกับเรื่อง workflow และ BPM ที่น่าสนใจคือ
http://www.ebizq.net/

และพบว่า มีการแบ่งเรื่องการจัดการ workflow ออกเป็น 3 แนวทาง คือ
1. Human-Centric Approach
http://www.ebizq.net/topics/workflow_management/features/13249.html

2. Process-Centric Approach
http://www.ebizq.net/goals/process_centric_bpm

3. Content-Centric Approach
http://www.ebizq.net/goals/content_collaborative_bpm

วันอาทิตย์ที่ 20 พฤษภาคม พ.ศ. 2555

เทคนิการแก้ไข image ไฟล์ของ Linux

Ubuntu 12.04 LTS ได้ถูกปล่อยออกมาแล้ว ผมก็เลยได้มีโอกาสทดลองติดตั้ง Private Cloud ดู แต่ปรากฏว่ายังติดปัญหาอยู่หลายเรื่อง แต่วันนี้ไม่ได้มาเล่าถึงปัญหาของการทำ Cloud หรอกนะครับ เพราะผมเองก็ยังแก้ปัญหานั้นยังไม่ได้ แต่อยากจะเล่าเทคนิคเล็กๆน้อยๆ สำหรับบันทึกไว้เตือนความจำตัวเองด้วย และอาจจะมีบางคนได้ใช้ประโยชน์

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

ปัญหาที่ผมเจอตอนนี้ คือ image ไฟล์ที่เขาสร้างไว้นั้น ยังมีบั๊กอยู่ ทำให้การติดตั้ง Cloud สะดุด ไม่สามารถติดตั้งโหนดลูกได้สมบูรณ์ เขาแนะนำว่าต้องเพิ่มโปรแกรมบางอย่างลงไป ซึ่งตอนนี้ถ้าเรารอได้ ก็รอให้เขาทำ image ไฟล์ตัวใหม่ออกมา แล้วเราก็แค่ update แต่ถ้ารอไม่ได้ก็ต้องทำ image ไฟล์ใหม่เอง ตามขั้นตอนที่เขาแนะนำ
ผมก็เลยทำตามขั้นตอนที่เขาแนะนำ และก็เลยคิดว่าควรจะบันทึกวิธีการหลักๆไว้ เพราะมีประโยชน์ในการนำไปใช้แก้ไข Firmware ต่างๆของเครื่องที่ใช้ระบบ Linux เช่น Firmware ของ Android เป็นต้น

หมายเหตุ: ขั้นตอนต่อไปนี้อาจจะต้องใช้สิทธิ์ของ root ในการสั่งงาน

ขั้นตอนแรก คือ mount image ไฟล์นั้นๆเข้ามาก่อน เช่น สมมติว่าเรามีไฟล์อยู่ที่ /home/test/amd64-boot.img อาจจะสั่ง mount ไปไว้ที่ /mnt ดังนี้
mount /home/test/amd64-boot.img /mnt

จากนั้น ใช้คำสั่ง chroot ซึ่งจะเปลี่ยนสภาพแวดล้อมการทำงานให้เรา เสมือนว่าเราทำงานอยู่บนอีกเครื่องหนึ่งที่มี root โฟลเดอร์อยู่ตรงที่ที่เราต้องการ เช่นในกรณีนี้ เราจะทำงานเสมือนว่าเราเปิดเครื่องมามีฮาร์ดดิสต์อยู่ที่ image ไฟล์ที่เรา mount ไว้แล้วที่ /mnt ดังนี้
chroot /mnt

เมื่อเราเสมือนว่าทำงานอยู่ที่ฮาร์ดดิสต์ตัวใหม่แล้ว เราก็สามารถแก้ไขข้อมูลต่างๆภายในได้ หรือแม้แต่รันโปรแกรมต่างๆ ก็จะเสมือนรันอยู่ที่เครื่องนั้น (จะต้องเป็นเครื่องที่มีสถาปัตยกรรมเหมือนกันกับเครื่องจริงที่กำลังทำงานอยู่) แต่ปัญหาของผมก็คือ ผมจะติดตั้งโปรแกรมโดยใช้คำสั่ง apt-get install แล้วเกิดปัญหาว่า ไม่สามารถติดต่อกับเน็ตเวอร์กได้ ทั้งๆที่เครื่องที่ทำงานอยู่ สามารถใช้เครือข่ายได้ตามปกติ สาเหตุก็คือ เราจะต้อง mount โฟลเดอร์พิเศษของระบบเข้ามาให้ถูกต้องด้วย นั่นคือโฟลเดอร์ /dev, /proc, /sys ซึ่งจะต้องเรียกก่อนที่จะใช้คำสั่ง chroot ดังนี้
mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
chroot /mnt

เท่านี้ เราก็สามารถใช้คำสั่ง apt-get install เพื่อติดตั้งโปรแกรมต่างๆลงใน image ไฟล์ที่เราต้องการได้ จากนั้นเมื่อทำการแก้ไขเสร็จแล้ว ให้ออกโดยอย่าลืม umount ด้วยดังนี้
exit
umount /mnt/dev
umount /mnt/proc
umount /mnt/sys
umount /mnt

วันจันทร์ที่ 16 เมษายน พ.ศ. 2555

ปัญหาการ Burn DVD+R บน Ubuntu

ประเด็นของผมวันนี้คือ ผมอยากจะบันทึกเรื่องนี้ไว้ค้นถ้าหากลืมไปอีก และจะได้ไม่เสียแผ่นไปอีกเป็นกอง อีกอย่าง ก็อยากจะให้ผู้ที่ใช้ Linux และบังเอิญซื้อแผ่น DVD+R มา แล้วเจอปัญหาเดียวกัน จะได้รู้วิธีแก้ไข เพราะหาคำตอบใน Google ได้ไม่ง่ายนัก

ก่อนอื่นต้องขอย้อนกลังไปถึงสมัยเมื่อประมาณ 10 ปีก่อน ตอนที่ผมเรียนอยู่ที่ญี่ปุ่น ผมชอบใช้ DVD+R เพราะตอนเริ่มแรกที่ทาง Sony ออกมาตรฐานนี้ เขาออกแบบมาเพื่อการเขียนข้อมูลวีดีโอ และที่ญี่ปุ่นตอนนั้นก็นิยม DVD+R มากกว่า DVD-R แต่ต่อมา ไม่ว่าจะใช้แบบไหน ก็ได้คุณภาพพอๆกัน ทำให้ช่วงหลัง DVD-R ได้รับความนิยมมากกว่า เนื่องจากมีหลายบริษัทสนับสนุน DVD-R อาจจะเป็นเพราะไม่อยากให้ Sony ผูกขาดก็เป็นได้

เมื่อนานมาแล้ว ประมาณสักปีหนึ่งเห็นจะได้ ผมได้ซื้อ DVD+R มากล่องใหญ่ แต่ปรากฏว่านำมาใช้เขียนข้อมูลบน Ubuntu แล้ว มี error ทุกครั้ง เสียแผ่นไปตั้งหลายแผ่น แรกๆผมก็คิดว่า ผมซื้อแผ่นราคาถูกๆของ TESCO มา มันคงจะเสียจริงๆ แต่พอเอาไปเขียนบนเครื่อง Windows ก็ไม่พบปัญหา ผมจึงหาทางแก้ไข จนได้รู้ว่าเป็นเพราะอะไร และแก้ปัญหานั้นไปได้นานมากแล้ว

มาถึงเมื่อไม่นานมานี้ ผมก็ลืมปัญหานี้ไปแล้ว พอเอาแผ่นมาเขียนอีก เจอปัญหาเดิม ก็คิดว่าแผ่นเสีย เอาแผ่นใหม่มาเขียนอีกก็เสียอีก ทำไปทำมา ก็เสียไปหลายแผ่น จนทำให้นึกสงสัย หลายวันต่อมาก็นึกขึ้นได้ แต่ก็จำไม่ได้แล้วว่าต้องทำอย่างไร ค้น Google ก็จะไม่เจอ เพราะ keyword ที่ใช้ มันมีเครื่องหมาย และแตกต่างจากปัญหาอื่นๆเพียงเล็กน้อย เช่น ถ้าค้นว่า cannot burn DVD+R problem ก็จะไปพบแต่กระทู้ที่เกี่ยวกับปัญหาการเขียน DVD-R เสียมากกว่า แต่ความพยายามอยู่ที่ไหน ความสำเร็จก็จะมาเยือนแน่นอน ผมนึกขึ้นได้ว่า มันมีโปรแกรมที่จะต้องเรียก ซึ่งมีคำว่า dvd อยู่ และผมก็ลงไว้ในเครื่องแล้ว ก็เลยพบโปรแกรมนั้น นั่นคือโปรแกรม dvd+rw-booktype ซึ่งมีอยู่ใน package dvd+rw-tools นะครับ

เราจะต้องเรียกคำสั่ง
sudo dvd+rw-booktype -dvd-rom -unit+r /dev/dvd
เพื่อระบุว่าเราจะใช้ DVD+R ซึ่งผลการรันก็จะแสดงข้อความว่า
Unit was instructed to brand DVD+R media as DVD-ROM
จากนั้นก็สามารถใช้โปรแกรมเขียนแผ่นได้ตามปกติ หรือใช้คำสั่ง
sudo dvd+rw-booktype -inq -unit+r /dev/dvd
ถ้ายังมีปัญหาอาจจะลองสั่ง
sudo dvd+rw-booktype -dvd+r-spec -unit+r /dev/dvd 
ถ้าใครกลัวลืม อาจจะเขียนเป็นคำสั่งไว้ในไฟล์ /etc/rc.local ก็ได้ จะทำให้ทุกๆครั้งที่เปิดเครื่อง จะเรียกคำสั่งนี้อัตโนมัติ

ปล. เวลาเขียนแผ่น ควรจะตั้งความเร็วต่ำๆนะครับ เพื่อความชัวร์

วันอาทิตย์ที่ 18 มีนาคม พ.ศ. 2555

รีวิวโปรแกรมโน๊ตสำหรับ iPad

ตั้งแต่ได้ iPad 2 มา ผมก็พยายามหาโปรแกรมต่างๆมาใช้งานเพื่อให้สามารถทำงานบนเครื่องนี้ให้ได้ ตั้งใจไว้ว่าจะเปลี่ยนวิถีชีวิตที่หนักอึ้งมาหลายปี เพราะแบกกระเป๋าโน๊ตบุ๊ค+อุปกรณ์เสริม รวมๆแล้วก็หลายกิโลกรัมแทบจะทุกวัน เปลี่ยนให้มาเป็นชีวิตที่เบาสบายกว่า ซึ่งโปรแกรมหลักๆที่มีมากับเครื่องนั้น โดยรวมก็ช่วยให้ทำงานได้ในระดับหนึ่ง ไม่ว่าจะเป็นโปรแกรม Calendar ซึ่งเป็นปฎิทินสำหรับบันทึกนัดหมายต่างๆ โปรแกรม Mail ไว้สำหรับติดต่อสื่อสาร และโปรแกรม Notes สำหรับบันทึกข้อความ ส่วนโปรแกรมทางด้านความบันเทิง หรือ มัลติมีเดียได้แก่ โปรแกรม Videos สำหรับดูหนัง โปรแกรม Music สำหรับฟังเพลง โปรแกรม Camera สำหรับถ่ายรูป หรือโปรแกรม Photo สำหรับเป็นอัลบั้มเก็บภาพต่างๆไว้ ฯลฯ เป็นต้น

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

สำหรับโปรแกรมโน๊ตที่เลือกมารีวิวมี 5 โปรแกรมดังนี้
  1. Notes - Notes ของ Apple Inc. (ไม่จำกัดจำนวนเรื่อง)
  2. NoteMaster - NoteMaster Lite 4.2.1 ของ Kabuki Vision (7 เรื่อง)
  3. aNote - Awesome Note HD Lite 2.3 ของ BRID (bridworks.com) (10 เรื่อง)
  4. DocAs - DocAs Lite 4.0 ของ Square LLC
  5. iDesk - iDesk Lite 2.1 ของ tentouch.com
ทั้งหมดที่เลือกมา ผมเน้นเลือกเฉพาะรุ่น Lite เนื่องจากผมคิดว่าโปรแกรมโน๊ตนั้น น่าจะเป็นโปรแกรมที่ไม่ซับซ้อน ใช้งานง่ายๆ ความสามารถไม่ต้องมากนัก และก็ไม่ควรต้องเสียเงินมากด้วย ผมจึงเลือกที่ฟรีๆมาทดลองใช้ดูก่อน ทีนี้เรามาดูว่าความสามารถไหนบ้างที่จำเป็นต้องใช้

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

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

แทรกภาพได้
นอกจากข้อความแล้ว เรามักจะต้องการแทรกภาพด้วย เพราะภาพสามารถใช้แทนคำบรรยายได้ดีกว่าในบางกรณี ซึ่งภาพก็มีอยู่สองแบบคือ ภาพถ่ายและภาพวาด สำหรับภาพวาดนั้น เครื่องมือที่ใช้วาดก็สำคัญ และที่มักใช้บ่อย คือ free hand และการวาดรูปทรงเรขาคณิต ถ้าจะตัดความสามารถในการวาดภาพออกไป คือเอาเฉพาะให้แทรภาพได้ ก็เพียงพอแล้ว ส่วนภาพนั้นจะสร้างมาอย่างไร ก็ขึ้นอยู่กับเครื่องมืออื่นๆที่จะนำมาวาดภาพประกอบก็พอ

บันทึกเสียงได้
การโน๊ตนั้น เราอาจจะเคยชินกับการพิมพ์ข้อความ แต่การพิมพ์บน iPad นั้น บางคนอาจจะไม่ถนัด ถ้าสามารถบันทึกเสียงแทนการพิมพ์ได้ ก็จะดีไม่น้อย

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

การจัดการไฟล์
การจัดการไฟล์เป็นความสามารถที่จำเป็นมาก หากเรามีโน๊ตเก็บไว้มากขึ้นเรื่อยๆ ซึ่งจำเป็นต้องมีความสามารถในการค้นหาไฟล์ต่างๆ บางโปรแกรมจะให้เราสร้างโฟลเดอร์ได้ แต่บางโปรแกรมก็ไม่ได้ ซึ่งทำให้ความสามารถในการค้นหายิ่งจำเป็นมากขึ้น บางโปรแกรมให้เราติด tag ได้ และสามารถค้นหาตาม tag ได้ แต่เนื่องจากโปรแกรมที่นำมารีวิวนี้เป็นรุ่น Lite ซึ่งส่วนใหญ่จะจำกัดจำนวนไฟล์ ทำให้ไม่สามารถทดสอบการค้นหาได้อย่างเต็มที่นัก

การถ่ายโอนข้อมูล
ใน iPad นั้น แต่ละโปรแกรมจะถูกจำกัดให้เข้าถึงเนื้อที่เก็บข้อมูลเฉพาะของตัวเองเท่านั้น หากต้องการข้อมูลนั้นๆไปทำอย่างอื่น เราจะต้องถ่ายโอนข้อมูลออกไป หรือรับข้อมูลมาจากโปรแกรมอื่นก็ได้ สำหรับการรับข้อมูลเข้านั้น ผมขอไม่พูดถึงนะครับ เพราะการโน๊ตปกติแล้วเราจะเขียนขึ้นมาเอง ไม่ใช่การเอาสิ่งที่เขียนไว้มาแก้ แต่ไม่ว่าจะเป็นการรับหรือส่งเพื่อถ่ายโอนข้อมูลจะมีข้อจำกัดคือ โครงสร้างของข้อมูลจะถูกแปลง บางโปรแกรมก็ส่งเป็นข้อความอีเมลล์ บางโปรแกรมก็แปลงเป็นภาพแล้วแนบไปในอีเมลล์ หรือแปลงเป็นไฟล์ PDF ได้ก็มี นอกจากนี้ บางโปรแกรมก็สามารถส่งเข้า Dropbox ได้เลย หรือไม่ก็ sync เข้ากับ Google Doc ได้ ซึ่งมีประโยชน์มาก หากเราสามารถถ่ายโอนไปได้หลายช่องทาง

ตารางสรุปความสามารถของโปรแกรม
Y / NNoteNoteMasteraNoteDocAsiDesk
สมุดฉีก/หนังสือ
Y
Y
Y
N
Y
มีบรรทัด/ไม่มีบรรทัด
Y
Y
Y
N
N
แทรกภาพได้
N
Y
Y
Y
N(พื้นหลัง)
วาด freehand ได้
N
Y
Y
Y
Y
วาดรูปทรงเรขาคณิตได้
N
N
N
N
Y
บันทึกเสียงได้
N
N
N
N
Y
แทรกตำแหน่ง GPS ได้
N
N
Y
N
N
สร้างโฟลเดอร์ได้
N
Y
Y
Y
N
ค้นหาหัวข้อเรื่อง
Y
Y
Y
Y
N
ค้นหาเนื้อหา
Y
N
Y
N
N
ค้นหา tag
N
N
Y
N
N
อีเมลล์ข้อความ
Y
Y
Y
N
N
อีเมลล์ HTML
N
Y
Y
N
N
อีเมลล์โดยแนบภาพ
N
Y
Y(HTML)
Y
Y
อีเมลล์โดยแนบ PDF
N
N
N
N
Y
ส่งภาพเข้า Photo
N
N
N
Y
Y
ส่งเข้า Dropbox
N
N
N
N(buy)
Y
sync Google Doc
N
Y
Y
N(buy)
N

สรุป
จากตารางความสามารถที่สรุปมา จะเห็นได้ชัดว่าโปรแกรม aNote นั้นน่าใช้มาก และถ้าใช้งานร่วมกับโปรแกรม DocAs หรือ iDesk โดยใช้เป็นเครื่องมือช่วยวาดภาพ ก็จะได้เครื่องมือที่สมบูรณ์แบบ โดยส่วนตัวแล้ว ผมชอบโปรแกรม iDesk มากกว่า เพราะสามารถวาดรูปทรงเรขาคณิตได้ดีกว่า เราสามารถใช้วาดแผนผัง แผนภาพต่างๆแล้วนำเข้ามาแทรกเป็นภาพในโน๊ตของเราได้ แต่ถ้าดูที่ความสามารถ โปรแกรม DocAs จะเก่งกว่า สามารถถ่ายโอนข้อมูลได้หลากหลายช่องทางมากกว่า

วันพฤหัสบดีที่ 22 ธันวาคม พ.ศ. 2554

การติดตั้ง RTC 3.0.1.1 บน Ubuntu (amd64)

ชุดติดตั้ง RTC 3.0.1.1 ถ้าดาวโหลดชุด Web Installer จะมีขนาดประมาณ 96.5MB ซึ่งจะมีเฉพาะโปรแกรม IBM Installation Manager กับข้อมูลเบื้องต้นของโปรแกรม เมื่อติดตั้งจะ โปรแกรมจะไปดาวโหลดโปรแกรมฉบับเต็มมาจากอินเตอร์เน็ตอีกทีหนึ่ง ซึ่งมีขนาดประมาณ 1.4GB

สำหรับ Ubuntu 64 บิตนั้น อาจจะมีปัญหาเล็กน้อย เนื่องจากโปรแกรมติดตั้งบางส่วนเป็นแบบ 32บิต ซึ่งจะเกิดปัญหาการโหลดไลบรารี่ 64บิตไม่ได้ ซึ่งตามเว็บที่เขาแนะนำมาก็คือ จะต้องลงเพ็คเกจ ia32-libs และ ia32-libs-gtk ก่อนติดตั้ง

นอกจากนี้ จะต้องเพิ่มจำนวนไฟล์ที่สามารถเปิดได้ด้วยคำสั่ง
ulimit -n 65536
1.รันโปรแกรม launchpad.sh
2.เลือกติดตั้งตามปกติ ซึ่งโปรแกรมจะถูกติดตั้งไว้ที่ /opt/IBM/JazzTeamServer
3.แก้ไขไฟล์ server/server.startup โดยเพิ่มคำสั่ง ulimit -n 65536 ไว้ใน script
4.แก้ไขไฟลื /etc/rc.local ให้เรียก server.startup เพื่อให้โปรแกรมเริ่มทำงานอัตโนมัติทุกครั้งที่เปิดเครื่อง

วันพุธที่ 21 ธันวาคม พ.ศ. 2554

ปัญหาการอัพเกรด Rational Team Concert

หลังจากที่ผมได้เคยแนะนำการติดตั้งโปรแกรม Rational Team Concert (RTC) 3.0.1 ไปแล้ว พร้อมทั้งได้เล่าประสบการณ์ที่ทำให้เสียเวลาไปเป็นเดือนในการแก้ปัญหาการใช้งานบนระบบปฏิบัติการ Ubuntu รวมทั้งได้แนะนำวิธีการสร้างโครงการใน RTC ไว้แล้ว ใครสนใจก็สามารถย้อนกลับไปอ่านได้เลยนะครับ

สำหรับครั้งนี้ เป็นปัญหาการอัพเกรด RTC ไปเป็นรุ่น 3.0.1.1 ซึ่งปล่อยออกมาเมื่อวันที่ 14 ตุลาคม 2554 นี้เอง พอดีผมเพิ่งจะมีเวลา ก็เลยเข้าไปดาวโหลดและติดตั้ง แต่ก็พบปัญหาคือ ตัวโปรแกรม IBM Installation Manager (IM) ที่จะใช้ติดตั้งโปรแกรมต่างๆของ IBM กลับใช้งานไม่ได้ โปรแกรมมันเงียบไปเฉยๆ ไม่ทำงานอะไร และไม่มีข้อความอะไรแสดงออกมาเลย ก็เลยเป็นปัญหาว่า แล้วมันเกิดอะไรขึ้น แล้วจะแก้ไขได้อย่างไร

เนื่องจากโปรแกรม IM ไม่ทำงาน ผมจึงพยายามหาทางลองติดตั้งใหม่ แต่ก็พบว่า หาโปรแกรม IM มาติดตั้งได้ยากมาก เพราะ IBM ไม่ได้ทำไว้ให้ดาวโหลดแยกเป็นโปรแกรม ส่วนใหญ่จะมีมากับโปรแกรมอื่นๆอยู่แล้ว แต่ถ้าผมจะอธิบายยืดยาวว่าไปหามาได้ไงก็คงจะเสียเวลาเปล่า เอาเป็นว่า สรุปว่า ปัญหาไม่ใช่โปรแกรม IM เสีย แต่เป็นปัญหาที่ตัว Ubuntu ของผมเอง ที่ขาดบางอย่างไป (เฮ้อ เสียเวลาไปตั้งหลายวัน) 

ถ้าจะเล่าไอ้ที่ผมเสียเวลาไปลองทำโน่นทำนี่เพื่อจะแก้ปัญหา แต่สุดท้ายแล้วไม่ใช่ มันก็คงจะยืดยาวไป และเสียเวลาอีกนั่นแหละ เอาเป็นว่าขอสรุปสั้นๆคือ หลังจากที่ผม Update Ubuntu ซึ่งทำเป็นประจำ และก็ไม่เคยมีปัญหาอะไร ปรากฏว่ามีอยู่ครั้งหนึ่งเมื่อ 1-2 เดือนที่ผ่านมา ที่โปรแกรม libc6-i386 รวมทั้งแพ็คเกจอื่นๆบางตัวมันหายไป (เวลา Update Ubuntu ให้ระวัง ถ้ามันแจ้งว่าดาวโหลดแพ็คเกจบางตัวไม่ได้ ก็อย่าเพิ่งติดตั้ง เพราะมันอาจจะทำให้ระบบรวนได้) ซึ่งที่ผมรู้ก็เพราะมีโปรแกรมบางตัวใช้งานไม่ได้ เช่น Chrome อาการที่แสดงออกมาก็ทำนองเดียวกับ IM เลยล่ะครับ คือ เงียบ ไม่แสดงผลใดๆ แต่ตอนนี้ผมแก้ปัญหาของ Chrome ได้นานแล้ว คราวนี้โปรแกรม IM มันขาดอะไรล่ะ คำตอบคือ ไม่รู้

ผมก็พยายามขุดๆข้อมูลที่พอจะเอาออกมาดูได้ ก็พบว่า โปรแกรม IM มันจะสร้าง log ไฟล์ ไว้ที่โฟลเดอร์ configuration เช่น สำหรับแพ็คเกจ RTC ที่ผมดาวโหลดมา จะอยู่ที่ im/linux.gtk.x86/configuration (โปรแกรม IM บนระบบปฏิบัติการ Linux ที่ใช้ gtk และเครื่องที่ใช้ซีพียู x86) ก็ได้พบ error ตามข้างล่างนี้

!SESSION 2011-12-16 21:54:23.205 -----------------------------------------------
eclipse.buildId=unknown
java.fullversion=J2RE 1.5.0 IBM J9 2.3 Linux x86-32 j9vmxi3223ifx-20080811 (JIT enabled)
J9VM - 20080809_21892_lHdSMr
JIT  - 20080620_1845_r8
GC   - 200806_19
BootLoader constants: OS=linux, ARCH=x86, WS=gtk, NL=en_GB
Framework arguments:  -toolId install -accessRights admin -input @osgi.install.area/install.xml -input @osgi.install.area/install-server.xml
Command-line arguments:  -os linux -ws gtk -arch x86 -toolId install -accessRights admin -input @osgi.install.area/install.xml -input @osgi.install.area/install-server.xml

!ENTRY org.eclipse.osgi 4 0 2011-12-16 21:54:25.456
!MESSAGE Application error
!STACK 1
java.lang.UnsatisfiedLinkError: Could not load SWT library. Reasons: 
/home/somchai/Downloads/Rational/RTC3.0.1/im/linux.gtk.x86/configuration/org.eclipse.osgi/bundles/213/1/.cp/libswt-pi-gtk-3655.so (libgtk-x11-2.0.so.0: cannot open shared object file: No such file or directory)
swt-pi-gtk (Not found in java.library.path)
/tmp/swtlib-32/libswt-pi-gtk-3655.so (libgtk-x11-2.0.so.0: cannot open shared object file: No such file or directory)
/tmp/swtlib-32/libswt-pi-gtk.so (/tmp/swtlib-32/liblibswt-pi-gtk.so.so: cannot open shared object file: No such file or directory)....
ปรากฏว่า ข้อความ error บอกว่าโหลดไลบราลี่ SWT ไม่ได้ ผมก็งงๆ เมื่อตรวจสอบดูก็พบว่ามี libswt ติดตั้งอยู่ในเครื่องแล้ว แต่ path ที่ error แสดงออกมานั้นมันเป็นไลบรารี่ของ IM ที่ /tmp/swtlib-32/ ซึ่งเป็นโฟลเดอร์ชั่วคราว ผมก็สังเกตุเห็นว่ามันเป็น SWT-32 ซึ่งก็น่าจะเป็นไลบราลี่แบบ 32 บิต แต่เครื่องที่ผมใช้งานอยู่เป็น amd64 แสดงว่ามันต้องเป็นปัญหาของการโหลด 32บิตไลบราลี่ บน OS 64 บิตแน่ๆ ผมเคยพบปัญหานี้มาบ้างแล้วบน Windows 64 บิต บางครั้งมันก็เกิดปัญหาเวลาที่เราเอาโปรแกรม 32 บิตไปรัน เอ แล้ว Ubuntu นี่มันจะแก้ยังไง คำตอบคือ ไม่รู้

ผมก็พยายามหาข้อมูลต่อไป สังเกตุว่าโปรแกรม IM นี้เป็นโปรแกรมภาษา Java และใช้ JRE ของ IBM เอง ผมก็พยายามหาว่า แล้วจะเอา JRE 64 บิตมาแทน แต่ก็พบความยุ่งยากอีกหลายอย่าง เพราะภายในตัว IM นั้น มีสคริปที่เซ็คค่าต่างๆที่เกี่ยวข้องกับ JRE อีกหลายที่หลายจุด ถ้าเปลี่ยนตรงนี้ สงสัย ผมอาจจะต้องเข้าไปแก้ตัว IM มันก็จะกลายเป็นเรื่องใหญ่เกินไป

พยายามหาข้อมูลอยู่นาน ... เอาเป็นว่า ผ่านไป 1 สัปดาห์ ก็ยังไม่ได้คำตอบ

สุดท้ายวันนี้ไปพบบล็อก Honza’s perspective ที่เขียนเกี่ยวกับ RTC และการติดตั้งบน 64 บิต Ubuntu ไว้ว่าให้ติดตั้งแพ็คเกจ ia32-libs และ libstw-gtk-x.x-jni (ซึ่งมีอยู่แล้วในเครื่องผม) ผมก็เลยติดตั้ง ia32-libs เพิ่มเข้าไป สุดท้ายทุกอย่างก็กลับมาใช้งานได้เป็นปกติ ก็เลยบันทึกไว้และเผยแพร่ให้ผู้ที่ติดปัญหาแบบเดียวกัน จะได้ไม่เสียเวลามากมายอย่างที่ผมเจอมา


วันพฤหัสบดีที่ 8 กันยายน พ.ศ. 2554

การสร้างโครงการใน Rational Team Concert

Software: Rational Team Concert 3.0.1

วันก่อนผมได้เขียนถึงการติดตั้งโปรแกรม Rational Team Concert (RTC) ไปแล้ว ครั้งนี้จึงอยากจะแนะนำการสร้างโครงการอย่างง่ายๆ เพื่อให้ผู้สนใจสามารถเริ่มต้นใช้งาน RTC ในการบริหารโครงการแบบง่ายๆได้ จะได้ไม่ต้องเสียเวลาไปกับการศึกษาระบบต่างๆของ RTC ซึ่งมีความซับซ้อนค่อนข้างมาก เพราะ RTC มีความสามารถมากจริงๆ

ผู้มีสิทธิ์ในการสร้างโครงการ

User ที่มีสิทธิ์สร้างโครงการได้นั้น จะต้องอยู่ในกลุ่ม JazzProjectAdmins ซึ่งเราจะสามารถกำหนดกลุ่มให้กับ User แต่ละคนได้โดยเข้าไปที่ User Administration หัวข้อ Active Users เลือก User ที่ต้องการกำหนดให้สร้างโครงการได้ ในหัวข้อ Repository Permissions เลือก CheckBox ที่ JazzProjectAdmins แล้วอย่าลืมกดปุ่ม Save ที่อยู่มุมบนขวานะครับ

ชนิดของโครงการ
โครงการแต่ละโครงการนั้น จะมีกระบวนการบริหารจัดการที่แตกต่างกันไป เช่น บางโครงการเป็นโครงการใหม่ ซึ่งจะต้องมีเฟสการทำงานครบถ้วนตั้งแต่ Requirement, Design, Implementation และ Testing แต่บางโครงการอาจจะเป็นเพียงโครงการที่ Maintenance ระบบเท่านั้น ดังนั้น กระบวนการทำงานของแต่ละโครงการก็จะแตกต่างกันออกไป ใน RTC จึงมี Template สำหรับให้สร้างโครงการได้หลายแบบ และเรายังสามารถปรับแต่ง Template แล้วบันทึกไว้เป็นต้นแบบของเราเองได้ด้วย (หากใครสนใจก็สามารถศึกษาเพิ่มเติมได้ในหัวข้อ Modifying a predefined template)

สำหรับ Template ของโครงการนั้น จะเป็นสิ่งที่บ่งบอกถึงโครงสร้างของการจัดการพื้นที่ของโครงการ (project area) ซึ่งแต่ละโครงการ จะประกอบไปด้วยพื้นที่ สำหรับเก็บผลผลิตหรือสิ่งประดิษฐ์ (Artifact) ที่ได้จากกระบวนการต่างๆ ไม่ว่าจะเป็นกระบวนการวิเคราะห์ (ได้ requirement) กระบวนการเขียนโปรแกรม (ได้ source code) และกระบวนการทดสอบ (ได้ผลการทดสอบ) เป็นต้น นอกจากนี้ ยังเป็นที่รวมของผู้ที่มีหน้าที่ต่างๆในทีมอีกด้วย

สำหรับ Template เริ่มต้นนั้น RTC มีให้ใช้งานอยู่ 8 แบบ โดยแบ่งตามหน้าที่หลักของผู้มีส่วนร่วมในโครงการ ดังนี้
 
1. Quality Professional, Analyst, Developer - เป็นโครงการที่มี QM, RM และ CCM อยู่ครบถ้วน ผู้ทดสอบ (Quality Professional ใน QM) ผู้วิเคราะห์ (Analyst ใน RM) และ ผู้พัฒนา (Developer ใน CCM) ทำงานร่วมกัน การเปลี่ยนแปลง QM และ requirement จะถูกติดตามใน CCM


2. Quality Professional, Developer – without Requirements - เป็นโครงการที่มีเฉพาะ QM และ CCM เท่านั้น ผู้ทดสอบ (Quality Professional ใน QM) และ ผู้พัฒนา (Developer ใน CCM) ทำงานร่วมกัน การเปลี่ยนแปลง QM จะถูกติดตามใน CCM ไม่มีการติดตั้ง RM งาน requirement จะต้องใช้เครื่องมืออื่นแทน

3. Quality Professional, Analyst - เป็นโครงการที่มีแต่ QM และ RM ส่วน CCM นั้นแยกออกไปต่างหาก ไม่ได้รวมอยู่ในโครงการ (อาจจะเป็น CCM ของโครงการอื่น)
 ความสามารถในเรื่อง Defect จะไม่ถูกติดตั้งไว้ จะต้องใช้เครื่องมืออื่นแทน


4. Analyst, Developer - เป็นโครงการที่มีแต่ RM และ CCM โดย Analyst ทำงานร่วมกับ Developer การปรับปรุง requirement จะถูกติดตามใน CCM

5. Analyst - เป็นโครงการที่มีแต่ RM ปรับปรุง requirement จะถูกติดตามใน CCM ที่แยกออกไปต่างหาก ไม่ได้รวมอยู่ในโครงการ (อาจจะเป็น CCM ของโครงการอื่น)

6. Quality Professional – without Defects and Requirements - เป็นโครงการที่มีแต่ QM เท่านั้น การเปลี่ยนแปลงใดๆของ QM จะถูกติดตามใน CCM ที่แยกออกไปต่างหาก ไม่ได้รวมอยู่ในโครงการ Defect และ requirement จะต้องใช้เครื่องมืออื่นแทน

7. Developer - เป็นโครงการที่มีเฉพาะ CCM

8. Quality Professional, Analyst, Developer – with separate Quality Management Tasks and Requirements Change Requests - เป็นโครงการที่มี QM และ RM แยกออกไปต่างหาก ซึ่งอาจจะเป็นคนละโครงการ


สร้างโครงการ
  1. เข้าไปที่ Lifecycle Project Administration แล้วเลือกหัวข้อ Create Project จะปรากฏหน้าต่างสำหรับกรอกรายละเอียดของโครงการ
  2. กรอกชื่อโครงการ
  3. เลือก Template ของโครงการ
  4. กรอกคำอธิบายโครงการ
  5. ที่หัวข้อ Artifact Container จะมีรายการพื้นที่สำหรับเก็บ Artifact จากกระบวนการต่างๆตามต้นแบบที่เลือก เช่น ถ้าเลือก Template แบบที่ 1 (Quality Professional, Analyst, Developer) จะมีพื้นที่สำหรับ QM, RM และ CCM นอกจากนี้ เรายังสามารถเพิ่มเติม Artifact Container อื่นๆเข้ามาได้อีกด้วย แต่ในบทความนี้จะไม่ขอกล่าวถึง
  6. กดปุ่ม Save ที่มุมบนขวา

เพิ่มสมาชิกในทีม
เราจะสามารถเพิ่มสมาชิกในทีมได้ก็ต่อเมื่อ สมาชิกคนนั้นเป็น User อยู่ในระบบ
  1. ที่หน้าของโครงการ หัวข้อ Members เลือกหัวข้อ Show project members
  2. เลือก Add member จะปรากฏหน้าต่างให้เลือกชื่อที่ต้องการเพิ่มเป็นสมาชิกของโครงการ
  3. เลือกคนที่ต้องการ แล้วกด Add หรือ Add & Close เพื่อปิดหน้าต่างเลือกรายชื่อ
  4. ที่หน้ารายชื่อสมาชิกของโครงการ จะปรากฏชื่อที่เพิ่มเข้ามา
  5. กดปุ่ม Save ที่มุมบนขวา (หากไม่กด Save จะยังไม่สามารถกำหนดหน้าที่)
 กำหนดหน้าที่ของสมาชิกในทีม
  1. ที่หน้ารายชื่อสมาชิกของโครงการ ที่แถว Actions ของสมาชิกที่ต้องการกำหนดหน้าที่ กดปุ่ม Show member detail จะปรากฏรายละเอียดของสมาชิกคนนั้น ว่ามีสิทธิ์อะไรบ้าง
  2. ที่แถว Actions ของแต่ละ Artifact Container กดปุ่ม Edit the user's process role เพื่อกำหนดบทบาท หน้าที่ของสมาชิก จะปรากฏหน้าต่างสำหรับเพิ่มหน้าที่
  3. เลือกหน้าที่ที่ต้องการแล้วกด Add หรือเลือกหน้าที่ที่ไม่ต้องการ แล้วกด Remove เมื่อครบถ้วนแล้วจึงกดปุ่ม Ok
  4. ที่แถว Process Role จะปรากฏหน้าที่ต่างๆที่เราเลือกตามที่ต้องการ
เท่านี้ก็จะได้โครงการและทีมงานเรียบร้อยแล้ว หลังจากนี้ไปก็จะเป็นเรื่องการทำงานตามกระบวนการต่างๆ ซึ่งจะขอกล่าวในคราวหน้านะครับ โปรดติดตามตอนต่อไป

วันอาทิตย์ที่ 28 สิงหาคม พ.ศ. 2554

How to Implement a .NET TypeConverter

ภาษา: Visual C++
Application Type: Windows Forms Application

ก่อนหน้านี้ ผมมีความต้องการที่จะบันทึกค่า Configuration ของโปรแกรมไว้ เพื่อให้ผู้ใช้สามารถปรับแต่งโปรแกรมให้ทำงานตามความเหมาะสมของเขาได้ เช่น โปรแกรมตรวจนับจำนวนเซลล์มะเร็ง (Cell Image Analyzer, CIA) ที่ผมกำลังพัฒนาอยู่นั้น การแสดงผลเส้นรอบรูปเซลล์ที่ตรวจพบจะใช้สีอะไร ขนาดของเส้นเท่าไหร่ จะแสดงเป็นเส้นทึบหรือเส้นประ ฯลฯ ความจริงเราก็สามารถจะ Hard code ไว้ในโปรแกรมเลยก็ได้ แต่เนื่องจากโปรแกรมนี้ ผมจะพยายามพัฒนาให้มันสามารถนำไปประยุกต์ใช้กับการนับเซลล์ชนิดอื่นๆได้ด้วย จึงคิดว่า ผู้ใช้เองก็อาจจะต้องการให้แสดงสีที่แตกต่างกันออกไป เพื่อให้อ่านผลที่รายงานได้ชัดเจนยิ่งขึ้น ผมจึงจำเป็นต้องไม่ Hard code ไว้ในโปรแกรม

อ่าน/เขียน Registry
ในขั้นตอนการอ่าน/เขียนค่า Configuration นั้น ผมเลือกใช้การอ่าน/เขียนค่าไว้ใน Registry ของผู้ใช้ โดยเราจะสามารถอ้างถึง Registry ของโปรแกรมในพื้นที่ของผู้ใช้นั้นๆได้ที่ HKEY_CURRENT_USER\Software\(Manufacturer)\(Product)\(Version) และสามารถตรวจสอบดูได้ด้วยโปรแกรม regedit.exe นะครับ

สำหรับคำสั่งของ .NET ที่เขียนเป็นแบบ Windows Forms Application นั้น เราสามารถใช้คลาส System.Windows.Forms.Application ในการทำอะไรที่เกี่ยวกับโปรแกรมของเราได้หลายอย่าง รวมถึงการใช้ Property ที่ชื่อว่า UserAppDataRegistry ในการเข้าถึง Registry ของโปรแกรมในพื้นที่ของผู้ใช้นั้นๆ เช่น
Microsoft::Win32::RegistryKey^ urk = System::Windows::Forms::Application::UserAppDataRegistry;
String^ str = (String^)urk->GetValue("MyStringValue");
 ซึ่งคำสั่ง GetValue() นี้ จะได้ค่ามาเป็น Object โดยที่ข้อมูลใน Registry นั้น เราสามารถเก็บค่าได้ 6 ชนิด คือ
  1. String (REG_SZ) - เก็บข้อความที่จบด้วย null character
  2. Binary (REG_BINARY) - ใช้เก็บข้อมูลใดๆในแบบ binary
  3. DWord (REG_DWORD) - เก็บค่า 32-bits
  4. QWord (REG_QWORD) - เก็บค่า 64-bits
  5. MultiString (REG_MULTI_SZ) - เก็บค่าเป็น array ของข้อความที่จบด้วย null character โดยจะจบข้อความทั้งหมดด้วย null character 2 ตัว
  6. ExpandString (REG_EXPAND_SZ) - เก็บข้อความที่จบด้วย null ที่มีค่าตัวแปรของระบบอยู่ด้วย เช่น %PATH% ข้อความที่อ่านมาได้นั้น จะมีการแทนค่าตัวแปรให้เรียบร้อยด้วยค่าจากตัวแปรในขณะนั้น
และเนื่องจากค่าที่อ่านมาได้จาก GetValue() นั้นเป็น Object เมื่อเราต้องการนำไปใช้ เราจะต้อง casting Object ให้ถูกต้องตรงกับชนิดของมัน ซึ่งเรารู้แน่นอนอยู่แล้วว่าเราเก็บค่าชนิดใดไว้ หรือเราอาจจะตรวจสอบชนิดของข้อมูลที่เก็บไว้ ว่าเป็นชนิดอะไรได้ด้วยคำสั่ง GetValueKind()

ปัญหาก็มีอยู่ว่า ถ้าเราต้องการที่จะเก็บค่าอื่นๆนอกเหนือจาก 6 แบบนี้ จะทำได้อย่างไร

เช่น ผมมีตัวแปรชนิด Point เก็บตำแหน่งของหน้าต่าง ซึ่งมี 2 ค่า คือ x และ y เป็นชนิด int ถ้าเราจะแยกเก็บ ก็สามารถทำได้แบบง่ายๆคือ แยกเก็บ PointX ตัวหนึ่ง PointY ตัวหนึ่ง เวลาอ่านค่ามา ก็อ่านมา 2 ครั้ง คือ GetValue("PointX") และ GetValue("PointY") จากนั้นก็เอาค่า x และ y ที่ได้มาประกอบกลับมาเป็น Point ใหม่ ซึ่งเขียนได้เลยทันที ไม่ต้องไปคิดอะไรมาก แต่เราต้องมาจัดการกับค่าตัวแปรที่ซับซ้อนเหล่านี้ทีละตัว ทั้งตอนอ่าน และตอนเขียน ซึ่งถ้าหากเรามีค่าตัวแปรหลายๆตัวที่ต้องการจะเก็บ และแต่ละตัวก็มีชนิดที่ซับซ้อนแตกต่างกันไป ก็อาจจะเกิดความยุ่งยากขึ้นได้ และอีกเหตุผลหนึ่งก็คือ ผมเองก็ขี้เกียจเขียนอะไรยาวๆ โดยเฉพาะอย่างยิ่ง ถ้าเราจะต้องกลับมาแก้

กลไก ToString()
เมื่อเราสั่ง SetValue() โดยส่ง Object ไปให้ และไม่ได้ระบุว่าให้จัดเก็บแบบไหน สำหรับ Object ที่มีชนิดไม่ตรงกับ 6 ชนิดที่ระบุไว้ คำสั่งนี้จะแปลงค่าไปเป็นข้อความ และเก็บไว้เป็นข้อความด้วยกลไกของคำสั่ง ToString() เช่น ถ้าเราสั่ง SetValue("TestPoint", gcnew Point(12,13)) ค่าที่เก็บไว้ใน Registry จะกลายเป็นข้อความ "{X=12,Y=13}" และเมื่ออ่านมาก็จะต้องอ่านมาเป็น String แล้วเราจะต้องจัดการแปลงข้อความนั้นให้กลับมาเป็น Point

กลไก ToString() นี้ เป็นกลไกที่ใช้ได้กับทุกๆ Object เพราะเป็นคำสั่งพื้นฐานของ Object เลย โดยปกติแล้ว ทั้งภาษา Java และ C# ก็มีกลไกนี้เพื่อใช้ในการแสดงตัวของ instance หรือที่เรียกว่า Reflection ทำให้สะดวกในการทำงานกับ Object ที่หลากหลาย โดยเฉพาะอย่างยิ่งการ debug ซึ่งถ้าเราต้องการให้ Object ใดๆ แสดงตัวออกมาเป็นข้อความอย่างไร เราก็ต้อง override คำสั่งนี้ อย่างเช่น Point นั้น ก็มีการ override คำสั่งนี้ กลายเป็นการให้ข้อความ "{X=?,Y=?}" ขึ้นอยู่กับค่า x และ y ในขณะนั้น

ทีนี้ปัญหาก็จะเหลือแค่ตอนที่เราจะแปลงค่ากลับจาก String มาเป็น Object ซึ่งตรงนี้ .NET ได้มีคลาส System.ComponentModel.TypeConverter ให้เราใช้ โดยที่เราจะสามารถร้องขอ TypeConverter สำหรับ Object ชนิดที่เราต้องการ เพื่อนำมาแปลงค่าได้ ถ้ามี TypeConverter ที่ตรงกันอยู่ เราก็สามารถนำมาใช้ได้เลย เช่น
Point^ t;
TypeConverter^ converter = TypeDescriptor::GetConverter(Point::typeid);
String^ strvalue = (String^)urk->GetValue("TestPoint");
if ((strvalue != nullptr) && (converter != nullptr))
    t = converter->ConvertFromString(strvalue);
กลไก TypeConverter
กลไก TypeConverter นี้มีประโยชน์อย่างมาก และใช้งานอยู่เบื้องหลังในหลายๆเรื่อง เช่น การที่ Visual Studio สามารถแสดงหน้าต่างโปรแกรมตอนที่ออกแบบ และแสดงค่าต่างๆในหน้าต่าง Property และให้เรา set ค่าต่างๆของ Component ที่เรากำลังออกแบบอยู่ได้อย่าง real-time ได้นั้น ก็ใช้กลไกอันนี้ ดังนั้น สำหรับ TypeConverter ของ Object แต่ละชนิดที่เป็นคลาสสำคัญๆของ .NET ได้มีการเขียนเอาไว้ให้เราใช้หมดแล้ว เช่น ArrayConverter, BaseNumberConverter, BooleanConverter, ByteConverter, CharConverter, ฯลฯ (สามารถดูรายชื่อได้จาก MSDN Library ใน System.ComponentModel namespace)

แต่สำหรับคลาสชนิดใหม่ๆที่เราสร้างขึ้นมาเองนั้น เราจะต้องสร้างตัว TypeConverter สำหรับคลาสของเราขึ้นมาเอง โดยจะต้องสืบทอดมาจาก TypeConverter เช่น สมมติว่า เราต้องการสร้างคลาสชื่อว่า MyPoint3D โดยมีค่า x,y และ z สำหรับเก็บตำแหน่งในสามมิติ โดยเราจะต้อง override ToString() ด้วยดังนี้
public ref class MyPoint3D
{
public:
    int x,y,z;
    MyPoint3D(int x, int y, int z)
    {
        this->x = x;
        this->y = y;
        this->z = z;
    }
    virtual String^ ToString() override
    {
        return String::Format("[{0},{1},{2}]", x, y, z); // มีรูปแบบคือ "[x,y,z]"
    }
};
จากนั้นสร้าง MyPoint3DConverter โดยสืบทอดมาจาก TypeConverter และ override คำสั่ง CanConvertFrom() CanConvertTo() ConvertFrom() แล ConvertTo() ดังนี้
public ref class MyPoint3DConverter : public System::ComponentModel::TypeConverter
{
public:
    virtual bool CanConvertFrom(ITypeDescriptorContext^ context, Type^ sourceType) override
    { 
        if (sourceType == String::typeid) {
         return true; // ถ้าเป็น String ก็สามารถ convert ได้
        }
        // ไม่อย่างนั้นก็ให้เป็นหน้าที่ของคลาสที่เราสืบทอดมา
        return TypeConverter::CanConvertFrom(context, sourceType);
   }

   // Overrides the ConvertFrom method of TypeConverter.
   virtual Object^ ConvertFrom(ITypeDescriptorContext^ context,
      CultureInfo^ culture, Object^ value) override
   {
       if (value->GetType() == String::typeid) {
           String^ str = (String^)value;
           array<Char>^ chars = {'[', ',', ']'};
           array<String^>^ v = str->Split(chars);
           return gcnew MyPoint3D(int::Parse(v[1]), int::Parse(v[2]), int::Parse(v[3]));
      }
      return TypeConverter::ConvertFrom(context, culture, value);
   }

   // Overrides the ConvertTo method of TypeConverter.
   virtual Object^ ConvertTo(ITypeDescriptorContext^ context,
      CultureInfo^ culture, Object^ value, Type^ destinationType) override {
          if (destinationType == String::typeid) {
              return value->ToString();
      }
      return TypeConverter::ConvertTo(context, culture, value, destinationType);
   }
};
เมื่อสร้างเสร็จแล้ว สิ่งสำคัญคือ เราจะต้องลงทะเบียนให้ TypeDescriptor รู้ว่า จะต้องใช้ MyPoint3DConverter สำหรับ convert MyPoint3D ตอนเรียกใช้ TypeDescriptor::GetConverter() โดยขั้นตอนตรงนี้ ทาง Microsoft ได้ซ่อนกลไกการทำงานไว้ และให้เราทำโดยการระบุ TypeConverter Attribute ให้กับคลาส ผ่านทางการประกาศ attribute ที่หัวของคลาสดังนี้
ref class MyPoint3DConverter;

[TypeConverter(MyPoint3DConverter::typeid)]
ref class MyPoint3D
{
...
};
และเนื่องจาก การประกาศคลาส MyPoint3DConverter นั้น เราประกาศอยู่หลังคลาส MyPoint3D จึงทำให้เวลาคอมไพล์บรรทัดที่ประกาศ TypeConverter Attribute จะเกิด error ขึ้น เราจึงต้องเพิ่มบรรทัดที่ประกาศชื่อ MyPoint3DConverter ที่บรรทัดก่อนหน้ามันอีกทีหนึ่ง

สุดท้าย การใช้งาน
RegistryKey^ urk = Application::UserAppDataRegistry;
MyPoint3D^ a = gcnew MyPoint3D(12,13,14);
MyPoint3D^ b;
String^ stra = a->ToString(); // ได้ข้อความ "[12,13,14]"
String^ strb;
urk->SetValue("Test", a); // ปรากฏข้อความ "[12,13,14]" ใน registry
TypeConverter^ converter = TypeDescriptor::GetConverter(MyPoint3D::typeid);
String^ strvalue = (String^)urk->GetValue("Test");
if ((strvalue != nullptr) && (converter != nullptr)) {
    b = (MyPoint3D^)converter->ConvertFromString(strvalue); // ได้ Object ใหม่ที่มีค่า x=12,y=13,z=14
    strb = b->ToString(); // ได้ข้อความ "[12,13,14]"
}

สุดท้ายแล้ว หวังว่าบทความนี้จะทำให้ผู้ที่สนใจสามารถนำไปประยุกต์ใช้กับงานด้านอื่นๆได้อีกนะครับ

วันศุกร์ที่ 26 สิงหาคม พ.ศ. 2554

การติดตั้ง Rational Team Concert

ก่อนหน้านี้ผมได้เขียนถึงเรื่องการเสียเวลาไปเดือนกว่าๆ กับการพยายามใช้ Rational Team Concert ไปแล้ว ครั้งนี้ ผมก็อยากจะแนะนำการติดตั้งโปรแกรมนี้แบบง่ายๆสั้นๆ เพื่อให้ผู้ที่สนใจได้เริ่มต้นทดลองใช้โปรแกรมนี้ได้ทันที โดยไม่ต้องมาเสียเวลามากมายอย่างผมนะครับ โดยขอเน้นไปที่การติดตั้งบน Windows 7 เท่านั้น

เริ่มจากการดาวโหลดโปรแกรม
โปรแกรมนี้สามารถดาวโหลดได้ที่เว็บ Jazz.net สำหรับรุ่นที่แนะนำในบทความนี้คือ Rational Team Concert 3.0.1 โดยสามารถเลือก Platform ที่ต้องการ และเลือกรูปแบบของ License ได้ ตอนนี้ IBM ให้ Free 10 Developer License สามารถดาวโหลดในหน้าเดียวกันได้เลย แต่ถ้าหากต้องการดาวโหลดแบบเต็มๆ ก็เลือกหัวข้อ More download options ที่อยู่ข้างๆ Platform List นะครับ

อ้อ ตอนดาวโหลดจะต้องสมัครเป็นสมาชิกของเว็บก่อน ถึงจะดาวโหลดได้นะครับ

หมายเหตุ: หากดาวโหลดแบบไม่เต็ม คือเป็น Web Installer นั้น ไฟล์จะมีขนาดเล็กก็จริง แต่ตอนที่เราติดตั้ง จะต้องออนไลน์เพื่อที่จะดาวโหลดไฟล์ที่เหลือมาติดตั้งอีกทีหนึ่ง ซึ่งจะต้องใช้ user ที่ลงทะเบียนไว้ในตอนที่เราดาวโหลดมาด้วย

ติดตั้งโปรแกรม
สำหรับ Platform ที่สามารถใช้งานได้นั้น เขาแนะนำว่าควรจะเป็น 64 บิต OS และมีหน่วยความจำอย่างน้อย 4GB เช่น ถ้าติดตั้งบน Windows ก็ควรจะเป็น Windows Server 2008 R2 หรือ 2003 SP2 ก็ได้ แต่เนื่องจากโปรแกรมนี้เป็น Java Web Application ทำงานอยู่บน Tomcat ซึ่งสามารถใช้งานบน 32 บิต OS ได้อยู่แล้ว สำหรับการทดลองใช้ ไม่ได้ใช้งานหนักๆ ก็สามารถทำงานได้ แต่อาจจะอืดๆนิดๆ

เมื่อแตกไฟล์ออกมาแล้ว ให้รันโปรแกรม launchpad โดยคลิ๊กเมาส์ปุ่มขวา แล้วเลือก Run as administrator เพื่อให้มีสิทธิ์ในการติดตั้งโปรแกรม ซึ่งจะแสดงหน้าต่างรายชื่อโปรแกรมที่จะติดตั้ง ให้เลือกหัวข้อ
Jazz Team Server with Required Base Keys, including Trials, and CCM, QM and RM Applications
ซึ่งจะเป็นการติดตั้งโปรแกรมทั้งหมดในคราวเดียว โดยจะเริ่มจากการติดตั้ง IBM Installation Manager ก่อน แล้วค่อยติดตั้งโปรแกรมอื่นๆจากตัวนี้อีกทีหนึ่ง

สำหรับผู้ที่ดาวโหลดไฟล์ติดตั้งชุดที่มีชื่อเป็น Web เช่น RTC-Web-Installer-Win-3.0.1.zip นั้น ตอนติดตั้ง โปรแกรมจะดาวโหลดส่วนอื่นๆจากอินเตอร์เน็ตมาเพิ่ม ซึ่งจะต้อง Connect ไปที่ jazz.net ด้วย user ที่ลงทะเบียนไว้ และออนไลน์อยู่ตลอดในตอนที่ติดตั้งโปรแกรมนะครับ

Start/Stop Server
เมื่อติดตั้งโปรแกรมเรียบร้อยแล้ว จะปรากฏเมนูโปรแกรม Jazz Team Server และหัวข้อ Start และ Stop Server ให้สามารถสั่งให้ Server ทำงานได้ เราจะต้องกดเลือกหัวข้อ Start ด้วยเมาส์ปุ่มขวา เพื่อเลือก Run as administrator นะครับ เพราะจะได้รันด้วยสิทธิ์ในการเขียน/อ่านข้อมูลในโฟลเดอร์ Program Files ได้

เมื่อ Start ครั้งแรก ควรจะรอให้ Tomcat Deploy โปรแกรมส่วนต่างๆให้เรียบร้อยก่อน ซึ่งมันจะแสดงข้อความว่ากำลังติดตั้ง admin.jar, ccm.jar, qm.jar, rm.jar ให้เราเห็นในหน้าต่าง ควรจะรอจนกว่าจะขึ้นข้อความว่า
INFO: Server startup in ???? ms
? คือเวลาที่ใช้ในการ start ระบบ สำหรับครั้งแรกจะนานหน่อย แต่ครั้งถัดไปจะเร็วขึ้น

เมื่อจะจบการทำงาน ก็ให้เลือกเมนู Stop ด้วยสิทธิ์ของ admin เหมือนตอน Start นะครับ

Setup Server
จากนั้น เราสามารถล็อกอินเข้าสู่ระบบเพื่อทำการ Setup ได้ด้วย URL https://localhost:9443/jts/setup และใช้ User ID: ADMIN ส่วน Password ก็ใช้ ADMIN เช่นเดียวกัน จากนั้นจะปรากฏขั้นตอนต่างๆอยู่ทางซ้าย และปุ่ม Back, Next, Finish อยู่ด้านล่าง ทำการตั้งค่าตามขั้นตอนข้างล่างนี้ไปเรื่อยๆ ส่วนใหญ่แล้วจะกด Next แต่ควรจะรอให้หน้าเว็บ แสดงข้อความทดสอบสีเขียวขึ้นมาก่อน จึงจะทำขั้นต่อไปได้ ถ้ามีข้อผิดพลาดอะไร จะขึ้นข้อความสีแดง หรือข้อความเตือนก็จะเป็นสีเหลือง
  1. RATIONAL JAZZ TEAM SERVER (/jts)
    1. Introduction - กด Next
    2. Configure Public URI - ป้อน URI ที่จะใช้อ้างอิง โดยระบบจะใช้ URI นี้ตลอดไป ถ้าใช้งานเฉพาะในเครื่องตัวเองควรใช้ URI เป็น https://localhost:9443/jts เหมือนที่เราใช้ล็อกอินเข้ามา โดยจะมีข้อความเตือน เพราะ localhost ไม่ใช่ public URI แต่ไม่มีปัญหาใดๆ สามารถ กด Check Box ยอมรับ และกด Next ต่อไปได้
    3. Configure Database - จะมีการ config ฐานข้อมูลอัตโนมัติ สำหรับการใช้งาน Derby Database Server โดยเราไม่ต้องแก้ไขค่าใดๆ เมื่อขึ้นข้อความสีเขียวแล้ว สามารถกด Next ต่อไปได้เลย แต่ถ้าต้องการใช้งานร่วมกับฐานข้อมูลชนิดอื่น เช่น Oracle, Microsoft SQL Server ก็สามารถเปลี่ยนได้ แต่ต้องศึกษาวิธีการตั้งค่าให้ละเอียดจากคู่มือ Rational solution for Collaborative Lifecycle Management
    4. Enable E-Mail Notification - ไม่จำเป็นต้องตั้งค่าใดๆ กด Next ต่อไป
    5. Register Application - จะมี 2 ขั้นตอนคือ การตรวจสอบ Application และการลงทะเบียน ให้รอจนกว่ารายชื่อ Application จะแสดงครบ คือ /rm, /ccm, /qm และ /admin จากนั้นก็กดปุ่ม Register Applications ให้รอจนกว่าจะขึ้นข้อความสีเขียว แสดงว่าลงทะเบียน Application ได้แล้ว กดปุ่ม Next ต่อไปได้เลย
    6. Setup User Registry - หน้านี้จะเป็นการลงทะเบียนผู้ใช้ที่เป็นผู้ดูแลระบบ แทนที่ ADMIN ที่เราใช้ล็อกอินเข้ามาครั้งแรก ซึ่ง ADMIN จะถูกยกเลิกการใช้งานไป ให้ป้อน user name password ตามที่ต้องการ แล้วกด Next ต่อไป แต่หากต้องการทดลองใช้งานความสามารถด้านต่างๆ ก็สามารถเลือก Activate Trial License ต่างๆได้ ซึ่งให้ทดลองใช้ได้ 60 วัน ถ้าเราไม่ Activate ในขั้นตอนนี้ เราสามารถไป Activate ภายหลังได้
    7. Configure Data Warehouse - จะต้องป้อนชื่อ user name password สำหรับ user ที่ใช้ในการจัดการภายในของฐานข้อมูล Data warehouse โดย user นี้จะใช้งานเชื่อมโยงทั้ง CCM, QM และ RM จึงควรใช้ชื่อเดิม เช่น dw_user ตามตัวอย่างที่แนะนำไว้ และ password จะใช้อะไรก็ได้ โดยจะต้องกรอกในขั้นตอนถัดๆไปด้วย จากนั้นก็กด Next เป็นอันสิ้นสุดการ config server
  2. CHANGE AND CONFIGURATION MANAGEMENT (/ccm)
    1. Configure Database - สำหรับฐานข้อมูล Derby จะมีการ configure อัตโนมัติ สามารถกด Next ต่อไปได้เลย
    2. Configure Data Warehouse - ป้อนรหัสผ่านให้ถูกต้อง แล้วกด Next
    3. Finalize Application - กดปุ่ม Finalize Application Setup รอจนกว่าจะขึ้นข้อความสีเขียว เป็นอันสิ้นสุดการ configure CCM กด Next
  3. QUALITY MANAGEMENT (/qm)
    1. Configure Database - สำหรับฐานข้อมูล Derby จะมีการ configure อัตโนมัติ สามารถกด Next ต่อไปได้เลย
    2. Configure Data Warehouse - ป้อนรหัสผ่านให้ถูกต้อง แล้วกด Next
    3. Finalize Application - กดปุ่ม Finalize Application Setup รอจนกว่าจะขึ้นข้อความสีเขียว เป็นอันสิ้นสุดการ configure QM กด Next
  4. REQUIREMENT MANAGEMENT (/rm)
    1. Finalize Application - กดปุ่ม Finalize Application Setup รอจนกว่าจะขึ้นข้อความสีเขียว เป็นอันสิ้นสุดการ configure RM กด Next
  5. LIFECYCLE PROJECT ADMINISTRATION (/admin)
    1.  Finalize Application - กดปุ่ม Finalize Application Setup รอจนกว่าจะขึ้นข้อความสีเขียว เป็นอันสิ้นสุดการ configure ADMIN กด Next
  6. FINISH SETUP
    1. Summary - แสดงหน้าสรุป สามารถเลือกที่จะเริ่มสร้าง User สร้าง Project หรือจบการทำงานด้วยการกดปุ่ม Finish แล้วค่อยล็อกอินเข้ามาจัดการภายหลังได้
เข้าใช้งาน
เข้าใช้งานระบบได้จาก Public URI ที่ตั้งไว้ในขั้นตอนก่อนหน้านี้ นั่นคือ https://localhost:9443/jts โดยล็อกอินด้วย user ใหม่ที่สร้างขึ้น

เพิ่ม Client Access License
หากต้องการเพิ่ม Client Access License เช่น Free 10 Developer License ที่ IBM ให้ฟรีนั้น สามารถเข้าไปเพิ่มได้ที่ Server Administration/License Key Management ตรงหัวข้อ Client Access License Types กด Add แล้วเลือกไฟล์ License ที่ดาวโหลดมา กด Finish ก็จะมีหัวข้อของ 10 Developer เพิ่มเข้ามา

ทั้งหมดนี้ คือขั้นตอนการติดตั้ง Rational Team Concert สำหรับการใช้งานส่วนอื่นๆนั้น ไว้ค่อยมาเขียนต่อคราวหน้านะครับ

วันศุกร์ที่ 19 สิงหาคม พ.ศ. 2554

เสียเวลาไปเดือนกว่าๆ กับการพยายามใช้ Rational Team Concert

เมื่อประมาณเดือนกว่าๆที่ผ่านมา ผมได้พยายามหาโปรแกรมที่ช่วยในการบริหารจัดการโครงการมาใช้ ส่วนหนึ่งนั้นเป็นเพราะในเทอมนี้ ได้สอนวิชา Software Engineering จึงอยากจะเอามาแนะนำให้นักศึกษาได้เรียนรู้ ส่วนหนึ่งก็เพราะมีโครงการวิจัยที่ต้องจัดการอยู่หลายโครงการ ก็เลยนึกถึงโปรแกรม Rational Rose ของ IBM ที่สมัยก่อน(ประมาณ 10 กว่าปีมาแล้ว) เคยใช้ในการออกแบบโปรแกรม สร้าง UML Diagram แต่สมัยนี้ ทาง IBM ได้สร้างเป็นโปรแกรมใหม่ชื่อว่า Rational Team Concert (RTC) หรือจะเรียกชื่อเต็มๆซึ่งเป็นโปรแกรมชุดใหญ่ชื่อว่า Rational solution for Collaborative Lifecycle Management (CLM)

โปรแกรมนี้จะทำงานเป็น Server โดยมีแกนของระบบชื่อว่า Jazz Foundation หรือ Jazz Team Concert (JTC) ซึ่งพัฒนาเป็น Open Source ในโครงการที่ชื่อว่า  Jazz Project (jazz.net) และที่น่าสนใจมากก็คือ สถาปัตยกรรมของระบบ จะมี Jazz Foundation เป็นโครงสร้างพื้นฐาน จากนั้นก็จะมีโมดูลต่างๆสวมเข้ามาในระบบคล้ายการ Plug-In ทำให้กลายเป็นระบบใหญ่ที่ทำโน่นทำนี่ได้หลายอย่าง ใครสนใจเจ้า Jazz Foundation ก็สามารถดาวโหลดได้ที่ https://jazz.net/downloads/jazz-foundation/

ปัญหาก็มีอยู่ว่า ผมได้ติดตั้งโปรแกรมนี้ตั้งแต่เมื่อเดือนกว่าๆที่ผ่านมา โดยติดตั้งโปรแกรมนี้บน Ubuntu 10.04 แต่เมื่อถึงขั้นตอน setup ก็เกิดปัญหาขึ้นกับฐานข้อมูล คือ โปรแกรมจะสร้างฐานข้อมูลอยู่นาน และบางครั้งก็ไม่สำเร็จ ทำให้เกิด error ต่างๆตามมา ผมก็ลบฐานข้อมูลทิ้งแล้ว setup ใหม่อยู่หลายรอบ ก็ได้บ้างไม่ได้บ้าง ครั้งที่ได้ เมื่อใช้งานไปสักพัก ระบบก็รวน เกิด error ต่างๆตามมาอีก ผมจึงคิดว่า ปัญหาน่าจะเป็นที่ตัว Derby ที่เป็น database server ซึ่งอาจจะไม่เหมาะกับโปรแกรมใหญ่ๆอย่าง RTC นี้ ซึ่งโปรแกรมนี้สามารถใช้งานร่วมกับ database server ได้หลายยี่ห้อ เช่น Oracle, Microsoft SQL และ DB2 และผมคิดว่า ฐานข้อมูลของ IBM น่าจะใช้งานร่วมกับโปรแกรมของ IBM ได้ดี ผมจึงเลือกเอา DB2 Express-C มาลง ซึ่ง IBM ใจดีให้ใช้ฟรีอีกด้วย แต่ผมเองก็ไม่เคยใช้งาน DB2 มาก่อน ก็เลยต้องเสียเวลาศึกษาวิธีการติดตั้งและใช้งานอยู่พักใหญ่ เสียเวลาไปอีกเป็นสัปดาห์ ก็ติดตั้งและ setup ได้บ้างไม่ได้บ้างเหมือนเคย

ก็คิดว่าอาจจะเป็นปัญหาที่ Java คือ โปรแกรมนี้ใช้ JRE ของ IBM เอง และทุกครั้งที่ shutdown server ก็มักจะมีข้อความ stack overflow โผล่มาให้เห็นทุกครั้ง ผมจึงพยายามเปลี่ยนให้ RTC มาใช้ JRE ของ Sun แทนโดยเข้าไปแก้ไข script ตอน startup server แต่ผลลัพธ์ที่ได้คือ โปรแกรมรันได้ แต่ไม่ตอบสนองต่อ browser เลย ผมก็พยายามอยู่หลายวิธี จนผ่านไปเดือนกว่าๆ จนผมแทบจะหมดความอดทน กำลังคิดว่า ถ้ายังแก้ปัญหาไม่ได้ คงต้องหาโปรแกรมตัวอื่นมาใช้แทนซะแล้ว แต่ก็น่าเสียดายอยู่ เพราะโปรแกรมของ IBM ตัวนี้ มีชื่อเสียงมาก มีความสามารถสูง และทำได้หลายอย่าง

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

ปัญหานี้ความจริงแล้ว ผมก็ได้ทำตามขั้นตอนการติดตั้งที่เขาบอกไว้แล้ว คือ เนื่องจากโปรแกรมจะเปิดไฟล์เป็นจำนวนมาก และโดยปกติแล้ว Linux จะตั้งค่าจำนวนไฟล์ที่เปิดได้ไว้ที่ 1024 ซึ่งก็มากโขอยู่ แต่ตามคู่มือบอกว่า ให้ตั้งไว้เป็น 65536 โดยให้ไปแก้ไขที่ /etc/security/limits.conf และสามารถตรวจสอบจำนวนไฟล์ที่จำกัดได้จากคำสั่ง ulimit -n ซึ่งจะได้ค่า 65536 กลับมา แสดงว่าเรากำหนดไว้ถูกต้องแล้ว และก็ไม่น่าจะมีปัญหาอะไร

แต่...ปัญหาก็คือ ทุกๆครั้งที่ผมจะ start server ผมก็จะเปลี่ยนไปเป็น root ด้วยคำสั่ง sudo su และผมก็ไม่เคยเอะใจเลยว่า มันจะทำให้ ulimit กลับมาเป็น 1024 ทำให้เมื่อโปรแกรมทำงานไปจนถึงขีดจำกัดนี้ มันก็ทำงานต่อไม่ได้ ทำให้เกิด error ต่างๆแบบ random ไม่แน่นอน สร้างปัญหาปวดหัวแบบไม่ซ้ำรูปแบบได้ตลอดเวลา สุดท้าย ผมก็เลยต้องเพิ่มคำสั่ง ulimit -n 65536 เข้าไปใน startup script เพื่อแก้ปัญหานี้ แล้วทุกอย่างก็ทำงานได้อย่างราบรื่น เฮ้อ...

หลังจากแก้ปัญหาได้แล้ว ผมก็เลยโพสปัญหาเข้าไปที่ Jazz Forum ปรากฏว่า มีคนพบปัญหานี้มาแล้วเช่นกัน ตั้งแต่เมื่อเดือนกุมภาพันธ์ และมีข้อแนะนำ เฉพาะสำหรับ Ubuntu ว่า มีปัญหาการใช้เครื่องหมาย * ในไฟล์  /etc/security/limits.conf ที่เดิมนั้นคู่มือแนะนำให้ใช้ * แทน user ทุกๆคน แต่สำหรับบน Ubuntu (หรือไม่แน่ใจว่าเป็นกับ Debian ด้วยหรือเปล่า) จะไม่มีผลต่อ root

วันจันทร์ที่ 4 กรกฎาคม พ.ศ. 2554

การใช้ VLC เป็น Screen Recorder

หลายๆคนคงจะเคยได้ยินชื่อ โปรแกรม Camtasia กันมาบ้างแล้ว มันก็คือโปรแกรมที่จะช่วยให้เราสามารถบันทึกการเปลี่ยนแปลงต่างๆบนจอภาพของ เราเก็บไว้เป็นวีดีโอไฟล์ได้ หรือที่เรียกว่า Screen Recording ซึ่งโปรแกรม Camtasia นี้ ส่วนใหญ่ที่ผมเห็นมีใช้กัน ก็ใช้กันอย่างผิดกฏหมาย ผมเองก็อยากจะใช้เหมือนกันนะ แต่เมื่อนึกถึงความจำเป็น แลกกับที่จะต้องละเมิดลิขสิทธิ์ ผมก็ได้ข้อสรุปว่า ยังไม่จำเป็น เมื่อถึงเวลาที่จะต้องทำ presentation ผมก็ทำแบบ Capture Screen มาแทน ซึ่งก็ใช้ได้ในระดับหนึ่ง

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

ข้อดีของการใช้โปรแกรม VLC คือ
  1. เป็น Open Source สามารถดาวโหลดมาใช้งานได้ฟรี
  2. ใช้งานได้ทั้งบน Windows, Mac และ Linux (บนมือถือ Android ก็มี แต่น่าจะเป็น Player อย่างเดียว, หรือเปล่า?)
  3. ใช้เป็นได้ทั้ง Player และ Recorder
  4. สามารถบันทึกวีดีโอไฟล์ได้หลายแบบ
  5. มี Codec รองรับการเข้ารหัสหลายแบบ
  6. ฯลฯ

สำหรับการบันทึกวีดีโอของ Screen แบบง่ายที่สุดคือ
  1. เลือกเมนู Media/Streaming หรือกด Ctrl+S จะเปิดหน้าต่างของ Media
  2. เลือก Capture Device/Capture Mode เป็น Desktop
  3. กำหนด Frame rate ว่าจะให้บันทึกกี่ Frame ต่อวินาที
  4. กดปุ่ม Stream จะเข้าสู่หน้าถัดไป
  5. กดปุ่ม Next เข้าสู่หน้ากำหนดปลายทาง (New destination) ให้เลือกเป็น File แล้วกด Add
  6. เพิ่มชื่อไฟล์เสร็จแล้วให้กด Next จะเข้าสู่หน้าให้เลือกวิธีการเข้ารหัส เมื่อเลือกเสร็จแล้วก็กด Next
  7. เข้าสู่หน้าสุดท้ายที่จะให้กำหนด Option ซึ่งไม่จำเป็นต้องตั้งค่าอะไร
  8. กดปุ่ม Stream จะเสร็จสิ้นการตั้งค่า และเริ่มการบันทึกวีดีโอ
  9. เมื่อบันทึกเสร็จ ก็กดปุ่ม Stop เป็นอันเสร็จสิ้นการบันทึกวีดีโอ
สำหรับวิธีง่ายที่สุดนี้ จะบันทึกเฉพาะภาพของ Screen เท่านั้น จะไม่มีเสียง หากต้องการให้มีการบันทึกเสียงด้วย จะต้องเลือก Capture Mode ในข้อ 2 เป็น DirectShow (สำหรับบน Windows) หรือ Video for Linux/Video for Linux 2 (สำหรับ Linux)

สำหรับการใช้ DirectShow นั้น ปกติแล้ว เราจะพบว่า Video Device มีให้เลือกเพียง Default กับ None ซึ่งไม่ว่าจะเลือกอะไร ก็จะไม่สามารถบันทึกภาพจาก Screen ได้ เราจะต้องติดตั้งโปรแกรมที่ทำงานเป็น Video Device ที่ Capture ภาพจาก Screen มาให้ DirectShow ได้ ซึ่งเท่าที่หาข้อมูลมา พบว่ามีคนแนะนำ VH Screen Capture ซึ่งใช้งานได้ แต่จะมีโลโก้ของบริษัทแปะไว้ในภาพตลอด สุดท้ายแล้ว ที่ใช้งานได้และไม่มีโลโก้ติดอยู่ก็คือ UScreenCapture

ถ้า ติดตั้ง UScreenCapture เสร็จเรียบร้อยแล้ว ตอนที่เราเลือก Video Device จะต้องมีชื่อ UScreenCapture ปรากฏให้เลือกได้ จากนั้นก็กำหนดค่าต่างๆตามที่เราต้องการ

การทำ Automatic Sync ข้อมูลบน Ubuntu

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

วัน นี้ผมก็เลยอยากเสนอ การ Sync ข้อมูลของเราไปเก็บไว้ในที่ของเราเอง เช่น ผมมีเครื่อง Notebook และ Desktop ใช้งานกันอยู่ประจำ และจะต้องมีการ copy ข้อมูลกันอยู่ตลอด ปกติผมก็ใช้โปรแกรมช่วย copy อย่าง FileZilla ซึ่งเป็นโปรแกรม Open Source มีใช้งานได้ทั้งบน Linux และ Windows ก็สะดวกดีครับ หรืออีกโปรแกรมหนึ่งที่ผู้ใช้ Linux นิยมกันมาก นั่นก็คือ rsync หรือ Grsync (เป็น Gnome GUI) น่าใช้ไม่แพ้กัน โปรแกรม rsync นี้ เหมาะกับการ Sync ข้อมูลเป็นประจำมากกว่า คือ เราสามารถระบุ folder ที่ต้องการ Sync ระหว่างต้นทางกับปลายทาง แล้วทุกอย่าง rsync จะจัดการให้ ดังนั้น rsync จึงเหมาะกับการทำ backup ประจำนั่นเอง

แต่ เมื่อไม่นานมานี้ ผมมีความต้องการให้เครื่องของผม Sync ข้อมูลกันอัตโนมัติิ ผมก็เลยต้องพึ่งพาความสามารถของ cron หรือ crontab ซึ่งเป็นโปรแกรมที่จะคอยเรียกโปรแกรมมาทำงานตามคำสั่งที่เราตั้งไว้ ตามเวลาที่กำหนด เมื่อเอาคำสั่ง rsync ไปใส่ไว้ใน crontab ตรงๆ ปรากฏว่า ไม่ได้ผลครับ เช็คไป เช็คมา ปรากฏว่า เมื่อเรา remote Sync ไปยังอีกเครื่องหนึ่ง จะมีการถาม username/password แต่ cron เรียก rsync ให้ทำงานอยู่เบื้องหลัง เราก็เลยป้อน username/password ไม่ได้ หรือถ้าได้ เราก็คงไม่มารอป้อน username/password ทุกครั้งเป็นแน่ ไม่อย่างนั้น จะเรียกว่า อัตโนมัติได้ไงล่ะ

ผมก็เลยเดือดร้อน ต้องหาวิธีที่จะให้ rsync ทำงานได้โดยไม่ต้องป้อน username/password ซึ่งก็มีคนแนะนำไว้ใน internet วิธีแรกคือ การเรียก rsync ในโหมด daemon ซึ่งจะต้องมีการ เซ็ตค่าหลายๆอย่าง รวมทั้งการเก็บ password ไว้ในไฟล์ๆหนึ่ง ซึ่งเราจะต้องป้องกันไฟล์นี้ให้ดีๆ ไม่อย่างนั้น อาจจะเป็นช่องโหว่ให้คนอื่นมาเห็น password ของเราได้ แต่ทำไปทำมา สุดท้าย ก็ไม่สำเร็จครับ อาจจะเป็นเพราะ จะต้องเปิด port 873 ไว้เป็น default port ของ rsync daemon หรือการเซ็ตต่า /etc/rsync.conf ไม่ถูกก็แล้วแต่ สรุปว่า ไม่สำเร็จ และไม่น่าจะเป็นทางออกที่ดี เพราะมันค่อนข้างซับซ้อน

อีก วิธีหนึ่งคือการใช้ความสามารถของ ssh ซึ่งเป็น default shell ของ rsync ที่ใช้ในการติดต่อกับ remote อยู่แล้ว โดยเราจะต้องสร้าง key ไว้ใน folder .ssh ของเรา ด้วยโปรแกรม ssh-keygen ดังนี้

ssh-keygen -b 1024 -t rsa -f .ssh/id_rsa

หมายเหตุ ไม่ต้องกำหนด passphrase คือให้กด Enter ผ่านไปเลย

จาก นั้นให้ copy public key ซึ่งก็คือไฟล์ id_rsa.pub ไปไว้ที่ folder .ssh ของเครื่อง remote แต่ให้ตั้งชื่อเป็น authorize_keys เช่น

scp .ssh/id_rsa.pub somchai@x.y.z:~/.ssh/authorized_keys

เมื่อ copy เรียบร้อยแล้ว อาจจะทดลองสั่ง rsync ดู จะพบว่า โปรแกรมสามารถ Sync ได้ทันที โดยไม่ต้องป้อน username/password เช่น

rsync -r -t -p -o -g -v --progress --delete -c -l -z somchai@x.y.z:~/eBooks/ /home/somchai/eBooks/

เมื่อ ทุกอย่างเรียบร้อยดี ไม่มีปัญหา ก็สามารถเอาคำสั่งนี้ไปตั้งเวลาใน cron ได้ โดยสั่ง crontab -e จะปรากฏไฟล์ให้แก้ไข ซึ่งสามารถกำหนด นาที, ชั่วโมง, วันที่, เดือน, วันในสัปดาห์, คำสั่ง ดังนี้

# m h dom mon dow command
0 0 * * * rsync -r -t -p -o -g -v --progress --delete -c -l -z /home/somchai/eBooks/ somchai@x.y.z:~/eBooks/

ตัวอย่างข้างบนนี้ เป็นการตั้งให้ Sync ข้อมูลใน folder eBooks ทุกวัน เวลาเที่ยงคืน

การแปลงภาพไปเป็น SVG ไฟล์ด้วย Open Source Software

การแปลงไฟล์ภาพไปเป็น SVG ที่จะแนะนำนี้ ใช้โปรแกรม 2 ตัวคือ GIMP และ Inkscape

ไฟล์ ภาพที่จะแปลงไปเป็น SVG ควรเป็นภาพขาวดำ เพื่อที่จะสามารถหาเส้นขอบของสิ่งที่ต้องการแปลงไปเป็นเวกเตอร์ได้ง่าย แต่ถ้าไม่ใช่ขาวดำก็ไม่เป็นไร
  1. เริ่มต้นจากการใช้โปรแกรม GIMP เปิดภาพมา
  2. แล้ว ใช้ Select เพื่อเลือกสิ่งที่ต้องการเก็บข้อมูลเวกเตอร์ ในที่นี้เรียกว่า Path โดยปกติก็เลือกจากสี (เมนู Select/By Color, Shift+O)
  3. เมื่อ เลือกสิ่งที่ต้องการแล้ว ก็แปลงไปเป็น Path โดยเลือกเมนู Select/To Path ผลลัพธ์ที่ได้ จะไปปรากฏอยู่ในหน้าต่าง Layers, Channels, Paths ... (เมนู Windows/Layers, Channels, Paths, ...)
  4. ถ้ามองไม่เห็นว่ามันไปอยู่ตรงไหน ก็กดที่ Tab ที่ 3 ที่เป็นรูป จุดและเส้น ดังรูป
  5. เมื่อได้ Path มาแล้ว ก็คลิกเมาส์ปุ่มขวาที่ Path ที่ต้องการ จะมี Popup เมนูขึ้นมา เลือกเมนู Export Path บันทึกไฟล์ไว้
  6. เมื่อ ได้ไฟล์แล้ว ใช้ Inkscape Import ไฟล์เข้าไป เพื่อรวมกับภาพอื่นๆ แต่ก่อนที่จะไปตบแต่งอย่างอื่น ควรจะเลือกเมนู Object/Fill and Stroke... เพื่อระบายสีเข้าไปใน Path เพราะ Path ที่ได้มานั้นเป็นเพียงเส้นขอบของวัตถุที่เราเก็บค่ามา
สุดท้ายก็บันทึกไฟล์ จะเป็น SVG หรือไฟล์แบบอื่นๆก็ได้ ตามที่ Inkscape สามารถทำได้