Month: November 2011

วิธีสร้าง Debian Package สำหรับติดตั้งโปรแกรมบน Ubuntu

จากผู้ใช้สู่ผู้สร้าง

  • ถ้าใช้ 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 ไดเรคทอรี
ไดเรคทอรีสำหรับเก็บ Debian Package
  • ผมยกตัวอย่างให้เห็นความแตกต่างโปรแกรม Traverse Pro ต้องการไลบรารีพื้นฐานคือ GTK2 ส่วนอีกสองโปรแกรมคือ AutocardMaker และ Autocheckpoint นอกเหนือจากไลบรารี GTK2 แล้วต้องการไลบรารีของฐานข้อมูล Firebird
2.สร้างไดเรคทอรีรองตามรุ่นของโปรแกรม
  • เราจะสร้างไดเรคทอรีย่อยลงไปอีกแต่ละโปรแกรมเพื่อเก็บ package แยกเป็นเวอร์ชั่น ตัวอย่าง Traverse Pro ของผมตอนนี้รุ่น 2.0.1 โปรแกรม Autocheckpoint  รุ่น 1.2.20
ไดเรคทอรีเก็บโปรแกรม Traverse Pro รุ่น 2.0.1
ไดเรคทอรีโปรแกรม Autochekcpoint รุ่น 1.2.20
3.สร้างไดเรคทอรีย่อยตามข้อกำหนด
  • ต่อจากนี้ไดเรคทอรีย่อยที่จะสร้างเพิ่มไปอีกจะต้องอยู่ในข้อกำหนดของ Debian Package ชื่อไดเรคทอรีจะต้องตรงกับที่ Debian ต้องการ ตัวอย่างในไดเรคทอรี /home/priabroy/MyDebianPackages/ สร้างไดเรคทอรีดังนี้

DEBIAN
usr

  • ไดเรคทอรี usr ที่เราสร้างขึ้นมาจะจำลองไดเรคทอรีที่โปรแกรมเราตอนติดตั้งจริงๆว่าจะอยู่ที่ไหนในโครงสร้างไฟล์ของลีนุกซ์ อย่างผมตั้งใจว่าจะให้โปรแกรมไปอยู่ที่ /usr/bin ผมก็จะสร้างไดเรคทอรี bin ซ้อนอยู่ใน usr ดูรูปด้านล่างประกอบอีกที
โครงสร้างไดเรคทอรีที่ Debian กำหนด
  • ไดเรคทอรี 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

script file สำหรับหา MD5
  • ผมใช้ 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 มาพร้อมจะลองไปทดสอบติดตั้ง

    package ที่รอคอย

ทดลองติดตั้ง

  • ถ้าเปิด Nautilus ใช้เมาส์ดับเบิ้ลคลิกบน package ถ้าเป็น Ubuntu จะเรียก Ubuntu Software Center เห็นหน้าตาดังรูปด้านล่าง เพราะผมทอลองติดตั้งไปหลายครั้งจึงขึ้นคำว่า Reinstall ถ้าเป็นครั้งแรกจะขึ้น Install
การติดตั้ง Package ผ่าน Ubuntu Software Center
  • หลังจากติดตั้งแล้ว
หลังจากติดตั้งแล้วใน Ubuntu GNome3
  • ก็ลงเป็นกรณีศึกษาว่าทำได้ง่าย ลองเปิดดูไฟล์ Debian Package ของคนอื่นๆดูด้วย Archive Manager อาจจะเห็นโครงสร้างไดเรคทอรีที่มากกว่า แต่ก็เป็นไปตามข้อกำหนด ถ้ามีคู่มือการใช้จะมีไดเรคทอรี usr/share/doc เพิ่มขึ้นมา

ยานยนต์สะเทินน้ำสะเทินบก…เหมาะสำหรับสภาวะน้ำท่วม

  • น้ำท่วมปีนี้ของบ้านเราหนักหนาสาหัสจริงๆ สมณะชีพราห์ม อาณาประชาราษฎร์ เดือดร้อนไปทุกข์หย่อมหญ้า ไม่เลือกยากดีมีจน ความจริงเรารู้ปริมาณน้ำฝนที่ตกลงมา ไม่ว่าจะมีพายุจะกี่ลูกก็ตาม เรื่องสำคัญคือเรื่องบริหารจัดการน้ำต่างหาก ที่จะผ่อนหนักให้เป็นเบา เขื่อนจะต้องพร่องน้ำเมื่อไหร่เท่าไหร่ตามปริมาณน้ำฝน
  • สำหรับบ้านเรา ด้าน GIS เรามีแบบจำลองความสูงคือ DEM ที่น่าจะละเอียดพอ มีดาวเทียมธีออสที่สามารถเห็นภาพจากท้องฟ้าได้แบบ real time หรือดาวเทียมดวงอื่นๆเป็นสิบดวง ที่นี้เมื่อแม่น้ำลำคลองไม่สามารถรับปริมาณน้ำได้จะต้องเอ่อล้นท่วมสองข้างฝั่ง ทิศทางมวลน้ำจะไหลไปทางไหน สามารถ simulate ได้ด้วยโปรแกรมด้าน GIS สำหรับกรุงเทพฯและปริมณฑลมีเวลา 2-3 เดือนเตรียมตัวน่าจะทำอะไรได้มากกว่านี้
  • สภาพความเป็นจริงแถบปริมณฑล พื้นที่อดีตส่วนใหญ่เป็นพื้นที่การเกษตร สามารถรับน้ำในยามน้ำหลาก แต่การพัฒนาในปัจจุบัน พื้นที่เหล่านี้ถูกถมเป็นที่อยู่อาศัย เป็นนิคมอุตสาหกรรมขนาดใหญ่ ทำให้ทิศทางของมวลน้ำจากที่เคยเอ่อล้นไปสะดวก ก็รวมตัวโจมตี จนกระทั่งนิคมอุตสาหกรรมแล้วนิคมเล่าจมน้ำ ความเสียหายเป็นมูลค่ามหาศาล คนตกงานอีกเป็นล้านคน
  • ผมมีเพื่อนอาศัยอยู่ที่อยุธยาแถวๆบางปะหัน เคยไปเที่ยวบ้านเพื่อนหลายสิบปีมาแล้ว บ้านเป็นบ้านไม้สองชั้น ชั้นล่างเปิดโล่ง ยังมีเรือไม้อยู่ หน้าแล้งจะเอามาชันยา หน้าฝนน้ำหลากก็ท่วมใต้ถุนบ้าน ใช้เรือนี่แหละในการสัญจร ก็คือเป็นวิถีชีวิตที่สอดคล้องกับสภาพภูมิประเทศดี ปัจจุบันอย่างที่เกาะเกร็ด นนทบุรีก็ยังเป็นแบบนี้อยู่ คนที่นั่นก็เลยไม่รู้สึกเดือดร้อนมากนัก

Amphibious Vehicle

  • แปลได้ตรงตัวว่า ยานยนต์ที่สามารถใช้ได้ทั้งในน้ำและบนบก ผมอ่าน Professional Surveyor Magazine ฉบับที่ 1 เดือน 8 ปี 2008 เห็นเป็นเรื่องยานยนต์ตัวนี้ ระบุใช้ในงานสำรวจที่เป็นพื้นที่ swamp คือน้ำไม่ลึกมากเช่นบึง หรือแม้กระทั่งป่าชายเลย พื้นที่แบบนี้ อาจจะมีพืชน้ำหรือกองไม้ระเกะระกะ ยากที่จะเดินไปสำรวจด้วยเท้า เมื่อมาเห็นน้ำท่วมบ้านเราแบบนี้ก็นึกถึงรถ/เรือแบบนี้ขึ้นมาทันที เลยกลับไปดูนิตยสารอีกครั้ง มีหลายเว็บไซท์ของอเมริกาที่ขายของแบบนี้ ที่ผมพูดถึงอยู่คือ HydraTrek หรืออีกเจ้าก็เป็น ArgoATV
ขับเคลื่อนหกล้อบนบก ในน้ำมีใบจักรสองใบอยู่ในท่อดูดน้ำและพ่น
  • ตัวรถ/เรือ ที่เห็นนี้ผลิตในอเมริกา มีบทบาทใช้งานมากช่วงน้ำท่วมสหรัฐฯเมื่อโดนพายุแคทรินา ตัวถังทำด้วยอลูมิเนียมทั้งคัน ทำให้เบา ทนทานพอสมควร เครื่องยนต์ไม่ได้วิลิศมาหราอะไรเลยเป็นเครื่องคูโบต้านำเข้าจากญี่ปุ่นเป็นเครื่องดีเซลเทอร์โบชาร์ตขนาด 40 แรงม้า น้ำท่วมบ้านเราถ้าระดับน้ำประมาณหนึ่งเมตรรถใหญ่ก็พอไปได้ แตถ้าระดับน้ำมากกว่าหนึ่งเมตรก็ต้องอาศัยเรือแล้วครับ
  • ถ้ามียานยนต์แบบนี้คือถ้าบนบกก็ใช้การขับเคลื่อนแบบหกล้อไปเรื่อยๆไม่เร็วแต่ไปได้ดี แต่พอลงน้ำก็ตัดกำลังจากเพลาขับล้อมาเป็นเพลาขับใบจักรแทน บนบกหรือน้ำตื้นก็ใช้ล้อ คือสรุปแล้วไปได้หมดทุกพื้นที่ มีไฟสปอค์ตไลท์ มีวินช์สำหรับดึงในกรณีติดหล่ม หรือขึ้นที่ลาดชันมากๆ
ใบจักรอยู่ในท่อเมื่อลงน้ำลดความเสี่ยงที่ใบจักรจะไปฟันกิ่งไม้หรือหินในน้ำได้

ผลิตในบ้านเราได้ไหม?

  • ผมดูแล้ว ถ้ามีคนคิดและทำในบ้านเรา ทำได้ครับไม่มีอะไรจะไฮเทคเลิศเลอเลย แต่ปัญหาคือผลิตแล้วจะขายใครเท่านั้นละครับ บ้านเรามันเสียอยู่อย่างคืองานวิจัยและพัฒนามันน้อย ที่เห็นอุตสาหกรรมต่างๆส่วนใหญ่ในบ้านเราเป็นสถานีรับจ้างผลิตทั้งนั้น ตัว Amphibian นี้ถ้าจะทำมันยากอย่างเดียวคือระบบขับเคลื่อนด้วยใบจักรเมื่ออยู่ในน้ำ เพราะผมสังเกตดูแล้วไม่มีหางเสือสำหรับบังคับเลี้ยว ทีนี้งานก็ตกอยู่ที่ใบจักรสองใบในการหมุนด้วยรอบที่ไม่เท่ากันเพื่อให้เรือสามารถเลี้ยวได้ จากที่อ่านดูแล้วยานยนต์นี้ไม่มีโซ่ ไม่มีเกียร์บ็อกซ์หรือคลัทซ์ ทำงานด้วยระบบไฮโดรลิคล้วนๆ สนนราคาในอเมริกาประมาณ 1.5 ล้านบาท ถ้าสั่งมาบ้านเราเจอภาษีเข้าไปคูณสามเข้าไป คงมีแต่เศรษฐีที่ซื้อได้
ปีนป่ายที่สูงก็ทำได้ดี
เหมาะสำหรับงานกู้ภัย
  • ไหนๆพูดถึงเรื่องนี้แล้วขอเชียร์คนใกล้ๆหน่อย ผลงานที่เห็นดังรูปต่อไปเป็นของพี่พงษ์ชัย พงษ์ชวลิต เป็นแบ็คโฮสภาพสะเทินน้ำสะเทินบก ช่วงล่างรื้อแทร็คเดิมออกหมด แล้วออกแบบช่วงล่างใหม่ ตามรูปที่เห็นเป็นรุ่น 1 ตอนนี้ผ่านมาแล้ว 4-5 ปีน่าจะเป็นรุ่น 3 แล้ว คือทำงานได้ในน้ำตื้นได้ประมาณสัก 1-1.5 เมตร เจอน้ำลึกกว่านี้ก็ลอยตัวได้ เรื่องทำงานคงไม่ได้บึ๊กๆแบบอยู่บนแทร็คดั้งเดิมบนบกคืออาจจะเทอะทะไปบ้างตามข้อจำกัด แต่ก็ทำงานได้ดีกว่าใช้แรงคน ข้อจำกัดอีกอย่างคือการซ่อมบำรุงต้องมากขึ้น แต่มองแล้วคุ้มค่า
  • พี่พงษ์ชัยใช้หลักด้านวิศวกรรมเครื่องกล ผ่านการคิด ผ่านโปรแกรม 3D ที่วิเคราะห์เรื่องวัสดุที่ใช้ประกอบ ผ่านเรื่องแรงลอยตัวของน้ำ การพยุงตัวให้ได้สมดุล เอ้าพี่พงษ์ชัยสู้ต่อไปครับ มีเวลาว่างๆจะให้ออกแบบ ยานยนต์ amphibian ที่กล่าวมาข้างต้นนะครับ
แบ็คโฮสะเทินน้ำสะเทินบก