แสดงหัวตารางซ้ำ

บันทึกความจำกันอีกตอนหนึ่งเพราะช่วงนี้ต้องใช้ OpenOffice.org (OO.o) อย่างหนักเมื่อก่อนไม่ค่อยได้ใช้มากเท่าไหร่นักอย่างมากก็พิมพ์งานนิดหน่อย แต่ช่วงนี้เริ่มต้องใช้รูปแบบที่ซับซ้อนขึ้น ตอนนี้กว่าจะหาเจอก็นานอยู่เหมือนกัน หรืออีกเหตุผลหนึ่งก็เพราะไม่คุ้นกับ OO.o เท่าไหร่นัก

ข้อมูลปริมาณมาก

รูปที่ 1: ข้อมูลปริมาณมาก


เมื่อข้อมูลมีความยาวเกินกว่า 1 หน้า

รูปที่ 2: เมื่อข้อมูลมีความยาวเกินกว่า 1 หน้า

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

Table

รูปที่ 3: Table


Table > Table Properties...

รูปที่ 4: Table > Table Properties...

ดังนั้นวิธีแก้ไขที่เจอก็คือกำหนดให้แสดงหัวตารางซ้ำ สามารถเข้าไปกำหนดค่าได้ 2 วิธีคือ 1 เมื่อคลิ้กที่ตารางจะมีแถบเครื่องมือ Table ดังเช่นรูปที่ 3 จากนั้นคลิ้กที่ปุ่มที่อยู่ในกรอบสีแดง และวิธีที่ 2 คือจากเมนู Table เลือก Table Properties... ดังรูปที่ 4

Table Format | Table Flow > Repeat Heading

รูปที่ 5: Table Format | Table Flow > Repeat Heading

จะได้หน้าต่าง Table Format ดังรูปที่ 5 จากนั้นเลือกที่แถบ Table Flow และคลิ้กเลือกที่ Repeat Heading และเปลี่ยนจำนวนแถวของหัวตารางที่ต้องการให้แสดงซ้ำตามต้องการจากนั้นจะได้ตารางดังรูปที่ 6 ซึ่งหากแก้ไขหัวตารางในรูปที่ 6 นี้ก็จะส่งผลไปยังหัวตารางที่เห็นในรูปที่ 1 ด้วย

Repeat Table Heading

รูปที่ 6: Repeat Table Heading

ฟังก์ชั่นนี้เป็นฟังก์ชั่นพื้นฐานที่พบได้ในโปรแกรม Word Processing ทั่วไป ทั้ง MS Word, และ Pages ครับ

โปรแกรมที่ใช้: OpenOffice.org 3.1.1 Writer

Apache Ant in Actions I – Overview

ช่วงนี้ได้มีโอกาสจับงาน Java ที่ต้องมี Source ไฟล์มาเกี่ยวข้องด้วยเยอะ ไอ้การจะมานั่งจัดการไฟล์จำนวนมากด้วยมือก็เห็นจะไม่ใช่เรื่องดีเท่าไหร่ งานนี้ก็เลยต้องอาศัย Build Tools มาช่วยงานสักหน่อย ก็ได้แค่โปรแกรมที่ชื่อว่า Apache Ant หรือที่รู้จักกันดีและเรียกกันสั้นๆ ว่า Ant ตัวนี้สักหน่อย
Ant เป็นเครื่องมือที่ช่วยจัดการงานต่างๆ ที่เราต้องทำเข้าไว้ด้วยกัน ในรูปแบบของชุดคำสั่ง เทียบได้กับ make ใน unix ซึ่งข้อดีของ Ant คือ มันเป็น OS Independent ที่เขียนขึ้นมาด้วย Java ทำให้เขียนโปรแกรมแล้วนำคำสั่งชุดคำสั่งนี้ไปทำงานหรือแก้ไขที่ได้ก็ได้โดยให้ผลลัพธ์ (จาก Ant) เช่นเดียวกัน

Build File

คือชุดคำสั่งของ Ant ที่เราเขียนและกำหนดไว้เพื่อให้ Ant ทำตาม อยู่ในไฟล์ ‘build.xml’ (เป็นค่า default) จะเรียกว่า build file มีโครงสร้างตามรูปด้านล่าง ภายใน build file ดังกล่าวจะหมายถึง 1 โปรเจ็คที่เรากำลังสนใจอยู่ ก่อนที่จะทำงาน เราอาจจะสร้างประกาศค่าต่างๆ ที่จำเป็นต้องใช้ในการทำงานไว้ในส่วนของ Property (Properties) จากนั้นจึงค่อยสร้างเป้าหมาย (target) สำหรับการทำงานไว้ เป็นกลุ่มๆ ส่วนตัวผมจะแบ่งไว้ให้เป็นเป้าหมายที่ย่อยที่สุดเท่าที่จะทำได้ เช่น สร้างโฟลเดอร์, โหลด dependency ไฟล์, compile ซอร์สโค้ด, สร้าง jar ไฟล์ และ deploy ลง Server เป็นต้น เพื่อให้ง่ายต่อการจัดการ งาน (Task) ที่ต้องทำภายใน Target อีกที ส่วนตัวแล้วชอบวางลำดับของ Target ไว้ตามลำดับการทำงานจากบนลงล่างเพื่อให้ง่ายตอนเขียน แต่ลำดับของ Target ภายใน build file ไม่มีผลกระทบต่อการทำงานใดๆ ของ Ant เลย แต่ Ant จะเริ่มการทำงานจาก default target ที่ระบุไว้ใน attribute ของแท็ก project

Apache Ant's Build File Structure

Apache Ant's Build File Structure

การทำงานของ Ant หากไม่ระบุ target ที่ต้องการ Ant จะเริ่มทำงานจากค่า default ในแท็ก project โดยก่อนการทำงานของ target ดังกล่าว Ant จะตรวจสอบว่า target นี้มี target อื่นที่ต้องทำก่อนหน้าหรือไม่ (Dependency Target – depends) เช่น หากต้องการสร้าง jar ย่อมต้องใช้ class ไฟล์ ที่ได้จากการ compile ซอร์สโค้ดล่าสุดซะก่อน หากเราระบุ target ดังกล่าวไว้ Ant จะทำหน้าที่ไปตรวจสอบว่าซอร์สโค้ดดังกล่าวถูก compile แล้วหรือยัง หากมีไฟล์ที่เปลี่ยนแปลงและยังไม่ได้ compile ก็จะทำให้อัตโนมัติ

หลังจากเสร็จการทำงานใน Dependency Target แล้ว Ant ก็จะเริ่มทำตาม Task ที่ระบุไว้ภายใน Target จากบนลงล่างตามลำดับ ซึ่งภายใน Target อาจจะใช้ Ant Call (<antcall … ) เพื่อเรียกการทำงานของ Target อื่นๆ ที่อยู่ภายใน build file ก็ได้ตามต้องการ

Official Site: http://ant.apache.org
Manual: http://ant.apache.org/manual/index.html

Software Architecture: Test Case Writing

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

แก้ไข 2009.11.09: ตอนแรกอัพโหลดให้เป็นไฟล์ของ Keynote แต่เนื่องจากมีปัญหาเรื่อง Transition ของ สไลด์นิดหน่อยจึงเปลี่ยนเป็น PDF แทน แต่ถ้าใครต้องการไฟล์ที่เป็น Keynote ก็ยินดีให้ครับ :) (goto.champ [at] gmail [dot] com)

Create Bootable Live USB Drive for Mac OS X

1. ดาวน์โหลด image ไฟล์ ที่ต้องการ (สำหรับผมคือubuntu-9.10-netbook-remix-i386.iso)
2. เปิด Terminal ขึ้นมา
3. สั่งแสดงรายการของ device ทั้งหมดที่เชื่อมต่ออยู่กับเครื่อง ด้วยคำสั่ง

	# diskutil list

ผลที่ได้: จะบอกว่าขณะนี้มี device ชื่อว่า Potter ขนาด 2GB เชื่อมต่ออยู่ (ข้อมูลจะเป็นลักษณะเดียวกันแต่จะไม่เหมือนกันทุกอย่างขึ้นอยู่กับว่าเครื่องคอมพิวเตอร์เครื่องนั้นมี device เชื่อมต่ออยู่มากแค่ไหน)

:
/dev/disk2
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *2.0 GB     disk2
   1:                 DOS_FAT_32 POTTER                  2.0 GB     disk2s1

4. แต่ตอนนี้ยังเขียน image ลงไปใน flash drive ไม่ได้ จำเป็นต้องตัดการเชื่อมต่อ (unmount) ซะก่อนด้วยคำสั่ง ในที่นี้คือ /dev/disk2 เพราะเป็น flash drive ที่เราต้องการจะเขียนข้อมูลลงไป

	# diskutil unmountDisk /dev/disk2

5. เริ่มต้น image ไฟล์ลงไปใน flash drive ด้วยคำสั่ง

	# dd if=/path/to/image/file.iso of=/dev/disk2 bs=1m

/dev/disk2 ค่านี่ได้มาจาก ข้อ 3.

6. รอพักใหญ่ๆ เราจะได้ค่า 3 บรรทัดนี้ออกมา เป็นข้อมูลที่สรุป input และ output ของคำสั่ง dd ที่เราใช้ในข้อ 7. ถ้ามันเท่ากันก็นั่งยิ้มเลยเลยครับ

	680+1 records in
	680+1 records out
	713887744 bytes transferred in 792.628728 secs (900658 bytes/sec)

7. สุดท้ายก็ลองถอด flash drive ออกแล้วจะเห็น device ที่ชื่อว่า “Ubuntu-Netbook-R” ขึ้นมาใน Desktop ครับ เป็นอันเสร็จพิธี

ข้อมูลจาก: 4 Ways to Create Bootable Live USB Drives (For Windows, Linux and OS X)

ลองชิม ‘Matcha’

เรื่องของเรื่องก็คือว่าดื่มน้ำชาที่ขายๆ ในบ้านเราก็หลายยี่ห้อมีทั้งชอบและไม่ชอบ แต่อย่างหนึ่งที่เคยบ่นเกี่ยวกับน้ำชาเรื่อยก็คือเรื่อง “น้ำ” ที่เอามาชงน้ำชานี่ล่ะ เพราะน้ำก็เป็นส่วนหนึ่งที่มีผลกับรสของชา เท่าที่ลองชิมมีน้อยรายมากๆ ที่ให้ความสำคัญกับ “น้ำ” ที่เอามาชง (ลองชิมตอนที่ไม่เย็นดูจะได้รสกร่อยของน้ำ) ส่วนวันนี้ที่อยากเขียนก็คือไปเห็นชาใหม่ของ “โออิชิ” ชื่อว่า ‘Matcha’ เลยอยากลองชิมดูซะหน่อยว่าจะเป็นเหมือนที่หวังไว้หรือเปล่า :)

Matcha

Matcha

แรกเห็น : ขวดไฮโซใช้ได้เลยทีเดียว ดูเหมือนจะคุ้มค่ากับราคา “30 บาท” แรกเห็นนึกว่าเป็นขวดแก้วแต่พอลองจับ อ้าวพลาสติกนี่น่าแต่ก็ไม่แปลกครับเป็นการออกแบบ เข้าใจว่าต้องการเน้นความใสของน้ำแร่ในขวด ซึ่งก็ได้ผลนะ ดูสะอาดใช้ได้

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

คำอธิบาย

คำอธิบาย

เริ่มแกะ : ตัวสินค้าไม่มีอะไรมากครับ ประกอบด้วยกัน 2 ส่วนคือ “น้ำแร่” และ “ผงชาเขียว” วิธีดื่มก็คือเอาผงชาที่อยู่ในป้ายที่ห้อยมากับขวดผสมแล้วก็เขย่า เราก็จะได้น้ำชาที่ขายในราคา “30 บาท” เหมือนในรูปด้านล่าง

ชาพร้อมดื่ม

ชาพร้อมดื่ม

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

คะแนน

ออกแบบผลิตภัณฑ์: 4.0/5.0

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

รสชาติ: 3.5/5.0

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

โดยรวม: 4.0/5.0

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

Document Version Control with SVN

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

PDF: Introduce to SVN

Subversion in Actions II

คราวที่แล้วเขียนเกี่ยวกับการใช้ Subversion (svn) เบื่องต้น ได้แก่ การสร้าง Repository, เพิ่มไฟล์เข้าสู่ index ใน working copies (add), และส่งเข้าสู่ Repository (commit) ส่วนตอนนี้ก็จะขอพูดส่วนเกี่ยวกับคำสั่งต่างๆ ที่เอาไว้ติดตามความเคลื่อนไหว และการเปลี่ยนแปลงของ Repository ครับ

ข้อมูลประจำรุ่น (log)

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

REVISION_NO | USER_NAME | DATE_TIME | LINE_CHANGED

MESSAGE_LOG

ตัวอย่างเช่น

  $ svn log file:///Users/sitdh/Repository/helloSVNServer
  ------------------------------------------------------------------------
  r2 | sitdh | 2009-09-10 00:40:52 +0700 (Thu, 10 Sep 2009) | 1 line

  Create Project
  ------------------------------------------------------------------------
  r1 | sitdh | 2009-09-09 21:56:38 +0700 (Wed, 09 Sep 2009) | 1 line

  test
  ------------------------------------------------------------------------

คำอธิบาย:

  • บรรทัดที่ 03 และ 07 คือ ข้อมูลประจำรุ่น
  • บรรทัดที่ 05 และ 09 คือ คำอธิบายการเปลี่ยนแปลงที่ผู้ commit เขียนอธิบายไว้

หมายเหตุ: ข้อมูลดังกล่าวเป็นข้อมูลที่ได้จาก Repository เนื่องจากเราระบุพาธไว้ด้านหลัง หากให้คำสั่ง svn log จะเอา log ที่อยู่ใน Working Copies มาแสดงแทน ซึ่งข้อมูลที่ได้อาจไม่ตรงกับ Repository วิธีแก้คือใช้คำสั่ง update เพื่อปรับปรุงข้อมูลให้ตรงกัน (Synchonize – sync) ระหว่าง Working Copies และ Repository

  $ svn update file:///User/sitdh/Repository/helloSVNServer
  At revision 3.

คำอธิบาย:

  • บรรทัดที่ 01 ใช้คำสั่งเพื่อ sync ข้อมูล หามีข้อมูลที่ไม่ตรงกับ Repository จะแสดงรายการเปลี่ยนแปลงด้านล้าง
  • บรรทัดที่ 02 เป็นบรรทัดที่บอก Revision ล่าสุดที่อยู่ใน Repository (HEAD Revision)

หาความแตกต่างระหว่างเวอร์ชั่น (diff)

ก่อนอื่นต้องทบทวนก่อนว่าในตัวอย่างของ blog ที่แล้วได้สร้างข้อมูลตัวอย่างและส่งเข้า Repository เรียบร้อยแล้ว (Revision 3 หรือ r3) จากนั้นได้แก้ไขข้อมูลในไฟล์ ‘index.php’ เล็กน้อย และ commit เข้าไปยัง Repository เรียบร้อยแล้ว (Revision 4 หรือ r4) ดังนั้นถ้าอยากรู้ว่าระหว่าง r3 และ r4 มีความแตกต่างตรงไหนบ้าง คำสั่งที่ช่วยได้ก็คือ diff ดังนี้

$ svn diff -r 3:4
Index: index.php
===================================================================
--- index.php	(revision 3)
+++ index.php	(revision 4)
@@ -1,3 +1,4 @@
-hello, world

\n"; + echo "

hope you like it

"; ?>

คำอธิบาย:

  • บรรทัดที่ 02 Index จะบอกว่าตอนนี้เปรียบเทียบไฟล์ไหนอยู่
  • บรรทัดที่ 04 – 05 กำหนดเครื่องหมายสำหรับ r3 แทนด้วย ‘-’ และ r4 แทนด้วย ‘+’ โดย ใช้บอกว่าบรรทัดไหนหายไปจาก r4 (-) และเพิ่มเข้ามาใน r4 (+) ถ้าบรรทัดไหนไม่เปลี่ยนแปลงก็จะไม่มีเครื่องหมายนำหน้า
  • บรรทัดที่ 07 – 08 คือ บรรทัดที่มีอยู่ใน r3 แต่หายไปจาก r4 (เครื่องหมาย - นำหน้า)
  • บรรทัดที่ 09 – 11 คือ บรรทัดที่เพิ่มเข้ามาใน r4
  • บรรทัดที่ 12 เป็นบรรทัดที่ไม่เปลี่ยนแปลง