ติดตั้ง Lotus Symphony

IBM Lotus Symphony เป็นชุดโปรแกรมออฟฟิสจากค่าย IBM ออกแบบหน้าตามาคล้ายๆ Eclipe แต่จัดการเอกสารแบบ Open Document Format ได้ ซึ่งโปรแกรมในชุด Lotus Symphony ประกอบด้วย Lotus Symphony Document, Lotus Symphony Spreadsheets, Lotus Symphony Presentation.? ซึ่งทั้งชุดคุณสามารถเอาไปใช้ได้โดยไม่เสียค่าใช้จ่าย ทำความรู้จัก Lotus Symphony กันพอสมควรแล้ว เรามาลองติดตั้ง Lutus Symphony บน Ubuntu กันครับ
เริ่มจากดาวน์โหลด Lutus Symphony กันก่อนที่ http://symphony.lotus.com/ คลิกตรง Download

Continue reading ติดตั้ง Lotus Symphony

ติดตั้ง Subversion

Subversion เป็นโปรแกรมระบบควบคุมเวอร์ชั่นที่เป็นโอเพนซอร์ส การใช้งาน Subverson คุณสามารถบันทึกประวัติของโค้ด ไฟล์ และเอกสาร ต่างๆ ได้ง่าย การเก็บข้อมูลของ Subversion เราเรียกว่า repository ซึ่งคล้ายๆ กับ file server ยกเว้นแต่ว่ามันจำได้ว่าไฟล์หรือไดเรคทอรีนั้นๆ เปลี่ยนแปลงตรงไหนอย่างไร เรามาลองติดตั้ง SVN Server บน Ubuntu และเรียกใช้งาน SVN กันครับ
วิธีการติดตั้ง เราต้องกำหนด SVN Repository กันก่อน อาจเก็บไว้ที่ /home/svn แล้วเราจะมีโปรเจคย่อยๆ ในนั้น เช่น myproject เป็นต้น ให้คุณสร้างไดเรคทอรีสำหรับ SVN Repository ดังนี้

sudo mkdir /home/svn
cd /home/svn
sudo mkdir myproject
sudo chown -R www-data myproject
sudo chgrp -R subversion myproject
sudo chmod -R g+rws myproject

จากนั้นสร้าง project config file โดยใช้คำสั่งดังนี้

sudo svnadmin create /home/svn/myproject

วิธีการ access SVN มีหลายวิธีใน how-to นี้เราใช้ svn protocal (svn://hostname/project-name) ครับ สั่งเริ่มต้นการทำงานของ SVN Server โดยใช้คำสั่ง

svnserve -d --foreground -r /home/svn

เปิด terminal มาอีกหน้านึงครับแล้วลอง checkout ไฟล์ดูโดยใช้คำสั่ง

svn co svn://hostname/myproject myproject

เราจะได้ไดเรคทอรี myproject ที่ checkout มา เป็นเวอร์ชั่น 0 ให้คุณเพิ่มเติมไฟล์ลงในไดเรคทอรีนี้แล้วสั่ง add และ commit ดังนี้

cd myproject
echo "readme" > readme.txt
svn add * --force
svn commit

เท่านี้เองครับ เราก้อสามารถ commit ไฟล์ไปที่ repository ได้แล้ว ถ้าอยากทราบคำสั่งใน SVN ก้อใช้

svn help

สำหรับ SVN Client ที่ใช้ง่ายๆ โดยที่ไม่ต้องพิมพ์บน command line ก้อมี RapidSVN, TortoiseSVN เป็นต้น

เรื่องยุ่งๆ ของ Package Manager

ผมพยายามหา package manager เจ๋งๆ มาใช้งานทั้งตัว package และตัวโปรแกรมที่ทำหน้าที่ sync และ update package บนเครื่อง server และเครื่อง desktop ได้ซึ่งตอนนี้ผมจับ 4 distro หลักคือ openSolaris, Debian, Ubuntu และ Fedora เอาเป็นว่ายุบรวมเหลือเพียง 2 package manager ละกันครับ ซึ่งลักษณะการ fetch package คล้ายคลึงกันคือ การสร้าง database repo (meta data ของ package ที่มีอยู่ใน repo server ที่เราเลือกเอาไว้) อยู่ในเครื่องเรา กับไม่ได้สร้าง database repo ในเครื่องเรา วิธีการสังเกตง่ายๆ คือ การค้นหาหรือติดตั้งโปรแกรมที่เคยติดตั้งไปแล้ว (กรณีที่เก็บ package เป็น archive ไว้) package manager จะติดตั้งหรือค้าหาได้ทันที ไม่จำเป็นต้องเชื่อมต่อ internet เพื่อเข้าไป fetch ของ database repository อีกรอบหนึ่ง
ซึ่ง aptitude เป็น package manager ที่ชอบเก็บ database repo ข้อดีก้อคือกรณีเกิดการ broken database บน repo server เราสามารถใช้ repo database ในเครื่องเราสืบค้นข้อมูล package ได้ ซึ่งแตกต่างจาก yum ซึ่งพบใน fedora และ delivered distro ของ fedora เจ้าโปรแกรม yum เป็นส่วนเสริมในการจัดการ package rpm ซึ่ง yum ไม่เก็บข้อมูล repo database ในเครื่องเรา เวลาติดตั้งหรือค้นหา package ต้อง fetch หาจาก repo server ซึ่งค่อนข้างจะมีน้อยและกระจัดกระจาย ด้วยการจัดการ repo database แบบนี้ทำให้ yum ก้อมีข้อดีอย่างหนึ่งคือเราจะได้ข้อมูล package ที่สดใหม่อยู่ตลอดเวลา และรู้ว่าอะไรควรจะอัพเดทหรือไม่อัพเดท แต่ข้อเสียคือมันต้องใช้ internet คลอดเวลาค้นหา package ที่เราจำชื่อไม่ค่อยจะได้ อันนี้ผมเป็นบ่อยเพราะผมชอบค้นใน repo มากกว่าการนั่งเดาชื่อ package หรือชื่อโปรแกรมที่ผมจะติดตั้ง ซึ่งกรณีเกิด broken repo database บน repo server ก้อเตรียมทำใจได้เลยครับ เพราะจะ fetch อะไรไม่ได้และก้อต้องจำใจใช้ โปรแกรมเก่าๆ ต่อไป
เอาล่ะแล้วจะมี package manager ที่ผมชอบบ้างมั๊ย เท่าที่ลองเล่น หลายๆ distro รวมถึง opemSolaris ด้วยแล้วก้อมีจุดดีจุดเด่นแตกต่างกัน ด้วยลักษณะการจัดการ repo server และข้อมูล meta data ที่เก็บด้วย แต่ผมมีโครงสร้าง meta data ที่น่าสนใจอยุ่ตัวหนึ่งลองมาดูกันมั๊ยครับ

<dict>
<key>bundleIdentifier</key>
<string>com.nullriver.iphone.Launcher</string>
<key>name</key>
<string>Launcher</string>
<key>version</key>
<string>0.2</string>
<key>location</key>
<string>http://iphone.nullriver.com/zips/Launcher-0.2.zip</string>
<key>size</key>
<string>14581</string>
<key>description</key>
<string>A simple third party application launcher.</string>
<key>scripts</key>
<dict>
<key>preflight</key>
<array>
<array>
<string>If</string>
<array>
<array>
<string>InstalledPackage</string>
<string>com.kroo.mobilelauncher</string>
</array>
</array>
<array>
<array>
<string>AbortOperation</string>
<string>Please uninstall MobileLauncher first.</string>
</array>
</array>
</array>
</array>
<key>install</key>
<array>
<array>
<string>CopyPath</string>
<string>Launcher.app</string>
<string>/Applications/Launcher.app</string>
</array>
<array>
<string>CopyPath</string>
<string>DisplayOrder.plist</string>
<string>/System/Library/CoreServices/SpringBoard.app/DisplayOrder.plist</string>
</array>
</array>
<key>uninstall</key>
<array>
<array>
<string>RemovePath</string>
<string>/Applications/Launcher.app</string>
</array>
</array>
</dict>
</dict>

ข้างบนเป็นกรณีศึกษาของผมคือ plist ของ Nullriver Installer บน iPhone นะครับ เจ้า Nullriver Installer นี้ฮิตมากเพราะทำงานคล้ายๆ กับ synaptic คือติดโปรแกรมผ่านทาง internet ได้อ้อถ้ามีเครื่องใน office ก้อติดผ่าน wifi ได้ครับ เจ๋งมั๊ย และที่สำคัญไฟล์ package ที่เอามาติดตั้งไม่จำเป็นต้องอยู่ที่เครื่อง repository ก้อได้ (ตัวหนา) คือเครื่อง repo server ที่อยู่ใน office เป็นเพียง meta data (repo database) เท่านั้น จะติดตั้งก้อวิ่งไป download package เพื่อเอามาติดตั้งอีกที แต่ Nullriver Installer ไม่ได้ทำงานแค่นี้มันยังสามารถเก็บ repo database ในเครื่อง iPhone ด้วย นั่นหมายความว่าคุณสามารถ browse repo ได้โดยไม่ต้องเชื่อมต่อ internet อันนี้สิครับเจ๋งจริง แต่ด้วยความที่โครงสร้างของตัว repo server และ package list (plist) สามารถสร้างและแก้ไขได้ง่าย ทำให้เกิดธุรกิจทำ repo ของ iPhone โดยใช้โครงสร้าง repo ของ Nullriver เยอะมาก ปัญหาที่ตามมาคือ package ซ้ำซ้อนกันไงครับ เอาล่ะปัญหานี้กำลังถูกแก้ไขโดยโครงการ AppTapp ของ Nullriver นั่นแหละครับ ซึ่งอาจแฝงการตลาดเข้าไปด้วยก้อได้อันนี้ผมไม่ทราบนะครับ 🙂 ว่าจะมีหรือเปล่า แต่ที่แน่นอนคือ Nullriver Installer หรือ AppTpp ในอนาคตเป็นที่น่าจับตามองครับ สำหรับ package manager บน android ผมยังไม่ได้ดูเลยครับว่าเป็นยังไง ใครพอจะทราบก้อบอกเล่าแลกเปลี่ยนความรู้กันได้ครับ 🙂

สร้าง Meta Package สำหรับ Debian/Ubuntu กัน

ได้อานิสงฆ์มาจากการไปเรียน Training 11 คุณครูหมีเท็ดดี้บอกแว๊บๆ ว่ามีเครื่องมือในการสร้าง Meta Package ได้ง่ายๆ ผมเองก้อไม่ได้สนใจอะไรเพราะชอบ build deb แบบดุ้นๆ เพิ่งจะมาได้ดูเมื่อ 2 วันที่แล้วนี่เอง ลองเล่นดูก้อพบว่า เอ๊ะมันง่ายเกินไปหรือเปล่า เอาล่ะโปรแกรมที่ช่วยเราทำ Meta Package แบบง่ายๆ นี้ชื่อว่า equivs ใครยังไม่มีก้อติดตั้งได้เลยครับ

sudo apt-get install equivs

สำหรับ การใช้งานก้อไม่ยากครับ equivs จะมีเครื่องมือสร้าง control file คล้ายๆ กับการสร้างไฟล์ spec ไฟล์ของแพคเกจแบบ RPM แต่ไฟล์ที่ได้นี้จะ compile ได้ด้วย equivs ไม่ได้ครับ เรามาลองสร้าง control ไฟล์กันก่อนครับ สั่งสร้าง control ไฟล์โดยใช้คำสั่ง

equivs-control package-thai-setup.ctl

ลืมบอกไปว่าเราจะสร้างแพคเกจติดตั้งภาษาไทย ฟอนต์ และอื่นๆ ในไฟล์ package-thai-setup.ctl ที่เราได้ก้อจะมีหน้าตาอย่างนี้ครับ

### Commented entries have reasonable defaults.
### Uncomment to edit them.
Section: misc
Priority: optional
Standards-Version: 3.6.2
Package: <package name; defaults to equivs-dummy>
# Version: <enter version here; defaults to 1.0>
# Maintainer: Your Name <yourname@example.com>
# Pre-Depends: <comma-separated list of packages>
# Depends: <comma-separated list of packages>
# Recommends: <comma-separated list of packages>
# Suggests: <comma-separated list of packages>
# Provides: <comma-separated list of packages>
# Replaces: <comma-separated list of packages>
# Architecture: all
# Copyright: <copyright file; defaults to GPL2>
# Changelog: <changelog file; defaults to a generic changelog>
# Readme: <README.Debian file; defaults to a generic one>
# Extra-Files: <comma-separated list of additional files for the doc directory>
Description: <short description; defaults to some wise words>
long description and info
.
second paragraph

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

### Commented entries have reasonable defaults.
### Uncomment to edit them.
Section: misc
Priority: optional
Standards-Version: 3.6.2
Package: package-thai-setup
Version: 1.0ubuntu1
Maintainer: Anuchit Chalothorn <anoochit@gmail.com>
# Pre-Depends: <comma-separated list of packages>
Depends: language-pack-th-base, language-pack-th, language-pack-gnome-th-base, language-pack-gnome-th, language-support-fonts-th, language-support-input-th, language-support-translations-th, language-support-writing-th
# Recommends: <comma-separated list of packages>
# Suggests: <comma-separated list of packages>
# Provides: <comma-separated list of packages>
# Replaces: <comma-separated list of packages>
Architecture: i386
# Copyright: <copyright file; defaults to GPL2>
# Changelog: <changelog file; defaults to a generic changelog>
# Readme: <README.Debian file; defaults to a generic one>
# Extra-Files: <comma-separated list of additional files for the doc directory>
Description: setup for Thai language package
This package for Thai language package setup for all Thai locale, input method and display.

จากนั้นก้อ สั่ง compile package กันได้เลยโดยใช้คำสั่ง

equivs-build package-thai-setup.ctl

เรา ก้อจะได้ไฟล์ package-thai-setup_1.0ubuntu1_i386.deb ออกมาแล้ว หากเราสั่งติดตั้งแพคเกจนี้ ตัวติดตั้งก้อจะดาวน์โหลดแพคเกจที่เป็น depends มาให้เรา ซึ่งถือว่าเป็นการสร้างแพคเกจ .deb แบบง่ายสุดๆ ซึ่งสามารถใช้งานได้กับ debian และ ubuntu เลยล่ะ 🙂

โอเพนซอร์สวงจรหมุนเชิงบวกกับผู้ผลิตซอฟต์แวร์

คิดว่าจะไม่มาเขียนเรื่องนี้อีกก้ออดไม่ได้ครับ เพราะว่าแนวคิดในบ้านเรามันออกจะขัดกับแนวคิดโอเพนซอร์สและหลักปรัชญาที่ควร จะเป็นเสียมากซึ่งผมมองว่าอุตสาหกรรมซอฟต์แวร์ในบ้านเราจะไม่ได้อะไรเลย นอกจากการดาวน์โหลดโค้ดแล้วปะยี่ห้อใหม่ขายหรือทำได้เท่าที่มีคนทำให้ ไม่เกิดสิ่งใหม่ไม่เกิด innovation ใหม่ๆ ซึ่งเป็นเรื่องที่น่าเสียดาย ผมได้พูดคุยกับผู้ประกอบการหลายรายที่อยู่ใน Software Park ซึ่งส่วนใหญ่เป็น Tailor-Made หรือรับจ้างทำของตั้งแต่ต้นเริ่มจากศูนย์ บางรายก้อ reuse โครงการของอีกที่นึงมา modified ให้ใช้ได้กับอีกที่หนึ่ง บางรายก้อใช้โอเพนซอร์สซอฟต์แวร์นี่แหละเอาไปทำให้ดูค้า เช่น เว็บไซต์ ระบบงานเอกสาร ระบบคลังความรู้ ฯลฯ เอาล่ะคุณน่าจะมองเห็นภาพของธุรกิจอุตสาหกรรมซอฟต์แวร์ใมนบ้านเราบ้างนิดๆ หน่อยๆ พอหอมปากหอมคอ อ้อ อันนี้ไม่รวมถึงพวก partner จากบริษัทยักษ์ใหญ่ข้ามชาตินะครับ ฮะๆ ธุรกิจซอฟต์แวร์ในบ้านเรามีคู่แข่งเยอะจริงๆ
เอาล่ะจากการโหมโรง เมื่อหลายปีก่อนเกี่นสกับโอเพนซอร์สได้มีการนำเอาซอฟต์แวร์โอเพนซอร์สไป ใช้งานกันมากขึ้น ไม่ว่าจะเป็นธุรกิจซอฟต์แวร์แบบจ้างทำของ หรือการบริการแบบครบวงจรอย่างธุรกิจบริการพื้นที่เว็บไซต์ รับทำเว็บ ฯลฯ เท่าที่สังเกตจากช่วงเปลี่ยนผ่านของ CMS รายหนึ่งในต่างประเทศ ไม่ต้องอ้อมค้อมละกัน จาก Mambo ไปเป็น Joomla การเปลี่ยนผ่านครั้งนั้นสร้างผลกระทบหลายอย่างซึ่งไม่ได้เป็นผลกระทบทางตรง แต่เป็นทางอ้อม คือแนวทางการพัฒนา component ของ Mambo ก่อปัญหาเกิดช่องโหว่ของ component หลายตัวทำให้เกิดการ crack เว็บครั้งใหญ่โดยการยิง script ไปยังเว็บต่างๆ ที่ใช้ Mambo เรียกได้ว่าเจ็บตัวกันไปหลายรายเลยทีเดียว และที่แน่นอนผู้ประกอบการหลายรายในไทยก้อโดนโวยจากลูกค้าที่ส่งมอบงานไปแล้ว ซึ่งผู้ประกอบการหลายรายก้อได้มาปรึกษาผมเช่นกัน (ไม่ขอเอ่ยชื่อละกันนะ) ถามไปถามมาปรากฏว่าผู้ประกอบการเองก้อยังไม่เข้าใจการพัฒนาซอฟต์แวร์แบบ โอเพนซอร์ส และยังไม่เข้าใจโอเพนซอร์สเสียด้วยซ้ำซึ่งเป็นเรื่องน่าตกใจ เขาเพียงบอกกับผมว่ามันมีให้ดาวน์โหลดมาใช้ มันง่ายดี แต่ไม่รู้ทำไมโดนแฮ็ก Continue reading โอเพนซอร์สวงจรหมุนเชิงบวกกับผู้ผลิตซอฟต์แวร์

โอเพนซอร์สซอฟต์แวร์และวงจรเชิงบวกสมบูรณ์

ไม่คิดว่าจะเขียนเรื่องนี้เพราะเรื่องโอเพนซอร์สซอฟต์แวร์และวงจรเชิงบวก สมบูรณ์ หรือ Completeness Positive Cycle for Open Source Software นี้เป็นเรื่องที่เข้าใจได้ยาก ออกจะขวางโลกธุรกิจ ขวางโลกในมุมมองของคนในธุรกิจซอฟต์แวร์พอสมควร เพราะธุรกิจซอฟต์แวร์ที่เอาซอฟต์แวร์โอเพนซอร์สไปใช้หรือนำไปจำหน่ายมักเน้น ไปในแนวทางธุรกิจในแบบที่เห็นแก่ตัว บางคนก้อเรียกให้สวยหรูว่ามันเป็น Business Model อย่างหนึ่ง ซึ่งผมเองไม่ค่อยเห็นด้วยสักเท่าไร หากคุณยังนึกภาพไม่ออกผมจะยกตัวอย่างง่ายๆ ให้ทำความเข้าใจกัน
สมมุติ ว่ามีชุมชนหนึ่งหรือนักพัฒนากลุ่มหนึ่งพัฒนาซอฟต์แวร์แล้วเปิดเป็นโอเพน ซอร์ส (ใช้ License แบบโอเพนซอร์ส) แต่มีกลุ่มคนอีกกลุ่มหนึ่งที่ไม่ได้เกี่ยวข้องอะไรกับชุมชนนั้น หยิบเอาซอฟต์แวร์นั้นไปเปลี่ยนชื่อและจำหน่าย โดยที่ชุมชนและกลุ่มนักพัฒนาก้อยังพัฒนาอยู่เรื่อยๆ โดยไม่รู้เรื่องอะไรเลย และกลุ่มคนกลุ่มนั้นก้อไม่คิดที่จะซัพพอร์ทชุมชนและกลุ่มนักพัฒนาเลยแม้แต่ น้อย หากซอฟต์แวร์มีปัญหาก้อจะโยนกลองให้ชุมชนและกลุ่มนักพัฒนาแก้ไขกันต่อไป สิ่งเหล่านี้เกิดขึ้นจริงและน่าละอายมากที่คนไทยเราก้อทำธุรกิจหากินกับ ชุมชนและกลุ่มนักพัฒนาเช่นนี้เหมือนกับตัวอย่าง
น่าเสียดายที่องค์กร ที่ทำหน้าที่ผลักดันเรื่องโอเพนซอร์สในบ้านเรา ไม่ว่าจะเป็น องค์กรด้านการศึกษา และ องค์กรด้านภาครัฐ ไม่ได้ใส่ใจในเรื่องของความสำคัญและคุณค่าของซอฟต์แวร์มากนัก ทำให้ซอฟต์แวร์โอเพนซอร์สในความคิดของบ้านเราเป็นซอฟต์แวร์ทางเลือกหรือ ซอฟต์แวร์ที่ใช้งานได้บ้างไม่ได้บ้าง ซึ่งความคิดแบบนี้ส่งผลเสียแต่ชุมชนและนักพัฒนาซอฟต์แวร์โอเพนซอร์สโดยตรง เอาล่ะโอเพนซอร์สซอฟต์แวร์และวงจรเชิงบวกสมบูรณ์เป็นอย่างไร ผมขออธิบายสั้นๆ และไม่ขอลงในรายละเอียดมากนักนะครับ เรามาเริ่มจากจุดเริ่มต้นกันอีกครั้งหนึ่งที่มีชุมชนหนึ่งหรือนักพัฒนากลุ่ม หนึ่งพัฒนาซอฟต์แวร์แล้วเปิดเป็นโอเพนซอร์ส โดยชุมชนและนักพัฒนาซัพพอร์สซึ่งกันและกันโดยการร่วมกันพัฒนา หาบัก แก้บัก สร้างองค์ความรู้ ฯลฯ นวตกรรมใหม่ๆ จะเกิดขึ้นจากชุมชน เนื่องจากความต้องการของแต่ละคนไม่เหมือนกันทำให้ซอฟต์แวร์นั้นต้องมีการ พัฒนาอยู่เสมอ นวตกรรมใหม่นี้ถือว่ามีเจ้าของร่วมกันคือชุมชนและนักพัฒนา หากเรามองในรูปแบบวงกลมเราจะได้วงกลมที่ซ้อนทับกัน Continue reading โอเพนซอร์สซอฟต์แวร์และวงจรเชิงบวกสมบูรณ์

ติด RAID10 ให้ Ubuntu

ค้างเรื่อง RAID 10 มาระยะนึงแล้วตั้งใจว่าจะเขียนตั้งนานละไม่ได้เขียน เรื่องของเรื่องคือ Ubuntu เวลาติดตั้ง RAID มักจะลงเอยด้วยการ boot ไม่ขึ้นและติดตั้งได้เพียง RAID 0,1 และ 5 เท่านั้น เรียกได้ว่าเป็นอาการหลักเลยล่ะ ลองไปค้นๆ พบคำตอบที่น่าสนใจเลยได้โอกาสมาเขียนเล่าสู่กันฟัง สักครั้ง ปัญหาที่เขาพบก้อคล้ายๆ กับปัญหาที่ผมพบเช่นกันคือ ติดตั้งไปแล้ว boot ไม่ได้แต่วิธีการแก้ไขมันมีครับ คือใช้ Live CD ช่วยอีกแรง อันดับแรกมาวางแผน partition กันก่อน ใช้โปรแกรมจัดการ partition ง่ายๆ อย่าง cfdisk (มันใช้ง่ายอ่ะนะ) สร้าง partition ขนาด 50 MB ก่อนใน ฮาร์ดดิสก์ลูกแรก (ลืมบอกไปว่ามี 4 ลูก) เป็น /boot จากนั้นสร้าง partition ที่เหลือเป็น RAID อ้ออย่าลืมใส่ swap ขนาด 1 GB ไว้ทุกๆ ฮาร์ดดิสก์ เพื่อความสามารถในการจัดการ SWAP เราจะได้โครงสร้าง partition ดังภาพ

จากนั้นติดตั้งโปรแกรมจัดการ RAID เพื่อตั้งค่า RAID อีกทีโดยใช้คำสั่ง

apt-get install mdadm

จากนั้นสร้าง RAID device ขึ้นมากำหนดให้เป็น raid10 โดยใช้คำสั่ง

mdadm -v --create /dev/md0 --level=raid10 --raid-devices=4 /dev/sda2 /dev/sdb1 /dev/sdc1 /dev/sdd1

จากนั้นสั่งสร้าง File System และ Format ก่อนเพราะตัวติดตั้งของ Ubuntu จะไม่เข้าใจว่ามันจพ Format Partition ยังไง ให้เราชิง Format มันก่อน และกำหนดให้เป็น XFS สาเหตุที่ใช้ XFS เพราะว่า File System แบบนี้มีประสิทธิภาพในการจัดการไฟล์ได้ดีกว่า ext3 จากนั้นสร้าง link สำหรับ RAID Device เพื่อให้ Ubuntu เข้าใจ เพราะ device md0 ที่เราสร้างจะหาไม่เจอตอนที่เราติดตั้ง Ubuntu ก้อเปลี่ยนเป็น sde ซะ เริ่มจากสั่งสร้าง XFS กันก่อน

mkfs.xfs /dev/md0

สร้าง link เพื่อบอกให้ตัวติดตั้งมองเห็น

ln /dev/md0 /dev/sde

จากนั้นติดตั้ง Ubuntu ได้เลยครับ กำหนดให้ /boot (sda1) ของเราเป็น ext3 นะครับ และตั้งค่า swap ให้ทุกๆ partition ที่เป็น swap สำหรับ partition อื่นๆ อย่าเลือกให้ reformat นะครับเพราะเราชิง format มันเป็น XFS ไปแล้ว จากนั้นเริ่มติดตั้งกันได้เลย หลังจากติดตั้งเสร็จให้ใช้ Live CD ต่อครับ มาติดตั้งโปรแกรมจัดการ RAID ให้ partition ที่เราติดตั้งกันต่อ เพราะมันจะมองไม่เห็น RAID ที่เราสร้างหลังจากที่เรา reboot และนี่คือตัวปัญหาที่มักจะพบกันบ่อย วิธีการติดตั้งโปรแกรมจัดการ RAID ให้คุณ chroot เข้าไปครับ แล้วติดตั้ง mdadm ด้วยคำสั่ง

mkdir /myraid
mount /dev/md0 /myraid
mount /dev/sda1 /myraid/boot
mount --bind /dev /myraid/dev
mount -t devpts devpts /myraid/dev/pts
mount -t proc proc /myraid/proc
mount -t sysfs sysfs /myraid/sys
chroot /myraid
apt-get install mdadm
exit

ทีนี้เราก้อ reboot เครื่องกันได้แล้ว อ้อมีคำสั่งที่น่าสนใจ อยู่นิดนึงว่า partition ไหนอยู่ใน ฮาร์ดดิสก้อไหนคำสั่งที่ใช้คือ

cat /proc/mdstat

นี่แหละครับ หากเกิดปัญหาแล้วต้องการ mount RAID จาก Live CD คุณต้องติดตั้ง mdadm ก่อนเพื่อจะสั่งให้ RAID ทำงาน ด้วยคำสั่งดังนี้

sudo su
apt-get install mdadm
mdadm --assemble /dev/md0

จากนั้นเราก้อ mount RAID ได้แล้ว อ่านเพิ่มเติม หากไม่เข้าใจ

โอเพนซอร์สไปทำไม เพื่อใคร เพราะอะไร?

มีคำถามหลายๆ อย่างที่ผมยกมาเป็นปัญหาแล้วหาคำตอบหรือหาเหตุผลมายืนยัน คำตอบและเหตุผลที่มีน้ำหนักไม่เอนเอียงไปในทางใดทางหนึ่ง สังคมโอเพนซอร์สไม่ได้มีเพียงกลุ่ม Geek ที่ชอบแกะเกา หรือคิดอะไรพิศดารแล้วสร้างหรือพัฒนาให้มันเป็นนวตกรรมใหม่ ในมุมมองของสังคมผู้ใช้ ก็มองในมุมมองที่แตกต่างกัน ผู้ใช้ไม่มีความคิดพิสดารอย่าง Geek แต่กลับนำเอาสิ่งที่ เหล่า Geek คิดค้นมาประยุกต์ใช้ และสร้างแรงกระตุ้นในกลุ่ม Geek ให้พัฒนาสิ่งใหม่ๆ ให้เกิดขึ้นอยู่ตลอดเวลา แล้วกลุ่ม Geek จะเปิดโค้ดทำไม? ทั้งๆ ที่สิ่งที่พวกเขาเหล่านั้นคิด และพัฒนาขึ้นเป็นสิทธิของเขาและเป็นผลงานของเขาเอง ? แล้วโอเพนซอร์สเพื่อใคร ? ในบทความนี้เราจะมาหาคำตอบร่วมกัน หากท่านอ่านแล้วมีข้อโต้แย้ง หรือคำแนะนำ เขียนแสดงความคิดเห็นได้ในตอนท้ายของบความนี้นะครับ
ย้อนไปเรื่อง โอเพนซอร์ทำไม เพื่อใคร ? การเปิดโค้ดให้ผู้ใช้ (End User) ? อืมมม คงไม่ใช่เรื่องปกติ ที่ผู้ใช้จะเอาไปพัฒนาต่อเองได้แน่นอน ผมคิดอย่างนั้น หากเปิดโค้ดให้นักพัฒนาอิสระล่ะ อืมมม มีความเป็นไปได้สูงที่จะมีการร่วมมือกันพัฒนา (Contribute) มีอีกประเด็นหนึ่งคือเปิดโค้ดเพื่อการตลาดและประชาสัมพันธ์ ประเด็นนี้เดี๋ยวมาว่ากันทีหลัง คุณคิดว่า กลุ่ม Geek ที่พัฒนาซอฟต์แวร์แล้วเปิดโค้ดให้คนอื่นเข้ามาแก้ไข พัฒนา เอาไปใช้งาน เอาไปต่อยอด ฯลฯ เขาทำไปทำไม ? มีใครให้เหตุผลได้บ้าง ผมมีคำตอบและเหตุผลหลายๆ อย่างมาเล่าสู่กันฟัง
1. เพื่อมนุษยชาติบนใบโลกนี้
2. หาคนร่วมพัฒนามีหลายหัวดีกว่ามีอยู่ไม่กี่หัว
3. สร้างสาวกให้สาวกใช้จนติดงอมแงมเลิกใช้ไม่ได้
4. อยากจารึกชื่อไว้บ้าง
5. อยากรวย
ถ้า คุณมีความสามารถในการพัฒนาซอฟต์แวร์ แล้วคิดว่าเปิดโค้ดให้กับชุมชนหรือผู้ใช้ทั่วโลกได้หยิบจับเอาไปใช้กัน คุณคิดว่าคุณเปิดโค้ดเพราะเหตุผลอะไร ? Continue reading โอเพนซอร์สไปทำไม เพื่อใคร เพราะอะไร?

ประยุกต์ Wildcard DNS กับ Apache

คราวที่แล้วเขียนเรื่อง Wildcard DNS record ไป เพื่อบอกให้ Bind รู้ว่าอะไรที่เกี่ยวข้องหรือตรงกับเงื่อนไขให้อ้างอิง domain นั้นโดยตรง สำหรับ How-To ครั้งนี้จะมาเล่าวิธีกการประยุกต์ใช้? Wildcard DNS และการตั้งค่า VirtualHost เพื่อรองรับการเรียกผ่าน subdomain ใดๆ ใครจำเรื่อง DNS Wildcard ไม่ได้ลองมาพิจารณาดู record ดังนี้

example.com.        A    10.11.12.13
*.example.com.    CNAME    example.com.

หาก เรา dig xyz.example.com เราจะพบว่า DNS จะบอกว่า IP เป็น 10.11.12.13 คือ CNAME ของ example.com นั่นเอง คราวนี้หากเราจะเพิ่ม VirtualHost ให้ Apache จะทำได้อย่างไร และต้องการให้ซัพพอร์ทในทุกๆ subdomain มาลองดูวิธีกันนะครับอันดับแรก เริ่มจากการตั้งค่า DNS กันก่อน ในโซนไฟล์ให้เพิ่ม wildcard สำหรับ domain ดังนี้

*.example.com.    IN      A       192.168.1.1

ผม ยกตัวอย่าง domain ที่ชื่อ example.com นะครับ เมื่อกำหนด wildcard ให้กับ DNS แล้วนั่นหมายความว่า subdomain ใดๆ ที่อยู่ภายใต้โดเมน example จะถูกกำหนดเป็น IP 192.168.1.1 ทั้งหมด มาตั้งค่า VirtualHost ให้กับ Apache กันต่อครับ ในไฟล์ VirtualHost ให้เพิ่ม ServerAliase เป็น *.example ดังตัวอย่าง

<VirtualHost *>
ServerName  www.example.com
ServerAlias *.example.com
DirectoryIndex index.html
DocumentRoot /home/www/www.example.com/htdocs
....
</VirtualHost>

จาก ตัวอย่างข้างต้น subdomain ใดๆ ที่อยู่ภายใต้โดเมน example จะมี DocumentRoot อยู่ที่ /home/www/www.example.com/htdocs ตัวอย่างเช่น หากเราเปิด xxx.example.com ก้อจะเปิดไฟล์ index ที่อยู่ในไดเรคทอรี /home/www/www.example.com/htdocs หากต้องการแยก subdomain อยู่คนละ directory สามารถกำหนดเพิ่มได้ในส่วน VirtualHost เรื่อยๆ หากต้องการตั้งค่า VirtualHost เพียงครั้งเดียวเราสามารถใช้ mod_rewrite เพื่อสร้าง redirect ไปยังไดเรคทอรีใดๆ ที่อยู่ใน DocumentRoot ได้ ตัวอย่างเช่น
webmail.example.com??? ชี้ไปที่ http://www.example.com/webmail
scm.example.com??? ชี้ไปที่ http://www.example.com/scm
dm.example.com??? ชี้ไปที่ http://www.example.com/dm
download.example.com??? ชี้ไปที่ http://www.example.com/download
การตั้งค่า ใน VirtualHost เพื่อ redirect ในแต่ละ request ให้เพิ่มข้อมูลดังนี้

RewriteEngine on
RewriteCond %{http_host} .
RewriteCond %{http_host} !^www.example.com [NC]
RewriteCond %{http_host} ^([^.]+)\.example.com [NC]
RewriteRule ^(.*) http://www.example.com/%1/ [R=301,L,QSA]

ใน กรณีที่เราเรียกใช้ subdomain ที่ไม่มีไดเรคทอรีรองรับ เช่น dummy.example.com จะต้องมีไดเรคทอรี dummy อยู่ที่ DocumentRoot หากไม่มีจะพบข้อความ Error 404 ซึ่งเป็นค่า default หากต้องการกำหนด Error Page เฉพาะในแต่ละ VirtualHost สามารถเพิ่มไฟล์แสดงผล Error ในแบบต่างๆ ของเราลงไปได้

Alias /error/ "/home/www/www.example.com/htdocs"
ErrorDocument 400 /error/invalidSyntax.html
ErrorDocument 401 /error/authorizationRequired.html
ErrorDocument 403 /error/forbidden.html
ErrorDocument 404 /error/fileNotFound.html
ErrorDocument 405 /error/methodNotAllowed.html
ErrorDocument 500 /error/internalServerError.html
ErrorDocument 503 /error/overloaded.html

เท่านี้คุณก็สามารถตั้งค่า DNS แบบ Wildcard เพื่อเชื่อมต่อกับ Apache VirtualHost ได้แล้ว ลองนำไปประยุกต์ใช้ดูนะครับ

ทำ Ubuntu Repository ใช้เองแบบดูดีหน่อย

สืบเนื่องมาจากโครงการพัฒนาลีนุกซ์ฉบับกระเป๋า เมื่อปีที่แล้ว เขียนโครงการไว้นานทำออกมาได้ 2 release แล้วเลิกทำครับ เพราะเข้าใจว่าการ remaster มาผิดทาง เอาเป็นว่าไม่ต้องพูดถึงมันก้อแล้วกันครับ หลายเดือนที่ผ่านมาได้ทดลองประกอบ Ubuntu จนพอเข้าใจบ้างแล้วว่าจะทำ ลีนุกซ์ในแบบฉบับของผมทำได้ยังไง เอาละมาถึงข้อใหญ่ในการทำ repository เพื่อการสนับสนุนซอฟต์แวร์ใหม่ๆ ใน โครงการพัฒนาลีนุกซ์ฉบับกระเป๋า กันครับ จากโครงร่างของ repositry ของ Advance Packaging Tool (APT) ทำให้ทราบว่าการแบ่ง รุ่นในแต่ละเวอร์ชั่นทำโดยการสร้างฐานข้อมูลของ Package ในไดเรคทอรี dists ซึ่งใน dists นี้ก้อจะมี ไดเรคทอรีที่เป็นชื่อแต่ละเวอร์ชั่นอยู่ ในนั้นก้อจะมีไฟล์ฐานข้อมูล Package อยู่ เอาล่ะ คราวนี้ผมก้อแก้ปัญหาในเรื่อง repository กลาง และ การซัพพอร์ทในแต่ละเวอร์ชั่นของโครงการพัฒนาลีนุกซ์ฉบับกระเป๋าได้แล้ว
แนวความคิดในการทำ repository แบบนี้สามารถประยุกต์ใช้ในองค์กรได้ เช่น ฝ่าย IT สามารถทำ repository เล็กๆ เก็ยไฟล์โปรแกรมใหม่ๆ ที่ผ่านการทดสอบแล้วว่าใช้ได้ดี หรือ จัดทำ แก้ไข ใหม่ แล้วเอาไปใส่ไว้ให้เพื่อนๆ พนักงานได้ apt-get ไปใช้กันได้ในสำนักงาน ขั้นตอนง่ายๆ ในการทำ repository มีไม่ยากครับ คือ เอา .deb ของเรานี่แหละไปใส่เอาไว้ที่ไดเรคทอรีที่เก็บไฟล์ deb เอาไว้ ยกตัวอย่างเช่น pool/main เป็นต้น แล้วสร้างฐานข้อมูล Package ออกมาให้เก็บไว้ในไดเรคทอรีในแต่ละเวอร์ชั่น Continue reading ทำ Ubuntu Repository ใช้เองแบบดูดีหน่อย