วันพุธที่ 27 สิงหาคม พ.ศ. 2551

อูบุนตู: การรวมไฟล์ PDF โดยไม่ต้องพึ่ง Adobe Acrobat

เราสามารถใช้ Ghostscript ช่วยได้ดังตัวอย่าง

$ gs -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=output.pdf -dBATCH 1.pdf 2.pdf 3.pdf

ไฟล์ 1.pdf, 2.pdf, 3.pdf ก็คือไฟล์ที่จะนำมารวม
ไฟล์ output.pdf คือผลลัพธ์ของการรวม

วันพฤหัสบดีที่ 21 สิงหาคม พ.ศ. 2551

Ubuntu Linux: รายชื่อดิสก์ที่สามารถเมาท์ได้

ในบางครั้งเราอาจจะเจอปัญหาไม่สามารถเมาท์อุปกรณ์โดยอัตโนมัติได้ เราจึงต้องใช้วิธีการเมาท์ด้วยตนเอง แต่ว่าเราจะต้องรู้ก่อนว่าเราจะเมาท์อุปกรณ์อะไร แล้วก็เป็นไฟล์ฟอร์แมตชนิดไหน ให้ เราใช้คำสั่ง sudo fdisk -l ก็จะได้ลิสต์ของอุปกรณ์ก่อนที่จะทำการเมาท์
Disk /dev/sdb: 400.0 GB, 400088456704 bytes
255 heads, 63 sectors/track, 48641 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x8445b8d2

Device Boot Start End Blocks Id System
/dev/sdb1 1 12748 102398278+ 7 HPFS/NTFS
/dev/sdb2 12749 28046 122881185 7 HPFS/NTFS
/dev/sdb3 28047 48641 165429337+ 7 HPFS/NTFS

$ mount /dev/sdb1 /media/sdb1

วันพฤหัสบดีที่ 14 สิงหาคม พ.ศ. 2551

Java Programming: For-each Loop

For-each Loop

วัตถุประสงค์

ลูป for ได้รับการเพิ่มขีดความสามารถมาตั้งแต่จาวา ๕ ทำให้การวนรอบของอารเรย์ และคอลเลคชั่นชนิดอื่น ๆ ทำได้สะดวกสบายขึ้นอีก สำหรับ for ลักษณะใหม่นี้เราเรียกว่า enhanced for หรือ for-each (ในภาษา python และภาษาตัวใหม่ ๆ ก็มีเหมือนกันและมันก็ถูกเรียกว่า for each) หรือบางทีถูกเรียกว่าลูป for-in

รูปแบบมาตรฐาน

ตารางข้างล่างเป็นตัวอย่างการใช้งานในรูปแบบของอารเรย์ และ iterator ซึ่งทั้งสองกรณีจะต้องมีตัวแปรเพิ่มอีกหนึ่งตัวใช้แทน index ของลูป for ชนิดเดิม

For-each loopEquivalent for loop
for (type var : arr) {
body-of-loop
}
for (int i = 0; i < arr.length; i++) {
type var = arr[i];
body-of-loop
}
for (type var : coll) {
body-of-loop
}
for (Iterator<type> iter = coll.iterator(); iter.hasNext(); ) {
type var = iter.next();
body-of-loop
}

ตัวอย่าง การรวมค่าทั้งหมดในอารเรย์

นี่คือตัวอย่างลูปทั้งชนิด for-each และ for ลูปปกติ

double[] ar = {1.2, 3.0, 0.8};
int sum = 0;
for (double d : ar) { // d gets successively each value in ar.
sum += d;
}
double[] ar = {1.2, 3.0, 0.8};
int sum = 0;
for (int i = 0; i <> 3; i++) {
sum += ar[i];
}

ที่มา http://www.leepoint.net/notes-java/flow/loops/foreach.html

วันพุธที่ 13 สิงหาคม พ.ศ. 2551

Java Programming: ความแตกต่างของการเขียนโปรแกรมเชิงโครงสร้าง และโปรแกรมเชิงวัตถุ (2)



ถ้าเปรียบเทียบการเขียนโปรแกรมเชิงโครงสร้างกับการเขียนโปรแกรมเชิงวัตถุนั้น ในการแก้ปัญหาเดียวกันจะมองกันคนละอย่างกัน เช่น ถ้าจะเขียนโปรแกรมสำหรับหาค่าเกรดเฉลี่ยของนักศึกษาคนหนึ่ง สำหรับการเขียนโปรแกรมเชิงโครงสร้างนั้นก็จะพยายามคิดหาตัวแปรที่จะมาใช้เพื่อเก็บข้อมูล เช่น ตัวแปรสตริงให้เก็บชื่อนักศึกษา และวิชาเรียน ตัวแปรจำนวนเต็มใช้เก็บเกรดแต่ละวิชาที่เรียน ตัวแปรดับเบิ้ลให้เก็บค่าของผลลัพธ์เกรดเฉลี่ย เป็นต้น จากนั้นก็หาฟังก์ชันเพื่อที่จะนำตัวแปรเหล่านั้นมาประมวลผลให้ได้ผลลัพธ์ตามต้องการ แต่สำหรับการเขียนโปรแกรมเชิงวัตถุนั้นจะคิดถึงตัวตนของวัตถุก่อน เช่น นักศึกษา วิชาเรียนแต่ละวิชา จากนั้นก็สร้างคลาส(Class)จากการวิเคราะห์และกำหนดคุณลักษณะ(Attribute) และพฤติกรรม(Behavior)ของวัตถุนั้น ๆ เมื่อครบถ้วนแล้วจึงสร้างวัตถุที่เกี่ยวข้องและเรียกใช้งานเมธอดเพื่อให้ทำงานเสร็จสิ้นตามจุดประสงค์

วันอังคารที่ 12 สิงหาคม พ.ศ. 2551

Java Programming: ความแตกต่างของการเขียนโปรแกรมเชิงโครงสร้าง และโปรแกรมเชิงวัตถุ


การเขียนโปรแกรมเชิงโครงสร้าง (Structured Programming) นั้นจะแยกส่วนของข้อมูลจากฟังก์ชันอย่างชัดเจน ซึ่งการแยกข้อมูลจากฟังก์ชันนั้นมักจะมีผลให้เกิดความสับสน และค่อนข้างยากในการปรับปรุงแก้ไขโดยเฉพาะกับโปรแกรมขนาดใหญ่

การเขียนโปรแกรมเชิงวัตถุ (Object Oriented Programming) จะเขียนโปรแกรมโดยอ้างอิงโมเดลวัตถุในโลกที่มีอยู่จริงในการแก้ปัญหา เช่น รถยนต์ บัญชีธนาคาร หรือสุนัข แปลงให้อยู่ในรูปแบบโค๊ดภาษา ซึ่งบางส่วนอาจจะไม่ถูกเรียกใช้งานก็ได้

การเขียนโปรแกรมเชิงโครงสร้างเน้นการแปลงสิ่งที่มีอยู่จริงให้อยู่ในกฏเกณฑ์ของโปรแกรมภาษา แต่การเขียนโปรแกรมเชิงวัตถุนั้นเน้นการแปลงให้โปรแกรมภาษาอยู่ในรูปแบบของสิ่งที่มีอยู่จริง

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

การเขียนโปรแกรมเชิงวัตถุจะมองรถยนต์คือการรวมกันของกลุ่มพฤติกรรม (behaviors) และสถานะต่าง ๆ ของรถคันนั้น (values of data) การรวมตัวระหว่างตัวแปรสถานะ และพฤติกรรมจะได้ผลลัพธ์เป็นวัตถุ (object) เราสามารถสร้างวัตถุได้ง่าย ๆ เหมือนกับที่เราสร้างตัวแปรทั่วไป ในโปรแกรมเชิงวัตถุนั้นจะระบุวัตถุที่จะใช้และเรียกใช้งานฟังก์ชันของมันในเวลาใด ๆ ก็ได้

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

Java: จาวาส่งผ่านอาร์กิวเมนต์ด้วยวิธีการคัดลอกค่าเท่านั้น

สำหรับคนที่คุ้นเคยกับภาษา C++ คงจะรู้จักความแตกต่างของ Passed by Reference กับ Passed by Value ในการส่งค่าผ่านอาร์กิวเมนต์ และพารามิเตอร์ของฟังก์ชัน ตัวอย่างง่าย ๆ ที่เรารู้จักคือฟังก์ชัน swap:

โค๊ดโปรแกรม:

public class SwapExample {


public static void main(String[] args) {
Integer num1 = 10;
Integer num2 = 20;
System.out.println("before swap: "+num1+","+num2);
swap(num1, num2);
System.out.println("after swap: "+num1+","+num2);

}

public static void swap(Integer a, Integer b)
{
Integer temp = a;
a = b;
b = temp;
System.out.println("inside swap: "+a+","+b);
}

}

ผลลัพธ์คือ:

before swap: 10,20
inside swap: 20,10
after swap: 10,20


ONLY PASSED BY VALUE !!!!