จากผู้ใช้สู่ผู้สร้าง
- ถ้าใช้ Linux เครือข่าย Debian เช่น Ubuntu, Kubuntu การติดตั้งโปรแกรม ไลบรารีต่างๆ คงคุ้นเคยกับ package ที่มี extension เป็น deb กันพอสมควร ผมมีโปรแกรมที่พัฒนาด้วย lazarus อยู่หลายโปรแกรม บางโปรแกรมพอร์ทมาจากเดลไฟ บางโปรแกรมพัฒนาเริ่มต้นด้วย lazarus โดยตรง
- เวลาต้องการนำไปติดตั้งเครื่องอื่นค่อนข้างยุ่งยาก เพราะต้อง copy ไฟล์ไบนารีไปวางไว้ที่เครื่องปลายทางโดยตรง ปัญหาอีกอย่างคือเครื่องปลายทางไม่ได้ติดตั้งไลบรารีที่โปรแกรมต้องการ
- เรามาลองสร้าง Debian Package ก่อนหน้านี้ผมกลัวว่าจะมีอะไรที่ยุ่งยาก เมื่อลองแล้วง่ายกว่าที่คิด ใช้เวลาลองผิดลองถูกประมาณสักหนึ่งชั่วโมงก็สามารถนำไปติดตั้งได้แล้ว
ข้อกำหนด (Debian Package Policy)
- ข้อกำหนดหรือนโยบายเป็นขอบเขตว่าถ้าจะสร้าง debian package จะต้องทำอะไรบ้างที่อยู่ในกรอบนี้หาอ่านได้ที่นี่ บอกกันตามตรงว่าผมดูผ่านๆ ถ้าจะอ่านกันจริงๆตอนนี้คงไม่ได้มาเขียนโพสต์นี้หรอก คงเกิดอาการกล้าๆกลัวๆ จะทำได้หรือปล่าว
- ที่จำเป็นต้องมีกรอบและกติกา ก็เพราะเวลาทำการติดตั้ง debian จะได้หาสิ่งที่ต้องการได้ถูกเช่นใน package ของเราจะมีโปรแกรมที่เป็นไฟล์ไบนารี มีไฟล์ icon ที่จะแสดงบนเมนูหรือ desktop มีชื่อโปรแกรมที่กำกับใต้ล่าง icon ผู้พัฒนาคือใคร เป็นโปรแกรมรุ่นที่เท่าไหร่ ต้องการไลบรารีอะไร (Dependency)
ขั้นตอนการสร้าง Debian Package อย่างง่าย
1.สร้างไดเรคทอรีหลัก
- ผมสร้างไดเรคทอรีหลักใน Home ชื่อ MyDebianPackages เมื่อเสร็จแล้วเราจะสร้างไดเรคทอรีย่อยๆเพื่อแยกเก็บแต่ละโปรแกรม ถ้าไม่ใช้ command line ก็ Nautilus นี่แหละง่ายๆ
- สร้างไดเรคทอรีย่อยแยกตามโปรแกรม ตัวอย่างผมสร้างไว้ 3 ไดเรคทอรี
- ผมยกตัวอย่างให้เห็นความแตกต่างโปรแกรม Traverse Pro ต้องการไลบรารีพื้นฐานคือ GTK2 ส่วนอีกสองโปรแกรมคือ AutocardMaker และ Autocheckpoint นอกเหนือจากไลบรารี GTK2 แล้วต้องการไลบรารีของฐานข้อมูล Firebird
2.สร้างไดเรคทอรีรองตามรุ่นของโปรแกรม
- เราจะสร้างไดเรคทอรีย่อยลงไปอีกแต่ละโปรแกรมเพื่อเก็บ package แยกเป็นเวอร์ชั่น ตัวอย่าง Traverse Pro ของผมตอนนี้รุ่น 2.0.1 โปรแกรม Autocheckpoint รุ่น 1.2.20
3.สร้างไดเรคทอรีย่อยตามข้อกำหนด
- ต่อจากนี้ไดเรคทอรีย่อยที่จะสร้างเพิ่มไปอีกจะต้องอยู่ในข้อกำหนดของ Debian Package ชื่อไดเรคทอรีจะต้องตรงกับที่ Debian ต้องการ ตัวอย่างในไดเรคทอรี /home/priabroy/MyDebianPackages/ สร้างไดเรคทอรีดังนี้
DEBIAN
usr
- ไดเรคทอรี usr ที่เราสร้างขึ้นมาจะจำลองไดเรคทอรีที่โปรแกรมเราตอนติดตั้งจริงๆว่าจะอยู่ที่ไหนในโครงสร้างไฟล์ของลีนุกซ์ อย่างผมตั้งใจว่าจะให้โปรแกรมไปอยู่ที่ /usr/bin ผมก็จะสร้างไดเรคทอรี bin ซ้อนอยู่ใน usr ดูรูปด้านล่างประกอบอีกที
- ไดเรคทอรี DEBIAN (ตัวใหญ่) ไม่มีไดเรคทอรีย่อย แต่จะมีไฟล์สำคัญสองไฟล์ซึ่งจะยังไม่พูดในตอนนี้ มาดูไดเรคทอรี usr กันต่อ ที่ผมกล่าวไปแล้วคือมีไดเรคทอรีย่อยชื่อ bin สร้างไดเรคทอรีอีกอันคือ share และสร้างไดเรคทอรีย่อยอีกสองไดเรคทอรีคือ applications และ pixmaps (ดูรูปด้านบน ด้านซ้ายจะแสดงโครงต้นไม้)
4.Copy ไฟล์และสร้างไฟล์ Desktop Entry
- usr/bin – ทำการ copy ไฟล์โปรแกรมของเราที่ได้ compile & build มาที่นี่
- usr/share/pixmaps – ทำการ copy ไฟล์รูป png เป็น icon โปรแกรมมาไว้ที่นี่
- usr/share/applications – สร้างไฟล์ text มี extension เป็น .desktop ตัวอย่างที่พอจะเทียบเคียงได้คือไฟล์ลิงค์ .lnk ที่อยู่บนวินโดส์นั่นเองที่ได้จากการสร้าง shortcut ใช้ Text Editor สร้างไฟล์ใน Ubuntu ก็ Gedit อย่างตัวอย่างนี้ผมตั้งชื่อ autocheckpoint.desktop เนื้อในพิมพ์ดังนี้
[Desktop Entry]
Name=Autocheckpoint V1.2.20
Comment=Autocheckpoint (Human Resource Management System)
Exec=Autocheckpoint
Icon=autocheckpoint.png
Terminal=false
X-MultipleArgs=false
Type=Application
Categories=Application;Graphics;
StartupNotify=true
MimeType=application/x-autocheckpoint;
X-Ubuntu-Gettext-Domain=app-install-data
- มาดูว่าใน [Desktop Entry] มีส่วนสำคัญอยู่หลายบรรทัดคือ Name เป็นชื่อโปรแกรมใส่เวอร์ชั่นเข้าไปหน่อย ตรง Comment ขยายความโปรแกรมของเรา ตรง Exec สำคัญคือชื่อไฟล์ต้องตรงกับในไดเรคทอรี usr/bin และต่อมาคือ Icon ชื่อต้องตรงกับไฟล์ใน usr/share/pixmaps ตรง Categories โปรแกรมของเราเมื่อติดตั้งแล้วจะไปอยู่ในกลุ่มไหน ซึ่งใน linux กลุ่มโปรแกรมผมคิดว่ายังไม่กว้างพอ ผมเลยจัดให้ไปอยู่ในกลุ่ม Graphics ซึ่งไม่น่าจะใช่ แต่ไม่มีตัวเลือกอื่นดีกว่านี้
5.ตรวจสอบขนาดไดเรคทอรี usr
- ต่อไปจะต้องใช้คำสั่ง command line มาช่วยในการตรวจสอบขนาดของไฟล์ที่อยู่ในไดเรคทอรี usr ผมทำการเปลี่ยนไดเรคทอรีด้วยคำสั่ง cd ไปที่ /home/priabroy/MyDebianPackages/Autocheckpoint/autocheckpoint-1.2.20 สั่งหาขนาดของไฟล์และไดเรคทอรีด้วยคำสั่ง du ดังนี้ ขนาดที่ต้องการเป็น Kilobyte
$ du -ac –apparent-size –block-size=1024 usr
9774 usr/bin/Autocheckpoint
9778 usr/bin
1 usr/share/applications/autocheckpoint.desktop
5 usr/share/applications
4 usr/share/pixmaps/autocheckpoint.png
8 usr/share/pixmaps
17 usr/share
9798 usr
9798 total
- จะเห็นขนาดของไฟล์และไดเรคทอรีเท่ากับ 9798 KB
6.สร้างไฟล์ control ในไดเรคทอรี DEBIAN
- สร้างไฟล์ชื่อ control อยู่ในไดเรคทอรี DEBIAN โดยใช้ text editor
Package: autocheckpoint
Version:1.2.20
Section: graphics
Priority: optional
Architecture: i386
Depends: libgtk2.0-0 (>= 2.0), libgtk2.0-bin (>= 2.0), libfbclient2 (>=2.5)
Installed-Size: 9798
Maintainer: Prajuab Riabroy
Description: Autochekpoint (Human Resource Management System)
- นำขนาด 9798 KB มาใส่ที่ Installed-Size ส่วนที่ยากที่สุดคือ Depends คือไลบรารีที่โปรแกรมเราต้องการ โปรแกรมนี้พัฒนาบน GNome จึงต้องการไลบรารีที่เป็นพื้นฐานคือ GTK2 สมมติฐานคือสามารถนำไปติดตั้งบนลีนุกซ์ที่ใช้ GNome ได้ไม่ว่าจะเป็นดิสโทรอะไร แต่ก็เพิ่มเติมอีกนิดว่าตอนนี้ GNome3 ใช้ GTK3 ดังนั้นการนำโปรแกรมไปติดตั้งบน GNome3 อาจจะต้องดาวน์โหลดไลบรารี GTK2 ด้วย
7.สร้างไฟล์ md5sums ในไดเรคทอรี DEBIAN
- MD5 คือการเข้ารหัสให้กับไฟล์อีกรูปแบบหนึ่ง นิยมนำมาตรวจสอบขนาดของไฟล์ที่ได้จากการดาวน์โหลดว่าขนาดที่ได้รับมาสมบูรณ์หรือไม่ ถ้าไฟล์มีเนื้อหาตรงกับต้นฉบับทุกประการค่า MD5 จะเท่ากันเสมอ ตัวอย่างไฟล์ที่เราจะดาวน์โหลดบาง website จะมีค่า MD5 ใส่ไว้เมื่อเราดาวน์โหลดมาแล้วใช้คำสั่ง md5sum ในลีนุกซ์ตรวจสอบได้ ถ้าค่า MD5 เท่ากันก็แสดงว่าไฟล์ที่ดาวน์โหลดมานั้นสมบูรณ์
- คำสั่ง md5sum จะตรวจได้ทีละไฟล์ซึ่งจะไม่สะดวก ผมแนะนำให้ไปดาวน์โหลดสคริปท์ ของ Nautilus ได้ที่ http://gnome-look.org/content/show.php/show.php?content=69749&vote=good&tan=7008025 ผู้เขียนใช้นามแฝงว่า ofir
- ดาวน์โหลดมาแล้วย้ายไปไว้ที่ ~/.gnome2/nautilus-scripts ทำการเปลี่ยนโหมดเป็นไฟล์ที่รันได้ด้วยคำสั่ง
$sudo chmod +x md5.sh
- ผมใช้ Nautilus ไปที่ไดเรคทอรี /home/priabroy/MyDebianPackages/Autocheckpoint/autocheckpoint-1.2.20 คลิกที่ไดเรคทอรี usr คลิกเมนู File > Scripts จะเห็น script file ที่ติดตั้งเข้าไปคลิกเลือก ตัวสคริปท์จะสร้างไฟล์ชื่อ usr.md5 ให้เราทำการเปลี่ยนชื่อเป็น md5sums จากนั้นย้ายไปอยู่ใต้ในไดเรคทอรี DEBIAN ลองเปิดไฟล์ md5sums ทำการแก้ไขตรงชื่อไดเรคทอรีจากชื่อเต็มเป็นชื่อแบบ relative ดังรูปด้านล่าง
b3c83fe7e929f44cc38af95a38d765e5 usr/bin/Autocheckpoint
f11d86f6ae70aebb762c328499618e18 usr/share/applications/autocheckpoint.desktop
c3d930951fc3de48a65f072a390c08c7 usr/share/pixmaps/autocheckpoint.png
8.สร้าง Package
- มาถึงขั้นตอนสุดท้ายทำการสร้าง Debian Package ด้วยคำสั่ง fakeroot dpkg –build ก่อนอื่นผมเปลี่ยนไดเรคทอรีมาที่ /home/priabroy/MyDebianPackages/Autocheckpoint
- ผมตั้งชื่อ package ว่า autocheckpoint-1.2.20-i386.deb ใช้คำสั่งดังนี้
$fakeroot dpkg –build autocheckpoint-1.2.20 autocheckpoint-1.2.20-i386.deb
- จะได้ package มาพร้อมจะลองไปทดสอบติดตั้ง
ทดลองติดตั้ง
- ถ้าเปิด Nautilus ใช้เมาส์ดับเบิ้ลคลิกบน package ถ้าเป็น Ubuntu จะเรียก Ubuntu Software Center เห็นหน้าตาดังรูปด้านล่าง เพราะผมทอลองติดตั้งไปหลายครั้งจึงขึ้นคำว่า Reinstall ถ้าเป็นครั้งแรกจะขึ้น Install
- หลังจากติดตั้งแล้ว
- ก็ลงเป็นกรณีศึกษาว่าทำได้ง่าย ลองเปิดดูไฟล์ Debian Package ของคนอื่นๆดูด้วย Archive Manager อาจจะเห็นโครงสร้างไดเรคทอรีที่มากกว่า แต่ก็เป็นไปตามข้อกำหนด ถ้ามีคู่มือการใช้จะมีไดเรคทอรี usr/share/doc เพิ่มขึ้นมา
พอดีเข้ามาอ่าน blog เก่าเกี่ยวกับข้อมูลแผนที่พม่า ไม่ทราบว่าจะหาซื้อข้อมูล 1: 50000 ของพม่า ได้ที่ไหนค่ะ เนื่องจากต้องการใช้ข้อมูล บริเวณเมื่อง Thanyain
ลองติดต่อบริษัทฯ Suntac ตามลิงค์นี้ asianproduct.com หรือ website ที่บริษัทฯโดยตรง http://www.suntactechnologies.com สำหรับ Suntac เป็นบริษัทฯที่ทำแผนที่ 1:50000 ให้กับทางรัฐบาลครับ