ป้ายกำกับ

Programming (19) How to (15) Software Engineering (9) App. Guide (3) Theory (1)
แสดงบทความที่มีป้ายกำกับ How to แสดงบทความทั้งหมด
แสดงบทความที่มีป้ายกำกับ How to แสดงบทความทั้งหมด

วันอังคารที่ 17 มิถุนายน พ.ศ. 2557

HBase 0.96.2 Debian Package

เมื่อสองวันก่อนผมได้เขียนแนะนำการใช้งาน Hadoop Debian Package ที่ผมได้นำมาจัดการแก้ไขข้อผิดพลาดและทำ package ขึ้นมาใหม่ไว้แล้ว เพราะต้องการเผยแพร่ให้กับนักศึกษาของผม วันนี้ผมก็ได้ทำ Debian Package ของ HBase ขึ้นมาอีกไฟล์หนึ่ง เนื่องจาก HBase นั้นไม่มี Debian Package ให้ การจัดสภาพแวดล้อมและการตั้งค่าต่างๆ ยังไม่ค่อยจะสอดคล้องกับระบบของ Debian/Ubuntu มากนัก ผมจึงจำเป็นต้องแก้ไข ก็เลยจัดทำเป็น Debian Package ซะเลย จึงต้องการเผยแพร่และเขียนบันทึกแนะนำการใช้งานไว้ ณ. ที่นี้

Download

ไฟล์ที่ได้จัดทำขึ้นนี้เป็น HBase รุ่น 0.96.2 สามารถดาวโหลดได้ที่ Google Drive (md5sum) ซึ่งเป็นรุ่นที่ทำไว้สำหรับใช้งานร่วมกับ Hadoop 1.x สามารถดาวโหลดได้ที่ Google Drive (md5sum) เช่นกัน

Installation

เมื่อดาวโหลดมาแล้ว จะต้องติดตั้ง Hadoop 1.x ให้เรียบร้อยเสียก่อนนะครับ ซึ่งสามารถอ่านรายละเอียดวิธีการติดตั้งได้จากบทความเก่าที่เขียนไว้ จากนั้น สำหรับผู้ที่ใช้ GUI จะสามารถ Double-Click ที่ไฟล์และทำการติดตั้งได้เหมือนโปรแกรมอื่นๆตามปกติ แต่สำหรับผู้ที่ใช้ command-line interface สามารถติดตั้งได้ด้วยคำสั่ง
sudo dpkg -i hbase_0.96.2-hadoop1-SNORM_all.deb
โปรแกรมติดตั้งจะทำการสร้างกุญแจรหัสสำหรับใช้ในการเชื่อมต่อระหว่าง HBase กับ Hadoop โดยกุญแจรหัสนี้ จะสร้างไว้ในนามของ user hdfs จากนั้น จะทำการสร้างโฟลเดอร์ /hbase และโครงสร้างต่างๆสำหรับเก็บข้อมูลบนระบบไฟล์ HDFS ของ Hadoop แล้วจึงตั้งค่าให้บริการต่างๆทำงานอัตโนมัติ ไฟล์และโฟลเดอร์ที่ติดตั้งลงในเครื่องมีดังนี้
  1. /etc/hbase เป็นโฟลเดอร์ที่เก็บ configuration ไฟล์ต่างๆ เช่น hbase-env.sh ซึ่งเป็นไฟล์สำหรับตั้งค่าสภาพแวดล้อมสำคัญๆที่จำเป็น เช่น JAVA_HOME และ HBASE_CONF_DIR เป็นต้น และไฟล์ hbase-site.xml เป็นต้น
  2. /usr/bin และ /usr/sbin เก็บไฟล์โปรแกรม hbase, start-hbase.sh และ stop-hbase.sh
  3. /usr/share/doc/hbase เป็นโฟลเดอร์ที่เก็บเอกสาร คู่มือของ HBase
  4. /usr/share/hbase เป็นโฟลเดอร์ที่เก็บโปรแกรม HBase
  5. /var/log/hadoop/hbase เป็นโฟลเดอร์ที่เก็บ log ไฟล์ของ hbase ใช้ตรวจสอบการทำงานต่างๆหากมีปัญหา
เมื่อเสร็จสิ้นการติดตั้งแล้ว บริการต่างๆจะถูกสั่งให้ start ไว้แล้ว เราก็สามารถตรวจสอบระบบได้ว่ามีบริการต่างๆทำงานอยู่หรือไม่ ซึ่งทำได้ด้วยคำสั่ง
sudo jps
ซึ่งเป็นคำสั่งตรวจสอบ process ของโปรแกรมภาษา Java ทำงานคล้ายกับคำสั่ง ps ของ Unix นะครับ โดยผลลัพธ์จะต้องปรากฏชื่อบริการที่รันอยู่ทั้งหมด 3 บริการคือ
  1. hbase-zookeeper ชื่อที่แสดงคือ HQuorumPeer
  2. hbase-master ชื่อที่แสดงคือ HMaster เปิดเว็บดูได้ที่เว็บ http://localhost:60010
  3. hbase-regionserver ชื่อที่แสดงคือ HRegionServer เปิดเว็บดูได้ที่เว็บ http://localhost:60030
หากมีบริการครบถ้วน แสดงว่าการติดตั้งสำเร็จ แต่หากไม่ครบถ้วน สามารถตรวจสอบข้อผิดพลาดได้ที่ log ไฟล์นะครับ

Start/Stop Service

หากมีปัญหา ต้องการหยุดบริการเพื่อแก้ไขปัญหา และสั่งให้ทำงานใหม่ สามารถสั่งได้ด้วยคำสั่งดังนี้
  • สำหรับ start บริการทั้งหมดคือ zookeeper master และ regionserver ตามลำดับ
sudo start-hbase
  •  สำหรับ stop บริการทั้งหมด
sudo stop-hbase
แต่หากต้องการ start/stop บริการทีละตัวก็สามารถทำได้ด้วยคำสั่ง
  • สำหรับ start บริการทีละตัว
sudo service ชื่อบริการ start
  • สำหรับ stop บริการทีละตัว
sudo service ชื่อบริการ stop
สำหรับชื่อบริการของ HBase นั้น ใช้ชื่อจากหัวข้อที่แล้วนะครับ และบริการเหล่านี้ควรจะ start ตามลำดับที่เรียงไว้ 1-3 และเวลา stop ก็ควรย้อนลำดับกลับ 3-1

Usage

การใช้งานหลักๆคือคำสั่ง hbase หากสั่งโดยไม่ใส่ค่าใดๆจะแสดงข้อความแนะนำการใช้งานดังนี้
Usage: hbase [<options>] <command> [<args>]
Options:
  --config DIR    Configuration direction to use. Default: ./conf
  --hosts HOSTS   Override the list in 'regionservers' file
Commands:
Some commands take arguments. Pass no args or -h for usage.
  shell           Run the HBase shell
  hbck            Run the hbase 'fsck' tool
  hlog            Write-ahead-log analyzer
  hfile           Store file analyzer
  zkcli           Run the ZooKeeper shell
  upgrade         Upgrade hbase
  master          Run an HBase HMaster node
  regionserver    Run an HBase HRegionServer node
  zookeeper       Run a Zookeeper server
  rest            Run an HBase REST server
  thrift          Run the HBase Thrift server
  thrift2         Run the HBase Thrift2 server
  clean           Run the HBase clean up script
  classpath       Dump hbase CLASSPATH
  mapredcp        Dump CLASSPATH entries required by mapreduce
  version         Print the version
  CLASSNAME       Run the class named CLASSNAME
คำสั่งที่ใช้ประจำคือคำสั่ง hbase shell เพื่อเข้าไปจัดการฐานข้อมูล รายละเอียดการใช้งานอื่นๆสามารถศึกษาเพิ่มเติมได้จาก document ที่ /usr/share/doc/hbase/docs นะครับ

วันเสาร์ที่ 14 มิถุนายน พ.ศ. 2557

Hadoop 1.x Debian Re-Package

นานมาแล้ว ผมได้เคยเขียนถึงปัญหาในการติดตั้ง Hadoop 1.x บน Ubuntu โดยใช้ Debian Package ซึ่งตอนนั้นผมเองก็ได้แก้ปัญหาหลายๆอย่างไปเรียบร้อยแล้ว และได้จัดการ repackage ใหม่ คือทำไฟล์ .deb ขึ้นมาใหม่ที่แก้ไขแล้ว แต่ผมก็ไม่ได้เผยแพร่ให้ใครใช้ เพราะไม่แน่ใจว่าจะมีใครต้องการบ้าง จนมาถึงวันนี้ ผมต้องการให้นักศีกษาของผมได้นำไปใช้ จึงคิดว่าน่าจะเขียนแนะนำไว้ตรงนี้เลยจะดีกว่า จึงเป็นที่มาของบันทึกนี้

Download

ไฟล์ที่ได้ทำการแก้ไขแล้ว สามารถดาวโหลดได้ที่ Google Drive (md5sum)

Installation

เมื่อดาวโหลดมาแล้ว สำหรับผู้ที่ใช้ GUI จะสามารถ Double-Click ที่ไฟล์และทำการติดตั้งได้เหมือนโปรแกรมอื่นๆตามปกติ แต่สำหรับผู้ที่ใช้ command-line interface สามารถติดตั้งได้ด้วยคำสั่ง
sudo dpkg -i hadoop_1.2.1-SNORM_amd64.deb
โปรแกรมติดตั้งจะทำการสร้าง group ชื่อ hadoop และ user ชื่อ mapred และ hdfs ขึ้นมา โดยแบ่งหน้าที่ให้ hdfs ใช้จัดการกับระบบไฟล์ HDFS ส่วน mapred ใช้จัดการกับ job และ task นอกจากนี้ ไฟล์และโฟลเดอร์ที่ติดตั้งลงในเครื่องมีดังนี้
  1. /etc/default/hadoop-env.sh เป็นไฟล์สำหรับตั้งค่าสภาพแวดล้อมสำหรับรัน hadoop ซึ่งตัวแปรสำคัญที่จำเป็น เช่น JAVA_HOME และ HADOOP_CONF_DIR เป็นต้น
  2. /etc/hadoop เป็นโฟลเดอร์ที่เก็บ configuration ไฟล์ต่างๆ เช่น core-site.xml และ mapred-site.xml เป็นต้น
  3. /usr/share/doc/hadoop เป็นโฟลเดอร์ที่เก็บเอกสาร คู่มือของ Hadoop
  4. /usr/share/hadoop เป็นโฟลเดอร์ที่เก็บโปรแกรม hadoop
  5. /var/lib/hadoop เป็นโฟลเดอร์ที่เก็บข้อมูลของ hadoop (ระบบไฟล์ HDFS)
  6. /var/log/hadoop เป็นโฟลเดอร์ที่เก็บ log ไฟล์ของ hadoop ใช้ตรวจสอบการทำงานต่างๆหากมีปัญหา

Setup Single-Node Mode

เมื่อติดตั้งเสร็จแล้ว จะยังไม่สามารถใช้งานได้ทันที เนื่องจากเราจะต้องทำการตั้งค่า Configuration อีกหลายอย่าง รวมทั้งการ Format ระบบไฟล์ HDFS ขึ้นมาก่อน (เสมือนการ Format Harddisk) ซึ่งหากยังไม่คุ้นเคยกับ Hadoop มากนัก ผมขอแนะนำให้ใช้ค่า default คือการตั้งค่าให้ Hadoop ทำงานในโหมด Single Node (ทำงานอยู่บนเครื่องเดียว) โดยใช้คำสั่งดังนี้
sudo hadoop-setup-singlenode.sh
คำสั่งนี้จะแสดงหัวข้อให้เลือกว่าจะทำอะไรบ้าง นั่นคือ
  1. ถามว่าจะใช้ค่า default ของ single-node หรือไม่
  2. ถามว่าจะ format HDFS หรือไม่
  3. ถามว่าจะให้สร้างโครงสร้าง directory ต่างๆบน HDFS ด้วยหรือไม่
  4. ถามว่าจะให้รัน Hadoop ด้วยเลยหรือไม่
  5. ถามว่าจะให้ตั้งค่าให้รัน Hadoop เมื่อ reboot เครื่องด้วยหรือไม่
ให้ตอบ y ทั้งหมดเลย และเนื่องจากในข้อ 4 ระบุให้รัน Hadoop เลย เมื่อเสร็จสิ้นการ setup นี้แล้ว ดังนั้น เมื่อเสร็จสิ้นการ setup เราก็สามารถตรวจสอบระบบได้ว่า มี Hadoop ทำงานอยู่หรือไม่ ซึ่งทำได้ด้วยคำสั่ง
sudo jps
ซึ่งเป็นคำสั่งตรวจสอบ process ของโปรแกรมภาษา Java ทำงานคล้ายกับคำสั่ง ps ของ Unix นะครับ โดยผลลัพธ์จะต้องปรากฏชื่อบริการที่รันอยู่ทั้งหมด 4 บริการคือ
  1. hadoop-namenode ชื่อที่แสดงคือ NameNode เปิดเว็บดูได้ที่เว็บ http://localhost:50070
  2. hadoop-datanode ชื่อที่แสดงคือ DataNode
  3. hadoop-jobtracker ชื่อที่แสดงคือ JobTracker เปิดเว็บดูได้ที่เว็บ http://localhost:50030
  4. hadoop-tasktracker ชื่อที่แสดงคือ TaskTracker
หากมีบริการครบถ้วน แสดงว่าการติดตั้งสำเร็จ

Start/Stop Service

หากเลือกให้บริการต่างๆทำงานอัตโนมัติตอนเปิดเครื่องเลย (ตอบ y ข้อ 5) เราก็ไม่จำเป็นต้องสั่งให้บริการทำงานด้วยตัวเองแต่อย่างใด แต่หากมีปัญหา ต้องการหยุดบริการเพื่อแก้ไขปัญหา และสั่งให้ทำงานใหม่ สามารถสั่งได้ด้วยคำสั่งดังนี้
  • Start Services
sudo service ชื่อบริการ start
  • Stop Services
sudo service ชื่อบริการ stop
สำหรับชื่อบริการของ Hadoop นั้น ใช้ชื่อจากหัวข้อที่แล้วนะครับ และบริการเหล่านี้ควรจะ start ตามลำดับที่เรียงไว้ 1-4 และเวลา stop ก็ควรย้อนลำดับกลับ 4-1

นอกจากนี้ ผมได้เขียน script สำหรับ start/stop ไว้เพื่อให้สะดวกต่อการใช้งานไว้ด้วย คือคำสั่ง start-hadoop และ stop-hadoop ซึ่งสามารถเรียกใช้ได้เลย

Hadoop File System

เมื่อบริการทุกอย่างทำงานได้เรียบร้อยแล้ว และได้ Format HDFS เรียบร้อยแล้ว ซึ่งจะสามารถเข้าไปจัดการไฟล์ต่างๆในระบบได้ด้วยคำสั่ง hadoop แต่เนื่องจากตอนที่เรา Format และมีการเตรียมโครงสร้างไฟล์ต่างๆไว้ในเบื้องต้นนั้น โปรแกรม hadoop-setup-singlenode.sh ได้ใช้ user hdfs เป็นผู้สร้างโครงสร้างไฟล์ทั้งหมด ทำให้สิทธิ์ในการเข้าถึงไฟล์และโฟลเดอร์ต่างๆเป็นของ hdfs ดังนั้น เราควรจะใช้ user hdfs นี้จัดการ ซึ่งสามารถทำได้หลายแบบ เช่น ใช้คำสั่ง
sudo su hdfs
เป็นการเปลี่ยนไปใช้ user hdfs  เสมือนว่าเรา login ด้วย hdfs เมื่อเสร็จงานแล้ว เราจะต้องสั่ง exit เพื่อกลับออกมาเป็น user เดิม

หรืออีกวิธีหนึ่งคือใช้คำสั่ง sudo -u hdfs นำหน้าคำสั่งที่ต้องการทุกครั้ง ซึ่งหากพิมพ์คำสั่ง
sudo -u hdfs hadoop
โดยไม่ระบุค่าใดๆ โปรแกรมจะแสดงข้อความแนะนำการใช้งานดังนี้
Usage: hadoop [--config confdir] COMMAND
where COMMAND is one of:
  namenode -format     format the DFS filesystem
  secondarynamenode    run the DFS secondary namenode
  namenode             run the DFS namenode
  datanode             run a DFS datanode
  dfsadmin             run a DFS admin client
  mradmin              run a Map-Reduce admin client
  fsck                 run a DFS filesystem checking utility
  fs                   run a generic filesystem user client
  balancer             run a cluster balancing utility
  oiv                  apply the offline fsimage viewer to an fsimage
  fetchdt              fetch a delegation token from the NameNode
  jobtracker           run the MapReduce job Tracker node
  pipes                run a Pipes job
  tasktracker          run a MapReduce task Tracker node
  historyserver        run job history servers as a standalone daemon
  job                  manipulate MapReduce jobs
  queue                get information regarding JobQueues
  version              print the version
  jar <jar>            run a jar file
  distcp <srcurl> <desturl> copy file or directories recursively
  distcp2 <srcurl> <desturl> DistCp version 2
  archive -archiveName NAME -p <parent path> <src>* <dest> create a hadoop archive
  classpath            prints the class path needed to get the
                       Hadoop jar and the required libraries
  daemonlog            get/set the log level for each daemon
 or
  CLASSNAME            run the class named CLASSNAME
Most commands print help when invoked w/o parameters.
คำสั่งที่มักใช้บ่อยก็คือ fs ซึ่งจะใช้สำหรับจัดการไฟล์บนระบบ HDFS และมีคำสั่งย่อยซึ่่งจะคล้ายๆกับคำสั่งของ Unix เช่น ls,  mv, cp, chmod, chown ฯลฯ เป็นต้น โดยเมื่อเราสั่ง hadoop fs โดยไม่ระบุค่าใดๆ จะแสดงข้อความแนะนำคำสั่งของ fs ดังนี้
 Usage: java FsShell
           [-ls <path>]
           [-lsr <path>]
           [-du <path>]
           [-dus <path>]
           [-count[-q] <path>]
           [-mv <src> <dst>]
           [-cp <src> <dst>]
           [-rm [-skipTrash] <path>]
           [-rmr [-skipTrash] <path>]
           [-expunge]
           [-put <localsrc> ... <dst>]
           [-copyFromLocal <localsrc> ... <dst>]
           [-moveFromLocal <localsrc> ... <dst>]
           [-get [-ignoreCrc] [-crc] <src> <localdst>]
           [-getmerge <src> <localdst> [addnl]]
           [-cat <src>]
           [-text <src>]
           [-copyToLocal [-ignoreCrc] [-crc] <src> <localdst>]
           [-moveToLocal [-crc] <src> <localdst>]
           [-mkdir <path>]
           [-setrep [-R] [-w] <rep> <path/file>]
           [-touchz <path>]
           [-test -[ezd] <path>]
           [-stat [format] <path>]
           [-tail [-f] <file>]
           [-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
           [-chown [-R] [OWNER][:[GROUP]] PATH...]
           [-chgrp [-R] GROUP PATH...]
           [-help [cmd]]
Generic options supported are
-conf <configuration file>     specify an application configuration file
-D <property=value>            use value for given property
-fs <local|namenode:port>      specify a namenode
-jt <local|jobtracker:port>    specify a job tracker
-files <comma separated list of files>    specify comma separated files to be copied to the map reduce cluster
-libjars <comma separated list of jars>    specify comma separated jar files to include in the classpath.
-archives <comma separated list of archives>    specify comma separated archives to be unarchived on the compute machines.
The general command line syntax is
bin/hadoop command [genericOptions] [commandOptions]
เช่น หากเราต้องการแสดงรายชื่อไฟล์และโฟลเดอร์ต่างๆที่โฟลเดอร์ root เหมือนคำสั่ง ls / สามารถสั่งได้ดังนี้
sudo -u hdfs hadoop fs -l /
หากต้องการอัพโหลดไฟล์จากเครื่องเข้าสู่ระบบ สามารถใช้คำสั่ง -put เช่น
sudo -u hdfs hadoop fs -put local.txt /tmp/hdfs.txt
หมายถึงการอัพโหลดไฟล์ชื่อ local-test.txt จากเครื่องของเรา เข้าสู่ระบบที่โฟลเดอร์ /tmp โดยเปลี่ยนเป็นชื่อ hdfs.txt เป็นต้น
หากต้องการดาวโหลดไฟล์จากระบบมาที่เครื่อง สามารถใช้คำสั่ง -get เช่น
sudo -u hdfs hadoop fs -get /tmp/hdfs.txt hdfs2.txt
หมายถึงการดาวโหลดไฟล์ชื่อ hdfs.txt ที่โฟลเดอร์ /tmp จากระบบมาสู่เครื่อง โดยเปลี่ยนชื่อเป็น hdfs2.txt เป็นต้น
sudo -u hdfs hadoop fs -rm /tmp/hdfs.txt
หมายถึงการลบไฟล์ /tmp/hdfs.txt บนระบบ เป็นต้น ส่วนคำสั่งอื่นๆก็ใช้งานลักษณะเดียวกัน

วันศุกร์ที่ 21 มีนาคม พ.ศ. 2557

Setup Android on Ubuntu

ตั้งแต่ที่ผมได้ทดลองเขียนโปรแกรมบน Android ครั้งแรกก็นานมากแล้ว หลายๆอย่างเปลี่ยนไปเร็วมาก จาก Android เวอร์ชั่น 2.3 มาตอนนี้เป็นเวอร์ชั่น 4.4 ดูตัวเลขแล้วก็ไม่ได้มากมายอะไรเลย แต่ถ้านับเป็นรุ่นของ Platform API ก็คือตั้งแต่ Platform API 10 (2.3.3) มาเป็น Platform API 19 (4.4.2)  ผ่านไปตั้งเกือบ 10 รุ่น ทำให้หลายๆคนก็ท้อแท้ไปเลยก็มี เพราะว่าตามไม่ทันจริงๆ สำหรับผมนั้น ขอเรียกว่าตามดูอยู่ห่างๆก็แล้วกัน พอดียังไม่ค่อยจะมีงานที่ต้องใช้ จึงยังไม่ทุ่มเทเวลาให้มันมากนัก วันนี้พอจะมีเวลา ก็เลยลองกลับมารื้อฟื้นความจำสักหน่อย แต่บังเอิญเครื่องที่ใช้อยู่ไม่ได้ลงโปรแกรมไว้ ก็เลยต้องเริ่มต้นใหม่ตั้งแต่การติดตั้งกันเลย

เครื่องที่ผมใช้เป็น Ubuntu 12.04 LTS ติดตั้ง Eclipse 3.7.2 ซึ่งเป็น Eclipse ที่มากับ Ubuntu นะครับ ผมจะเน้นใช้ Package ที่มาพร้อมกับ OS มากกว่าการดาวโหลด Eclipse มาใหม่ๆ เพราะมักจะเจอปัญหาเข้ากันไม่ได้กับ Package โน่น นั่น นี่ ทำให้เราปวดหัว แต่ถ้าจำเป็นจริงๆ ผมก็จะใช้ตัวใหม่นะครับ

ADT (Android Developer Tools)

Android Developer Tools หรือเรียกย่อๆว่า ADT นั้น เป็นเครื่องมือสำหรับพัฒนาโปรแกรมบน Android ซึ่งทั้งหมดจะประกอบไปด้วย
  • Eclipse + ADT Plugin: Eclipse IDE ที่ติดตั้ง ADT Plugin เพื่อให้ Eclipse เชื่อมต่อกับ Tools ต่างๆของ Android ได้
  • Android SDK Tools: ประกอบไปด้วยเครื่องมือต่างๆสำหรับการพัฒนา ทดสอบ และดีบั๊กโปรแกรม เช่น ตัว emulator เป็นต้น เครื่องมือเหล่านี้จะอยู่ในโฟลเดอร์ <ANDROID_SDK>/tools
  • Android Platform Tools: ประกอบไปด้วยเครื่องมือที่ขึ้นอยู่กับแพล็ตฟอร์มสำหรับการพัฒนา ทดสอบ และดีบั๊กโปรแกรม เช่น ตัว debugger เป็นต้น เครื่องมือเหล่านี้จะอยู่ในโฟลเดอร์ <ANDROID_SDK>/platform-tools
  • Android Platform: ประกอบไปด้วย API Library ต่างๆของ Platform แต่ละรุ่น โดยเฉพาะไฟล์ android.jar โดยเราสามารถเลือกรุ่นที่เราต้องการพัฒนามาติดตั้งไว้ได้ (แต่ควรเป็นรุ่นล่าสุด) ซึ่งจะอยู่ในโฟลเดอร์ <ANDROID_SDK>/platforms/android-<รุ่น>
  • Android System Image: ประกอบไปด้วย Image ไฟล์ของ OS บนแต่ละสถาปัตยกรรม เช่น ARM หรือ x86 เป็นต้น โดยแยกเป็น Platform แต่ละรุ่น ซึ่งเราสามารถเลือกรุ่นที่เราต้องการพัฒนามาติดตั้งไว้ได้ (แต่ควรเป็นรุ่นล่าสุด) ซึ่งจะอยู่ในโฟลเดอร์ <ANDROID_SDK>/system-images/android-<รุ่น>
ทั้งหมดที่แจกแจงไปนั้นเป็นเฉพาะเครื่องมือที่จำเป็นสำหรับพัฒนาเท่านั้นนะครับ แต่จริงๆแล้ว สิ่งที่ขาดไม่ได้เลยสำหรับนักพัฒนาก็คือ คู่มือ ครับ เพราะมีคำสั่งมากมายที่เราเองก็ไม่เคยจำได้ ต้องเปิดคู่มือเป็นประจำ แต่ส่วนใหญ่เท่าที่พบเห็นมือใหม่ทั้งหลาย เมื่อติดตั้ง IDE เสร็จแล้ว ก็ไม่ค่อยจะสนใจติดตั้ง API Document กันเลย เวลาเขียนโปรแกรมก็เลยต้องเปิดบราวเซอร์ไปด้วยเขียนโปรแกรมไปด้วย จริงๆแล้ว ถ้าสามารถติดตั้งได้ เช่น มีเนื้อที่ใน HDD เหลือเฟือ ก็ควรจะติดตั้งไว้ในเครื่องด้วย จะได้ไม่ต้องต่ออินเตอร์เน็ตอยู่ตลอดเวลาที่พัฒนาโปรแกรมครับ อีกทั้งส่วนใหญ่ IDE เก่งอย่าง Eclipse จะสามารถดึงเอาคำอธิบายใน Document มาให้เราอ่านได้ทันทีที่เราพิมพ์คำสั่งที่ต้องการ จะสะดวกมากๆเลยจริงๆครับ

Setup

เมื่อเรารู้แล้วว่าเครื่องมือต่างๆที่จำเป็นจะต้องมีอะไรบ้าง ต่อไปก็ถึงขั้นตอนการติดตั้ง ซึ่งจริงๆแล้วก็ไม่ได้ยุ่งยากอะไร เพราะ Google ได้จัดทำ package สำเร็จรูปไว้แล้ว ผมจึงขอแยกวิธีการติดตั้งออกเป็น 3 วิธีนะครับ
  1. Bundle: เป็น package ที่มีทุกอย่างทั้ง Eclipse และ SDK ครบถ้วน บีบอัดไว้อยู่ในไฟล์เดียว สามารถดาวโหลดมาแล้วแตกไฟล์ออกมา และใช้งานได้เลยทันที โดยเข้าไปที่โฟลเดอร์ eclipse แล้วรันโปรแกรม eclipse เท่านี้ก็พัฒนาโปรแกรมได้เลย ทำให้สะดวกใช้มาก แต่ก็มีข้อเสียคือ เราแทบจะไม่รู้อะไรเลย
  2. Existing IDE: หากเรามี Eclipse อยู่แล้ว ก็สามารถติดตั้งทุกอย่างลงใน Eclipse ที่มีอยู่ได้เลย เพราะ Eclipse ออกแบบมาให้สามารถเพิ่มเติมความสามารถต่างๆได้ด้วย plugin ทำให้เราไม่ต้องมี Eclipse อยู่ถึงสองตัวในเครื่องเดียว ส่วนวิธีการนั้น จะขออธิบายในหัวข้อถัดไปนะครับ
  3. Android Studio: เป็น package แบบใหม่ที่คล้ายกับ Bundle คือมีทุกอย่างครบถ้วนใน package เดียว เพียงแต่ใช้กับ IntelliJ IDEA ซึ่งเป็น IDE ของ JetBrains ใครชอบ IDE ตัวนี้ก็สามารถดาวโหลดมาทดลองใช้ได้เลยนะครับ จริงๆแล้วผมเองไม่ค่อยประทับใจ Eclipse มากสักเท่าไรครับ ภาพข้างล่างนี้คือหน้าตาของ Android Studio แต่ผมยังไม่มีเวลาทดลองใช้ แค่รันดูเฉยๆครับ
Android Studio

Existing IDE Setup

หากมี Eclipse อยู่แล้ว (ซึ่งผมต้องการใช้ Eclipse ที่มีมากับ Ubuntu ตามที่ได้เกริ่นไว้) ขั้นตอนแรกเลยก็คือการติดตั้ง ADT Plugin ซึ่งจะเป็นตัวเชื่อมทุกอย่างเข้ากับ Eclipse โดยเราสามารถเลือกเมนู Help/Install New Software ใน Eclipse จากนั้นกดปุ่ม Add เพื่อเพิ่ม Repository โดยอาจจะตั้งชื่อว่า ADT Plugin และป้อน URL ดังนี้
https://dl-ssl.google.com/android/eclipse/
เมื่อติดตั้ง Plugin เสร็จแล้ว restart Eclipse จะปรากฎหน้าต่าง "Welcome to Android Development"  และให้เราป้อนโฟลเดอร์ของ Android SDK ซึ่งมีสองทางเลือก คือ ป้อนโฟลเดอร์ใหม่ โดยจะดาวโหลด Android SDK มาติดตั้ง หรือ เลือกโฟลเดอร์ที่เราได้แตกไฟล์ Android SDK ที่ดาวโหลดมาไว้แล้ว ในกรณีนี้ ผมยังไม่เคยแนะนำให้ดาวโหลด Android SDK มาก่อน จึงเลือกที่จะป้อนโฟลเดอร์ใหม่ให้ดาวโหลดมาติดตั้ง ซึ่งเมื่อติดตั้งเสร็จ จะปรากฎหน้าต่าง Android SDK Manager ดังภาพ
Android SDK Manager
ใน Android SDK Manager นี้ เราสามารถเลือกที่จะติดตั้ง Tools และ Platform ต่างๆได้ โดย Tools ที่จะต้องติดตั้งหลักๆก็คือ SDK Platform และ Build ส่วน Platform API ให้เลือกรุ่นที่ตรงกับอุปกรณ์เป้าหมายที่โปรแกรมของเราจะนำไปติดตั้ง สามารถเลือกติดตั้งไว้หลายๆรุ่นก็ได้ แล้วเลือกใช้อีกทีตอนพัฒนาโปรแกรมนะครับ เมื่อเลือกเสร็จแล้ว กดปุ่ม Install จะมีการติดตั้งส่วนอื่นๆที่จำเป็นร่วมด้วย สังเกตุให้ดีว่า เราได้ติดตั้งทุกอย่างครบถ้วนแล้วนะครับ ที่สำคัญ อย่าลืมเลือกติดตั้ง Documentation ด้วยนะครับ

ผมขอจบเรื่องไว้เท่านี้ก่อนนะครับ เรื่องการพัฒนาโปรแกรมบน Android ไว้โอกาสหน้าจะมาเล่าต่อว่า ผมจะทำอะไรบ้าง

วันเสาร์ที่ 8 กุมภาพันธ์ พ.ศ. 2557

HBase Installation

หลังจากที่ผมได้ทำการติดตั้ง Hadoop 1.2.1 บน Ubuntu 12.04 LTS ไปเรียบร้อยแล้ว ซึ่งก็จะได้โครงสร้างพื้นฐานของการประมวลผลแบบกระจายแบบ MapReduce บน HDFS (Hadoop Distributed File System) แต่การประมวลผลแบบ MapReduce บน HDFS นั้น ค่อนข้างมีความซับซ้อนพอสมควร ผมจึงยังไม่อยากแนะนำ ถ้าหากใครสนใจ สามารถอ่านเพิ่มเติมได้จากลิ้งค์อ้างอิงท้ายบทความนี้นะครับ

แต่สิ่งที่ผมอยากจะแนะนำในบทความนี้ก็คือ HBase ครับ ซึ่งก็คือระบบฐานข้อมูลแบบกระจายของ Hadoop และสามารถรองรับข้อมูลขนาดใหญ่มาก (Big Data) ในระดับ พันล้าน row และ ล้าน column ได้ โดย HBase จะจัดเก็บข้อมูลแบบกระจายอยู่บน HDFS และคำสั่งที่จะ Create Read Update Delete (CRUD) นั้นจะเป็นการประมวลผลแบบกระจายแบบ MapReduce น่าสนใจไหมครับ หากใครสนใจก็คอยติดตามอ่านบทความต่อๆไปด้วยนะครับ เพราะครั้งนี้ผมจะเริ่มต้นที่การติดตั้งก่อน

HBase Version

สำหรับรุ่น stable ปัจจุบันนั้น เป็นรุ่น 0.94.15 แต่มีรุ่นใหม่ล่าสุดคือ 0.96.1.1 เนื่องจาก Hadoop ได้แตกออกเป็น 2 รุ่นคือ 1.x และ 2.x ซึ่ง HBase รุ่นไหนควรใช้กับ Hadoop รุ่นไหนนั้น สามารถดูได้จากตารางในหัวข้อ 2.1.3 บทที่ 2 เรื่อง Apache HBase Configuration ของหนังสือ The Apache HBase™ Reference Guide

เนื่องจากผมใช้ Hadoop 1.2.1 และ HBase 0.96.0 ผ่านการทดสอบกับ Hadoop 1.1.x แล้ว (เสียดายที่ไม่มีข้อมูลรุ่นใหม่ล่าสดุ) ผมจึงคาดว่า HBase รุ่นใหม่ล่าสุดนี้ น่าจะใช้กับ Hadoop 1.2.1 ได้ (หวังว่าผมจะคาดการณ์ไม่ผิดนะ) จึงทดลองดาวโหลด Binary Package (hbase-0.96.1.1-hadoop1-bin.tar.gz) มาติดตั้ง

Operation Mode

HBase จะประกอบไปด้วยบริการ 3 ประเภทคือ
  1. master (HMaster) เป็นบริการหลักของ HBase ซึ่งจะคอยตรวจสอบการทำงานของ regionserver โดยปกติแล้วจะทำงานอยู่บน NameNode ของ Hadoop
  2. regionserver (HRegionServer) เป็นบริการที่ทำหน้าที่ดูแลและจัดการข้อมูลภายใน region นั้นๆ โดยปกติแล้วจะทำงานอยู่บน DataNode ของ Hadoop
  3. zookeeper (HQuorumPeer) เป็นบริการที่ทำหน้าที่ผสานงานระหว่างเครื่องต่างๆในระบบประมวลผลแบบกระจาย ซึ่ง HBase นำมาใช้ผสานงานระหว่างเครื่อง HMaster และ HRegionServer
ซึ่งบริการทั้ง 3 ประเภท สามารถทำงานอยู่บนเครื่องๆเดียวได้ (Single-Node โหมด) โดย HBase มีโหมดการทำงาน 3 โหมดเช่นเดียวกัน Hadoop  คือ Standalone Pseudo-Distributed และ Fully-Distributed สำหรับ Standalone นั้น จะไม่ทำงานเป็นเครือข่าย และข้อมูลจะถูกจัดเก็บแบบไฟล์ปกติ จะไม่ใช้ HDFS ส่วนการทำงานในโหมด Pseudo-Distributed และ Fully-Distributed จะทำงานเป็นเครือข่าย และข้อมูลจะถูกจัดเก็บอยู่ใน HDFS ของ Hadoop

Setup Single-Node Mode

เนื่องจาก HBase ไม่มี Debian Package ให้ มีแต่ Binary Package และภายใน Package จะมีทั้งโปรแกรมและ config ไฟล์รวมๆกันอยู่ ไม่ได้แยก config ไฟล์ไปไว้ที่ /etc แต่อย่างใด ผมจึงเลือกที่จะแตกไฟล์ไว้ที่ /usr/local แทน ด้วยคำสั่ง
cd /usr/local
sudo tar xzf /path/to/hbase-0.96.1.1-hadoop1-bin.tar.gz
Configuration ไฟล์ที่เกี่ยวข้องจะอยู่ในโฟลเดอร์ conf มีไฟล์ต่างๆดังนี้
  1. hbase-env.sh
    • กำหนดค่า JAVA_HOME ใหม่ให้ถูกต้อง สำหรับค่า default ที่กำหนดไว้คือ /usr/java/jdk1.6.0/ แต่เนื่องจากบน Ubuntu จะใช้ OpenJDK เป็นหลัก ผมจึงเปลี่ยนค่าให้เป็น /usr/lib/jvm/default-java ซึ่งจะใช้ default JDK ที่ติดตั้งไว้ โดยปกติแล้ว Ubuntu 12.04 LTS จะใช้ OpenJDK 6 ซึ่งน่าจะเข้ากันได้ดี แต่เนื่องจากผมมีโปรแกรมบางตัวที่ใช้ Java 7 จึงเปลี่ยนมาใช้ OpenJDK 7 (หวังว่าจะไม่มีปัญหา)
    • กำหนดค่า HBASE_MANAGES_ZK=true ซึ่งจะทำให้มีการ start zookeeper อัตโนมัติพร้อมๆกับตอน start HBase (โดย default ค่านี้จะเป็น true อยู่แล้ว เราอาจจะไม่กำหนดก็ได้)
  2. hbase-site.xml
    • ค่า default ต่างๆระบุไว้ที่หัวข้อ 2.3.1.1 เรื่อง HBase Default Configuration ของหนังสือ The Apache HBase™ Reference Guide ทำให้เราไม่จำเป็นต้องระบุค่าทุกๆค่า ซึ่งมีจำนวนมาก เราสามารถระบุเฉพาะค่าที่ไม่ตรงกับ default ก็พอ
    • กำหนดค่า hbase.rootdir เพื่อระบุว่าข้อมูล HBase ทั้งหมดจะอยู่ที่ไหน เช่น เก็บไว้ที่ /hbase ใน HDFS ซึ่งสามารถเข้าถึงได้ดังนี้
          <property>
              <name>hbase.rootdir</name>
              <value>hdfs://localhost:8020/hbase</value>
          </property>
    • กำหนดค่า hbase.cluster.distributed เป็น true
    • กำหนดค่า hbase.zookeeper.quorum เป็นรายชื่อเครื่องทั้งหมดที่อยู่ในกลุ่มของ HBase ในที่นี้เราตั้งค่าสำหรับ Single-Node จึงกำหนดให้มีเพียง localhost เท่านั้น
เนื่องจากเรากำหนดให้ HBase จัดเก็บข้อมูลไว้ที่ /hbase ตามที่ตั้งค่าไว้ใน hbase-site.xml เราจึงต้องสร้างโฟลเดอร์เตรียมไว้ด้วยคำสั่ง
hadoop fs -mkdir /hbase
หากไม่สามารถสร้างได้ เนื่องจากปกติแล้ว Hadoop ที่ติดตั้งด้วย Debian Package จะใช้ user ชื่อ hdfs ในการจัดการ HDFS แทนที่จะใช้ root เราจึงอาจจะต้องสั่งสร้าง /hbase ด้วยคำสั่ง
sudo -u hdfs hadoop fs -mkdir /hbase
จากนั้น จึงสร้าง user root บนระบบ Hadoop ด้วยคำสั่ง
hadoop-create-user.sh -u root
แล้วกำหนดสิทธิ์ให้ user root สามารถจัดการ /hbase ได้ ด้วยการเปลี่ยนเจ้าของ โดยสั่ง
sudo -u hdfs hadoop fs -chown root /hbase
หากตรวจสอบโฟลเดอร์ที่สร้างขึ้นด้วยคำสั่ง hadoop fs -ls / ดูจะพบว่า /hbase เปลี่ยนเป็นของ root เรียบร้อยดังนี้
# hadoop fs -ls /
Found 3 items
drwx------   - root supergroup          0 2014-02-08 17:58 /hbase
drwxrwxrwx   - hdfs supergroup          0 2014-02-07 10:29 /tmp
drwxr-xr-x   - hdfs supergroup          0 2014-02-07 15:19 /user

Start/Stop Service

เนื่องจากการ start/stop บริการต่างๆของ HBase นั้น จะมีการติดต่อไปยัง Hadoop ด้วย ssh ซึ่งจะมีการถามรหัสผ่านทุกครั้ง ทำให้ไม่สะดวกต่อการสั่งงาน โดยเฉพาะหากเราต้องการตั้งให้มีการ start/stop อัตโนมัติ การที่เราจะใช้ ssh โดยไม่ต้องป้อนรหัสผ่านเลยนั้น จะต้องใช้กุญแจอิเล็กทรอนิกส์เป็นรหัสผ่านแทน ซึ่งสามารถตรวจสอบว่ามีการตั้งค่ากุญแจอิเล็กทรอนิกส์สำหรับ root ไว้แล้วหรือยังโดยใช้คำสั่ง
sudo ssh localhost
หากสามารถเข้าได้โดยไม่ต้องป้อนรหัสผ่าน แสดงว่าเราได้เคยตั้งค่ากุญแจรหัสอิเล็กทรอนิกส์ไว้แล้ว (อาจจะมีโปรแกรมบางชนิดมีการแนะนำให้ทำไว้แล้ว) ถ้าหากต้องป้อนรหัสผ่าน แสดงว่ายังไม่ได้ตั้งค่ากุญแจอิเล็กทรอนิกส์ไว้ เราจะต้องสร้างกุญแจขึ้นมาใหม่ด้วยคำสั่ง ssh-keygen ดังนี้
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
คำสั่งนี้ จะสร้างกุญแจรหัสของเราขึ้นมา โดยเก็บไว้ที่ไฟล์ ~/.ssh/id_dsa ซึ่งเป็นกุญแจส่วนตัวของเรา (Private Key) และจะมีไฟล์ ~/.ssh/id_dsa.pub ซึ่งเป็นกุญแจสาธารณะ (Public Key) สำหรับให้ผู้ที่เราจะติดต่อแลกเปลี่ยนข้อมูลกัน โดยเราจะต้องนำเอากุญแจสาธารณะไปไว้ที่ไฟล์ ~/.ssh/authorized_keys ของเครื่องที่เราจะติดต่อด้วย โดยใช้คำสั่งดังนี้
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
เมื่อตั้งค่ากุญแจรหัสอิเล็กทรอนิกส์แล้ว ก็จะสามารถสั่ง start/stop บริการต่างๆของ HBase ได้อย่างราบรื่น ซึ่งมีสคริปท์ให้เราเรียกใช้ได้อยู่ในโฟลเดอร์ bin คือ สั่ง start ด้วยคำสั่ง
sudo /path/to/hbase/bin/start-hbase.sh
สั่ง stop บริการด้วย
sudo /path/to/hbase/bin/stop-hbase.sh

ปัญหาที่อาจจะเกิดขึ้น

เมื่อ start HBase แล้ว ตรวจสอบบริการต่างๆด้วยคำสั่ง jps ต้องพบบริการ master (HMaster) regionserver (HRegionServer) และ zookeeper (HQuorumPeer) หากบริการใดไม่ทำงาน ควรตรวจสอบดูข้อผิดพลาดใน log ไฟล์ เช่น ถ้า master ไม่ทำงาน log ไฟล์ของ master แสดงข้อความ
FATAL [master:SLOffice:60000] master.HMaster: Unhandled exception. Starting shutdown.
org.apache.hadoop.security.AccessControlException: org.apache.hadoop.security.AccessControlException: Permission denied: user=root, access=WRITE, inode="":hdfs:supergroup:rwxr-xr-x

ซึ่งหมายความว่า HBase กำลังเข้าถึง HDFS ด้วย user root เพื่อที่จะเขียนข้อมูล แต่ไม่มีสิทธิ์ แสดงว่าเราอาจจะลืมทำขั้นตอนที่สร้าง /hbase และเปลี่ยนสิทธิ์ให้ root เป็นต้น

อ้างอิง

  1. สมชัย หลิมศิโรรัตน์, Hadoop 1.x Installation on Ubuntu
  2. The Apache Software Foundation, MapReduce Tutorial
  3. The Apache Software Foundation, HDFS Architecture Guide
  4. The Apache Software Foundation, HBase
  5. The Apache Software Foundation, The Apache HBase™ Reference Guide

วันพุธที่ 15 มกราคม พ.ศ. 2557

Hadoop 1.x Installation on Ubuntu

เมื่อประมาณเกือบๆ 1 ปีที่ผ่านมา ผมได้ติดตั้ง Hadoop รุ่น 1.1.2 บน Ubuntu 12.04 LTS เรียบร้อยไปแล้ว ซึ่งตอนนั้นมีปัญหาในการติดตั้งบางอย่าง แต่ผมก็ได้แก้ปัญหาไปแล้ว แต่มาเมื่อสัปดาห์ก่อน ผมต้องการติดตั้ง Hadoop บนอีกเครื่องหนึ่ง ทำให้ผมต้องมารื้อฟื้นความจำว่าปัญหาเก่าๆที่เคยแก้ไปนั้น ผมทำอย่างไร แต่นึกเท่าไหร่ก็นึกไม่ออกสักที ไฟล์เก่าๆที่เคยบันทึก หรือ เขียนสคริปท์ไว้ ตอนนี้ก็ไม่รู้เก็บไว้ที่ไหนแล้ว เนื่องจากผมมีการ backup ไฟล์ไว้หลายที่ กระจัดกระจายกันไป ไม่มีเวลามาจัดให้เข้าที่เข้าทางสักที (ดูเหมือนจะเป็นปัญหาคลาสสิกสำหรับคนไอทีเลยก็ว่าได้ ใครมีไอเดียดีๆที่ช่วยแก้ปัญหานี้ได้น่าจะทำโปรแกรมขายได้นะครับ) ครั้งนี้ผมจึงอาศัยการบันทึกไว้ที่บล็อกนี้แทน และหวังว่าจะเป็นประโยชน์สำหรับบางคนที่ติดปัญหาเดียวกัน

Hadoop Version

รุ่นของ Hadoop ที่เมื่อก่อนผมเลือกใช้ คือ 1.1.2 ตอนนั้น น่าจะเป็นรุ่นใหม่ที่ stable ที่สุดแล้ว แต่ปัจจุบันนี้ มีรุ่นที่เป็น stable อยู่ 2 รุ่น เนื่องจากมีการแตกรุ่นออกเป็น 1.x และ 2.x โดยรุ่น stable ของ 1.x คือ 1.2.1 ส่วนรุ่น stable ของ 2.x คือ 2.2.0 ครับ
  • 1.x stable -> 1.2.1 (1 Aug, 2013)
  • 2.x stable -> 2.2.0 (15 Oct, 2013)
ทีแรกผมจะทดลองติดตั้ง 2.x แต่ก็เกรงว่า โปรแกรมเก่าจะใช้งานไม่ได้ ประกอบกับ เมื่อเข้าไปดาวโหลดไฟล์แล้ว ปรากฏว่า ไม่มี Debian Package ให้ดาวโหลด ผิดกับ 1.2.1 ที่มี Package ทั้งแบบ Debian (.deb) RedHat(.rpm) และ Binary(.tar.gz) รวมทั้งมีทั้งสถาปัตยกรรมแบบ i386 และ x86_64 ให้ครบหมด ผมจึงตัดสินใจดาวโหลด 1.2.1 มาลง ซึ่งก็พบว่าปัญหาเดิมที่พบใน 1.1.2 ยังไม่ได้รับการแก้ไข

Why Debian Package?

ระบบปฏิบัติการ Ubuntu นั้น มีพื้นฐานมาจาก Debian ดังนั้น Package สำหรับติดตั้งโปรแกรมจึงเป็นแบบ Debian ซึ่งสำหรับใครที่ติดตั้งด้วย Binary และทำตามคำแนะนำในเว็บไซต์ต่างๆ ก็ทำได้ครับ แต่จะไม่เหมือนกับ Debian Package ที่มีการวางระบบไฟล์ ไม่ว่าจะเป็น Configuration Library Script และอื่นๆไว้ในแบบของ Debian มีการกำหนดสิทธิ์ในการเข้าถึงไฟล์ต่างเหล่านี้อย่างเป็นระบบและเพื่อความปลอดภัยสูง ไม่ให้เกิดช่องโหว่ได้ ดังนั้น เราจึงควรทำตามที่กำหนดไว้จะดีที่สุด แต่สำหรับการทดลอง ทดสอบ หรือใช้พัฒนาโปรแกรมโดยเราใช้เองคนเดียว การติดตั้งแบบ Binary ก็จะสะดวกกว่ามากครับ เพราะทุกอย่างจะรวมอยู่ในโฟลเดอร์เดียวหมด แตกไฟล์มาก็แทบจะใช้ได้เลย

Users/Groups are not created during installation

เมื่อนำไฟล์ .deb มาติดตั้ง โดยปกติเมื่อ double-click ที่ไฟล์ โปรแกรม Package Installer จะทำงาน เปิดหน้าต่างมาให้เราติดตั้ง ซึ่งเป็น GUI ทำให้สะดวกมาก แต่จะทำให้เราไม่ทันได้สังเกตข้อความแจ้งเตือนต่างๆ จึงเข้าใจว่าติดตั้งเสร็จเรียบร้อยแล้ว แต่พอไปใช้งานก็จะมีปัญหา ซึ่งถ้าเราติดตั้งด้วยคำสั่ง
sudo -E dpkg -i hadoop_1.2.1-1_x86_64.deb

หมายเหตุ:

ที่กำหนด option -E ไว้ เพื่อให้มีการนำค่า JAVA_HOME ที่กำหนดไว้มาใช้ตอนติดตั้ง

ปัญหาแรกที่เราจะพบเมื่อติดตั้ง คือข้อความ
Selecting previously unselected package hadoop.
(Reading database ... 336159 files and directories currently installed.)
Unpacking hadoop (from .../hadoop_1.2.1-1_x86_64.deb) ...
groupadd: GID '123' already exists
Setting up hadoop (1.2.1) ...
chown: invalid group: `root:hadoop'
ซึ่งปกติแล้ว จะเป็นขั้นตอนการสร้าง group ชื่อ hadoop และ user ชื่อ mapred และ hdfs โดยสามารถตรวจสอบได้ ด้วยการเปิดดูไฟล์ preinst ซึ่งเป็นสคริปท์ที่จะถูกรันหลังจากที่มีการแตกไฟล์(Unpacking)เรียบร้อยแล้ว ซึ่งสคริปท์นี้เขียนไว้ตายตัวคือ
getent group hadoop 2>/dev/null >/dev/null || /usr/sbin/groupadd -g 123 -r hadoop
หมายความว่าให้สร้าง group ชื่อ hadoop โดยกำหนดให้มี GID เป็น 123 ซึ่งถ้าหากในเครื่องของเรามี GID 123 อยู่แล้ว ก็จะเกิด error GID '123' already exists นั่นเอง ข้อผิดพลาดนี้ได้มีการรายงานไว้แล้วตั้งแต่รุ่น 1.0.3 แต่ยังไม่ได้รับการแก้ไข สาเหตุของปัญหานี้เกิดจากการใช้คำสั่ง groupadd ซึ่งปกติแล้ว บนระบบ Debian จะมีอีกคำสั่งหนึ่งคือ addgroup ซึ่งทำงานคล้ายกัน groupadd จะเป็นคำสั่งระดับล่าง ส่วน addgroup จะเป็นคำสั่งระดับบน ซึ่งถ้าเราไม่กำหนด GID คำสั่ง addgroup จะหาค่าที่เหมาะสมตามระบบของ Debian มาให้แทน ดังนั้น คำสั่งนี้ควรจะแก้เป็น
getent group hadoop 2>/dev/null >/dev/null || /usr/sbin/addgroup --system hadoop
แต่เนื่องจากเราได้ติดตั้งไฟล์ไปแล้ว จึงแก้ไขด้วยการสั่งเองภายหลังจากที่แตกไฟล์เรียบร้อยแล้ว ดังนี้
/usr/sbin/addgroup --system hadoop
/usr/sbin/adduser --shell /bin/bash --no-create-home --system --ingroup hadoop --home /var/lib/hadoop/mapred mapred
/usr/sbin/adduser --shell /bin/bash --no-create-home --system --ingroup hadoop --home /var/lib/hadoop/hdfs hdfs
ซึ่งจะสร้าง group ชื่อ hadoop และ user ชื่อ mapred และ hdfs ขึ้นมา

Configuration Files

ก่อนที่เราจะเริ่ม start Hadoop จะมี config ไฟล์ที่ต้องแก้ไขต่างๆ ซึ่งตามคำแนะนำใน Document ของ Hadoop 1.2.1 จะระบุชื่อไฟล์ในโฟลเดอร์ conf แต่ Debian Package จะย้ายไปอยู่ที่ /etc/hadoop โดยมีไฟล์ต่างๆที่ต้องแก้ไขดังนี้
  1. hadoop-env.sh
    • กำหนดค่า JAVA_HOME ใหม่ให้ถูกต้อง สำหรับค่า default ที่กำหนดไว้คือ /usr/lib/jvm/java-6-sun แต่เนื่องจากบน Ubuntu จะใช้ OpenJDK เป็นหลัก ผมจึงเปลี่ยนค่าให้เป็น /usr/lib/jvm/default-java ซึ่งจะใช้ default JDK ที่ติดตั้งไว้ โดยปกติแล้ว Ubuntu 12.04 LTS จะใช้ OpenJDK 6 ซึ่งน่าจะเข้ากันได้ดี แต่เนื่องจากผมมีโปรแกรมบางตัวที่ใช้ Java 7 จึงเปลี่ยนมาใช้ OpenJDK 7 (หวังว่าจะไม่มีปัญหา)
    • หากต้องการเปลี่ยนค่า environment สามารถใช้คำสั่ง update-hadoop-env.sh ได้ โดยสั่ง
    • sudo -E bash /usr/sbin/update-hadoop-env.sh --prefix=/usr --bin-dir=/usr/bin --sbin-dir=/usr/sbin --conf-dir=/etc/hadoop --log-dir=/var/log/hadoop --pid-dir=/var/run/hadoop
  2. master/slave
    • master ไฟล์ จะเก็บรายชื่อเครื่องที่ทำหน้าที่เป็น NameNode ซึ่งจะเป็นเครื่องแม่ และสามารถเป็น JobTracker TaskTracker และ DataNode ได้ด้วย
    • slave ไฟล์ จะเก็บรายชื่อเครื่องที่ทำหน้าที่เป็น DataNode และเป็น TaskTracker ได้ด้วย
    • ถ้าติดตั้งในโหมด Single-Node ทั้งสองไฟล์จะมีค่าเป็น localhost
  3. *-site.xml
    • core-site.xml เป็นไฟล์ที่เก็บค่าเกี่ยวกับ NameNode เช่น fs.default.name เป็นค่า URL ของเครื่อง NameNode ที่ Hadoop ในเครื่องนั้นๆจะติดต่อด้วย โดยค่า default ใน Debian Package กำหนดไว้เป็น hdfs://localhost:8020 แต่เว็บอื่นๆมักกำหนดค่าตัวอย่างไว้ที่พอร์ต 9000 หรือ 9001 ซึ่งจะต้องระวังการกำหนดค่าตรงนี้ให้ดี เพราะหากชนกับบริการอื่นๆที่มีอยู่ในเครื่อง NameNode ก็จะไม่สามารถ start ได้ ค่า default ต่างๆของไฟล์นี้ สามารถดูได้จากไฟล์ core-default.xml
    • hdfs-site.xml เป็นไฟล์ที่เก็บค่าเกี่ยวกับ HDFS ว่าจะมีการจัดแบ่งข้อมูลของระบบอย่างไร โดยเฉพาะค่า dfs.replication ซึ่งเป็นจำนวนการทำซ้ำข้อมูล จำนวนนี้ไม่ควรเกินจำนวน DataNode ค่า default ต่างๆของไฟล์นี้ สามารถดูได้จากไฟล์ hdfs-default.xml
    • mapred-site.xml เป็นไฟล์ที่เก็บค่าเกี่ยวกับ JobTracker ค่า default ต่างๆของไฟล์นี้ สามารถดูได้จากไฟล์ mapred-default.xml

Operation Mode

ระบบ Hadoop จะประกอบไปด้วยบริการ 4 ประเภทคือ
  1. NameNode เป็นบริการหลัก ทำหน้าที่ค้นหาและจัดการบริการอื่นๆในระบบ
  2. JobTracker ทำหน้าที่จัดคิวการทำงาน
  3. TaskTracker ทำหน้าที่ประมวลผล Map-Reduce หรืองานอื่นๆ
  4. DataNode ทำหน้าที่จัดการข้อมูลในระบบ HDFS (Hadoop Distributed File System)
ซึ่งบริการทั้ง 4 ประเภท สามารถทำงานอยู่บนเครื่องๆเดียวได้ (Single-Node โหมด) หรือจะแบ่งเป็นเครื่อง 2 กลุ่ม คือ master ซึ่งสามารถมีบริการทั้ง 4 ประเภทในเครื่องเดียว หรือ slave ซึ่งจะมีบริการเฉพาะ TaskTracker และ DataNode เท่านั้น เพื่อแบ่งหรือกระจายการประมวลผลและข้อมูลของระบบออกไปยังเครื่องลูกจำนวนมากๆ โดยการติดตั้งระบบ เราสามารถเลือกติดตั้งให้ทำงานได้ 3 โหมดคือ
  1. Local (Standalone)
    • การทำงานจะอยู่บนเครื่องเดียว และไม่เป็นเครือข่าย
    • โหมดนี้เป็น default ของโปรแกรม หากยังไม่มีการตั้งค่าใดๆ
    • เหมาะกับการทดสอบและ debug มากกว่า
  2. Pseudo-Distributed (Single-Node)
    • การทำงานจะอยู่บนเครื่องเดียว แต่เป็นเครือข่าย
    • สามารถตั้งค่าต่างๆได้ง่ายด้วยโปรแกรม hadoop-setup-single-node.sh
    • เหมาะกับการใช้งานเบื้องต้น และพร้อมที่จะขยายไปเป็น Fully-Distributed โหมด
  3. Fully-Distributed (Multi-Node)
    • การทำงานจะเป็นเครือข่ายหลายเครื่องสมบูรณ์แบบ
    • สามารถปรับแก้ไฟล์บางไฟล์จาก Pseudo-Distributed โหมด กลายเป็น Fully-Distributed โหมดได้ทันที
    • เหมาะกับการใช้งานเต็มรูปแบบ รองรับภาระงานเพิ่มขึ้นโดยเพิ่มจำนวนเครื่องได้

Setup Single-Node Mode

หลังจากที่เราติดตั้ง Debian Package เรียบร้อยแล้ว ไฟล์ hadoop-env.sh จะถูกตั้งค่า environment ไว้เรียบร้อยแล้ว แต่หากค่าต่างๆยังไม่ถูกต้อง เช่นค่า JAVA_HOME ควรแก้ไขให้ถูกต้องเสียก่อนนะครับ จากนั้นเราจะต้องตั้งค่าไฟล์ *-site.xml ให้ครบถ้วน ก่อน ซึ่งขึ้นอยู่กับโหมดการใช้งานที่เราต้องการ โดยปกติแล้วถ้าเป็น Standalone โหมด ก็ไม่ต้องแก้ไขอะไร แต่ส่วนใหญ่แล้ว เราจะไม่ใช้โหมดนี้ เราจะใช้โหมด Single-Node มากกว่า ซึ่งค่าต่างๆที่ต้องกำหนด สามารถศึกษาได้จาก document ซึ่งผมจะไม่ขอกล่าวในที่นี้นะครับ แต่เราก็มีวิธีที่ง่ายกว่านั้น เนื่องจากมีสคริปท์ช่วยอำนวยความสะดวกให้แล้วคือ hadoop-setup-single-node.sh โดยมีลำดับของการทำงานคือ
  1. ตั้งค่า config ต่างๆ
  2. ทำการ Format NameNode (เหมือนเรา Format ฮาร์ดดิสก์นะครับ)
  3. จัดเตรียมโครงสร้างของไฟล์ในระบบ HDFS
  4. start บริการต่างๆของ Hadoop ซึ่งก็คือ NameNode DataNode JobTracker และ TaskTracker
  5. ตั้งค่าสำหรับให้บริการต่างๆ start อัตโนมัติเมื่อบู๊ตเครื่อง
เมื่อรัน hadoop-setup-single-node.sh แล้วตอบ y ทั้งหมด คือเลือกใช้ค่า default ทั้งหมด ผลปรากฏว่า มีปัญหาเกี่ยวกับ permission ของโฟลเดอร์ /var/hadoop/log/root เกิดขึ้นตอนรัน JobTracker และ TaskTracker ซึ่งมีข้อความตัวอย่างดังนี้

* Starting Apache Hadoop Job Tracker server hadoop-jobtracker                                      chown: changing ownership of `/var/log/hadoop/root': Operation not permitted
starting jobtracker, logging to /var/log/hadoop/root/hadoop-root-jobtracker-SLOffice.out
/usr/sbin/hadoop-daemon.sh: line 137: /var/log/hadoop/root/hadoop-root-jobtracker-SLOffice.out: Permission denied
head: cannot open `/var/log/hadoop/root/hadoop-root-jobtracker-SLOffice.out' for reading: No such file or directory
/usr/sbin/hadoop-daemon.sh: line 147: /var/log/hadoop/root/hadoop-root-jobtracker-SLOffice.out: Permission denied
/usr/sbin/hadoop-daemon.sh: line 148: /var/log/hadoop/root/hadoop-root-jobtracker-SLOffice.out: Permission denied
                                                                                             [fail]
สาเหตุ เกิดจาก JobTracker และ TaskTracker จะถูกรันโดย user ชื่อ mapred แต่โฟลเดอร์ /var/log/hadoop/root ถูกสร้างขึ้น เพราะเราสั่งรัน hadoop-setup-single-node.sh ด้วย root ซึ่งตอนรัน NameNode และ DataNode จะรันโดย user ชื่อ hdfs ทำให้มีการเปลี่ยนสิทธิ์ของ /var/log/hadoop/root ให้เป็นของ hdfs:hadoop ด้วย chmod มีค่าเป็น 755 พอ mapred จะมาเปลี่ยน จึงเปลี่ยนไม่ได้ ผมจึงแก้ไขด้วย chmod ให้เป็น 775 แทน

Start/Stop Service

การสั่ง start/stop บริการต่างๆของ Hadoop ความจริงแล้ว จะมีสคริปท์ให้เรียกใช้ โดยเฉพาะคำสั่ง start-all.sh และ stop-all.sh ซึ่งจะไปเรียก start-dfs.sh/start-mapred.sh และ stop-dfs.sh/stop-mapred.sh อีกทีหนึ่ง โดย dfs นั้นจะมีบริการ NameNode และ DataNode อยู่ ส่วน mapred จะมี JobTracker และ TaskTracker ครับ ดังนั้น เราจึง start ได้ด้วยคำสั่ง
sudo start-all.sh
และ stop ด้วยคำสั่ง
sudo stop-all.sh
แต่ถ้าหากเรากำหนดให้ hadoop-setup-single-node.sh ติดตั้ง service ให้ start/stop Hadoop อัตโนมัติตอน boot/shutdown เครื่อง เราก็สามารถสั่ง start ได้ด้วยคำสั่ง
sudo service hadoop-xxx start
และ stop ได้ด้วยคำสั่ง
sudo service hadoop-xxx stop
โดยมีสคริปท์สำหรับบริการต่างๆอยู่ที่ /etc/init.d/hadoop-xxx คือ
  • hadoop-namenode
  • hadoop-datanode
  • hadoop-jobtracker
  • hadoop-tasktracker
  • hadoop-secondarynamenode (ปกติจะไม่ start อัตโนมัติ)
และคำสั่งทั้งหมดนั้น จริงๆแล้วจะไปเรียกคำสั่ง hadoop-daemon.sh อีกทีหนึ่ง ซึ่งสามารถเรียกใช้ได้เช่นกัน มีรูปแบบคือ
hadoop-daemon.sh [start/stop] [ชื่อบริการ]
เช่น
hadoop-daemon.sh start namenode

หมายเหตุ:

หาก start ด้วยวิธีใด ให้ stop ด้วยวิธีที่คู่กัน

Startup Checking

จากการตรวจสอบการทำงานด้วยคำสั่ง jps จะพบว่ามีเพียง NameNode DataNode และ TaskTracker รันอยู่ แต่ JobTracker ไม่มี ผมจึงเข้าไปตรวจสอบ log ไฟล์ของ JobTracker ที่โฟลเดอร์ /var/log/hadoop พบข้อความผิดพลาดคือ
WARN org.apache.hadoop.mapred.JobTracker: Failed to operate on mapred.system.dir (hdfs://localhost:8020/mapred/mapredsystem) because of permissions.
WARN org.apache.hadoop.mapred.JobTracker: Manually delete the mapred.system.dir (hdfs://localhost:8020/mapred/mapredsystem) and then start the JobTracker.
WARN org.apache.hadoop.mapred.JobTracker: Bailing out ...
org.apache.hadoop.security.AccessControlException: org.apache.hadoop.security.AccessControlException: Permission denied: user=mapred, access=WRITE, inode="":hdfs:supergroup:rwxr-xr-x
สาเหตุก็คือ เนื่องจากขั้นตอนที่ 3 ของ hadoop-setup-single-node.sh นั้น จะสร้างโฟลเดอร์ /tmp และ /usr ไว้ใน HDFS เท่านั้น จะไม่มีโฟลเดอร์ /mapred แต่เนื่องจากใน mapred-site.xml ได้กำหนดค่า mapred.system.dir ไว้ที่ /mapred/mapredsystem จึงทำให้ JobTracker พยายามที่จะเขียนข้อมูลไปที่นั่น แต่ก็ทำไม่ได้ และจบการทำงานไป วิธีการแก้ไขที่มีคนแนะนำไว้ก็คือ ให้ตั้งค่า mapred.system.dir ไปไว้ใน /tmp แทน โดยให้อิงกับค่า hadoop.tmp.dir ซึ่งจะต้องแก้ไขในไฟล์ mapred-site.xml ดังนี้
<property>
<name>mapred.system.dir</name>
<value>${hadoop.tmp.dir}/mapred/mapredsystem</value>
<final>true</final>
</property>
เมื่อแก้ไขเสร็จแล้ว สั่ง start JobTracker ใหม่ ก็จะพบปัญหาทำนองเดียวกันกับค่า mapred.job.tracker.history.completed.location จึงแก้ไขให้เป็น
<property>
<name>mapred.job.tracker.history.completed.location</name>
<value>${hadoop.tmp.dir}/mapred/history/done</value>
</property>

Web Interface

เมื่อแก้ไขข้อผิดพลาดต่างๆ และ start บริการต่างๆได้หมดแล้ว ก็สามารถเปิดดู NameNode ผ่านเว็บได้ที่ URL http://localhost:50070 ส่วน JobTracker เปิดดูได้ที่ http://localhost:50030

อ้างอิง



วันเสาร์ที่ 11 มกราคม พ.ศ. 2557

การแก้ไข Debian Package

วันนี้ผมมีปัญหากับการติดตั้ง Hadoop บน Ubuntu ซึ่งติดตั้งจาก Debian Package (.deb ไฟล์) แต่เนื่องจากภายใน package มีสคริปท์ที่เขียนไว้สำหรับติดตั้งมีปัญหาบางอย่าง จึงทำให้การติดตั้งไม่สมบูรณ์ ผมจึงอยากจะแก้ไข จึงค้นหาวิธีการมาฝากดังนี้

Debian Package File Format

สำหรับโครงสร้างไฟล์นั้น เป็น Archive ไฟล์แบบหนึ่ง (ไฟล์บีบอัด) เราสามารถใช้โปรแกรม Archive Manager เปิดดูไฟล์ภายในได้ หรือแม้แต่ใช้โปรแกรม Package Installer ก็สามารถดูข้อมูลภายในได้เช่นกัน สามารถแตกไฟล์ออกมาได้ แต่ถ้าเรามีไฟล์อยู่แล้วต้องการจะรวมเป็น Debian Package เขาแนะนำให้ใช้โปรแกรม dpkg-deb จะสะดวกมากครับ

Control Files

โดยโครงสร้างซึ่งเป็นไฟล์แบบบีบอัด ดังนั้น โปรแกรมของเราจะมีไฟล์อะไรบ้าง เราก็เตรียมไว้ให้มีโครงสร้างเป็นโฟลเดอร์ต่างๆตามแบบของ Debian เช่น Configuration ต่างๆควรอยู่ที่ /etc ส่วนโปรแกรมเฉพาะส่วนที่เป็น read-only ควรอยู่ที่ /usr และข้อมูลอื่นๆที่เปลี่ยนแปลงบ่อยๆก็ควรอยู่ที่ /var  เป็นต้น (อ่านรายละเอียดได้จากเรื่อง  Filesystem Hierarchy Standard)

นอกจากนี้ยังมีโฟลเดอร์พิเศษชื่อ DEBIAN สำหรับเก็บไฟล์ที่สำคัญของการติดตั้ง Package ซึ่งประกอบไปด้วยไฟล์ดังนี้ (อ้างอิง How to create a Debian .deb package)

  1. control - เก็บข้อมูลหลักของ package เช่น ชื่อ package, รุ่น, สถาปัตยกรรม ฯลฯ
  2. conffiles - เก็บรายชื่อ config ไฟล์ ที่จะไม่ลบทิ้งเมื่อ uninstall เนื่องจากผู้ใช้อาจจะต้องการลงโปรแกรมใหม่ด้วยค่า config เดิม
  3. md5sums - เก็บค่า md5sum ของทุกๆไฟล์ใน package เพื่อใช้ตรวจสอบความถูกต้องของข้อมูล
  4. preinst - เป็นสคริปท์ที่จะถูกเรียกหลังจากที่แตกไฟล์ต่างๆเสร็จแล้ว และก่อนที่จะทำการติดตั้งใดๆ เช่น สคริปท์สำหรับสร้าง user/group เป็นต้น
  5. postinst - เป็นสคริปท์ที่จะถูกเรียกหลังจากที่รัน preinst เสร็จแล้ว เพื่อติดตั้งค่าต่างๆรวมทั้ง init สคริปท์ต่างๆสำหรับให้โปรแกรมทำงานในสภาวะต่างๆ
  6. prerm - เป็นสคริปท์ที่จะถูกเรียกก่อนที่จะลบโปรแกม เพื่อยกเลิกการทำงานที่ค้างอยู่ ลบข้อมูลบางอย่างที่ถูกสร้างขึ้นจาก postinst
  7. postrm - เป็นสคริปท์ที่จะถูกเรียกหลังจากที่รัน prerm เสร็จแล้ว เพื่อลบสิ่งที่สร้างขึ้นจาก preinst

Extract Debian Package

สมมติว่าไฟล์ต่างๆที่เราจะแตกออกมา เราจะไปไว้ในโฟลเดอร์ชื่อ tmp โดยใช้คำสั่ง dpkg-deb เช่น สมมติว่า package ที่ต้องการจะแก้ไขชื่อ application.deb ใช้ -x เพื่อแตกไฟล์โปรแกรม ส่วน -e เพื่อแตก Control ไฟล์ ซึ่งจะต้องอยู่ในโฟลเดอร์ชื่อ DEBIAN นะครับ
dpkg-deb -x /path/to/application.deb tmp
dpkg-deb -e /path/to/application.deb tmp/DEBIAN
จากนั้นก็แก้ไขไฟล์ตามที่ต้องการได้เลย

Rebuild Package

เมื่อแก้ไขทุกอย่างเรียบร้อยแล้ว เราก็สามารถใช้ -b เพื่อที่จะ build Package ใหม่ดังนี้
dpkg-deb -b tmp /path/to/application-new.deb
ก็จะได้ Debian Package ใหม่ตามที่ต้องการ

วันจันทร์ที่ 16 เมษายน พ.ศ. 2555

ปัญหาการ Burn DVD+R บน Ubuntu

ประเด็นของผมวันนี้คือ ผมอยากจะบันทึกเรื่องนี้ไว้ค้นถ้าหากลืมไปอีก และจะได้ไม่เสียแผ่นไปอีกเป็นกอง อีกอย่าง ก็อยากจะให้ผู้ที่ใช้ Linux และบังเอิญซื้อแผ่น DVD+R มา แล้วเจอปัญหาเดียวกัน จะได้รู้วิธีแก้ไข เพราะหาคำตอบใน Google ได้ไม่ง่ายนัก

ก่อนอื่นต้องขอย้อนกลังไปถึงสมัยเมื่อประมาณ 10 ปีก่อน ตอนที่ผมเรียนอยู่ที่ญี่ปุ่น ผมชอบใช้ DVD+R เพราะตอนเริ่มแรกที่ทาง Sony ออกมาตรฐานนี้ เขาออกแบบมาเพื่อการเขียนข้อมูลวีดีโอ และที่ญี่ปุ่นตอนนั้นก็นิยม DVD+R มากกว่า DVD-R แต่ต่อมา ไม่ว่าจะใช้แบบไหน ก็ได้คุณภาพพอๆกัน ทำให้ช่วงหลัง DVD-R ได้รับความนิยมมากกว่า เนื่องจากมีหลายบริษัทสนับสนุน DVD-R อาจจะเป็นเพราะไม่อยากให้ Sony ผูกขาดก็เป็นได้

เมื่อนานมาแล้ว ประมาณสักปีหนึ่งเห็นจะได้ ผมได้ซื้อ DVD+R มากล่องใหญ่ แต่ปรากฏว่านำมาใช้เขียนข้อมูลบน Ubuntu แล้ว มี error ทุกครั้ง เสียแผ่นไปตั้งหลายแผ่น แรกๆผมก็คิดว่า ผมซื้อแผ่นราคาถูกๆของ TESCO มา มันคงจะเสียจริงๆ แต่พอเอาไปเขียนบนเครื่อง Windows ก็ไม่พบปัญหา ผมจึงหาทางแก้ไข จนได้รู้ว่าเป็นเพราะอะไร และแก้ปัญหานั้นไปได้นานมากแล้ว

มาถึงเมื่อไม่นานมานี้ ผมก็ลืมปัญหานี้ไปแล้ว พอเอาแผ่นมาเขียนอีก เจอปัญหาเดิม ก็คิดว่าแผ่นเสีย เอาแผ่นใหม่มาเขียนอีกก็เสียอีก ทำไปทำมา ก็เสียไปหลายแผ่น จนทำให้นึกสงสัย หลายวันต่อมาก็นึกขึ้นได้ แต่ก็จำไม่ได้แล้วว่าต้องทำอย่างไร ค้น Google ก็จะไม่เจอ เพราะ keyword ที่ใช้ มันมีเครื่องหมาย และแตกต่างจากปัญหาอื่นๆเพียงเล็กน้อย เช่น ถ้าค้นว่า cannot burn DVD+R problem ก็จะไปพบแต่กระทู้ที่เกี่ยวกับปัญหาการเขียน DVD-R เสียมากกว่า แต่ความพยายามอยู่ที่ไหน ความสำเร็จก็จะมาเยือนแน่นอน ผมนึกขึ้นได้ว่า มันมีโปรแกรมที่จะต้องเรียก ซึ่งมีคำว่า dvd อยู่ และผมก็ลงไว้ในเครื่องแล้ว ก็เลยพบโปรแกรมนั้น นั่นคือโปรแกรม dvd+rw-booktype ซึ่งมีอยู่ใน package dvd+rw-tools นะครับ

เราจะต้องเรียกคำสั่ง
sudo dvd+rw-booktype -dvd-rom -unit+r /dev/dvd
เพื่อระบุว่าเราจะใช้ DVD+R ซึ่งผลการรันก็จะแสดงข้อความว่า
Unit was instructed to brand DVD+R media as DVD-ROM
จากนั้นก็สามารถใช้โปรแกรมเขียนแผ่นได้ตามปกติ หรือใช้คำสั่ง
sudo dvd+rw-booktype -inq -unit+r /dev/dvd
ถ้ายังมีปัญหาอาจจะลองสั่ง
sudo dvd+rw-booktype -dvd+r-spec -unit+r /dev/dvd 
ถ้าใครกลัวลืม อาจจะเขียนเป็นคำสั่งไว้ในไฟล์ /etc/rc.local ก็ได้ จะทำให้ทุกๆครั้งที่เปิดเครื่อง จะเรียกคำสั่งนี้อัตโนมัติ

ปล. เวลาเขียนแผ่น ควรจะตั้งความเร็วต่ำๆนะครับ เพื่อความชัวร์

วันพฤหัสบดีที่ 22 ธันวาคม พ.ศ. 2554

การติดตั้ง RTC 3.0.1.1 บน Ubuntu (amd64)

ชุดติดตั้ง RTC 3.0.1.1 ถ้าดาวโหลดชุด Web Installer จะมีขนาดประมาณ 96.5MB ซึ่งจะมีเฉพาะโปรแกรม IBM Installation Manager กับข้อมูลเบื้องต้นของโปรแกรม เมื่อติดตั้งจะ โปรแกรมจะไปดาวโหลดโปรแกรมฉบับเต็มมาจากอินเตอร์เน็ตอีกทีหนึ่ง ซึ่งมีขนาดประมาณ 1.4GB

สำหรับ Ubuntu 64 บิตนั้น อาจจะมีปัญหาเล็กน้อย เนื่องจากโปรแกรมติดตั้งบางส่วนเป็นแบบ 32บิต ซึ่งจะเกิดปัญหาการโหลดไลบรารี่ 64บิตไม่ได้ ซึ่งตามเว็บที่เขาแนะนำมาก็คือ จะต้องลงเพ็คเกจ ia32-libs และ ia32-libs-gtk ก่อนติดตั้ง

นอกจากนี้ จะต้องเพิ่มจำนวนไฟล์ที่สามารถเปิดได้ด้วยคำสั่ง
ulimit -n 65536
1.รันโปรแกรม launchpad.sh
2.เลือกติดตั้งตามปกติ ซึ่งโปรแกรมจะถูกติดตั้งไว้ที่ /opt/IBM/JazzTeamServer
3.แก้ไขไฟล์ server/server.startup โดยเพิ่มคำสั่ง ulimit -n 65536 ไว้ใน script
4.แก้ไขไฟลื /etc/rc.local ให้เรียก server.startup เพื่อให้โปรแกรมเริ่มทำงานอัตโนมัติทุกครั้งที่เปิดเครื่อง

วันพุธที่ 21 ธันวาคม พ.ศ. 2554

ปัญหาการอัพเกรด Rational Team Concert

หลังจากที่ผมได้เคยแนะนำการติดตั้งโปรแกรม Rational Team Concert (RTC) 3.0.1 ไปแล้ว พร้อมทั้งได้เล่าประสบการณ์ที่ทำให้เสียเวลาไปเป็นเดือนในการแก้ปัญหาการใช้งานบนระบบปฏิบัติการ Ubuntu รวมทั้งได้แนะนำวิธีการสร้างโครงการใน RTC ไว้แล้ว ใครสนใจก็สามารถย้อนกลับไปอ่านได้เลยนะครับ

สำหรับครั้งนี้ เป็นปัญหาการอัพเกรด RTC ไปเป็นรุ่น 3.0.1.1 ซึ่งปล่อยออกมาเมื่อวันที่ 14 ตุลาคม 2554 นี้เอง พอดีผมเพิ่งจะมีเวลา ก็เลยเข้าไปดาวโหลดและติดตั้ง แต่ก็พบปัญหาคือ ตัวโปรแกรม IBM Installation Manager (IM) ที่จะใช้ติดตั้งโปรแกรมต่างๆของ IBM กลับใช้งานไม่ได้ โปรแกรมมันเงียบไปเฉยๆ ไม่ทำงานอะไร และไม่มีข้อความอะไรแสดงออกมาเลย ก็เลยเป็นปัญหาว่า แล้วมันเกิดอะไรขึ้น แล้วจะแก้ไขได้อย่างไร

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

ถ้าจะเล่าไอ้ที่ผมเสียเวลาไปลองทำโน่นทำนี่เพื่อจะแก้ปัญหา แต่สุดท้ายแล้วไม่ใช่ มันก็คงจะยืดยาวไป และเสียเวลาอีกนั่นแหละ เอาเป็นว่าขอสรุปสั้นๆคือ หลังจากที่ผม Update Ubuntu ซึ่งทำเป็นประจำ และก็ไม่เคยมีปัญหาอะไร ปรากฏว่ามีอยู่ครั้งหนึ่งเมื่อ 1-2 เดือนที่ผ่านมา ที่โปรแกรม libc6-i386 รวมทั้งแพ็คเกจอื่นๆบางตัวมันหายไป (เวลา Update Ubuntu ให้ระวัง ถ้ามันแจ้งว่าดาวโหลดแพ็คเกจบางตัวไม่ได้ ก็อย่าเพิ่งติดตั้ง เพราะมันอาจจะทำให้ระบบรวนได้) ซึ่งที่ผมรู้ก็เพราะมีโปรแกรมบางตัวใช้งานไม่ได้ เช่น Chrome อาการที่แสดงออกมาก็ทำนองเดียวกับ IM เลยล่ะครับ คือ เงียบ ไม่แสดงผลใดๆ แต่ตอนนี้ผมแก้ปัญหาของ Chrome ได้นานแล้ว คราวนี้โปรแกรม IM มันขาดอะไรล่ะ คำตอบคือ ไม่รู้

ผมก็พยายามขุดๆข้อมูลที่พอจะเอาออกมาดูได้ ก็พบว่า โปรแกรม IM มันจะสร้าง log ไฟล์ ไว้ที่โฟลเดอร์ configuration เช่น สำหรับแพ็คเกจ RTC ที่ผมดาวโหลดมา จะอยู่ที่ im/linux.gtk.x86/configuration (โปรแกรม IM บนระบบปฏิบัติการ Linux ที่ใช้ gtk และเครื่องที่ใช้ซีพียู x86) ก็ได้พบ error ตามข้างล่างนี้

!SESSION 2011-12-16 21:54:23.205 -----------------------------------------------
eclipse.buildId=unknown
java.fullversion=J2RE 1.5.0 IBM J9 2.3 Linux x86-32 j9vmxi3223ifx-20080811 (JIT enabled)
J9VM - 20080809_21892_lHdSMr
JIT  - 20080620_1845_r8
GC   - 200806_19
BootLoader constants: OS=linux, ARCH=x86, WS=gtk, NL=en_GB
Framework arguments:  -toolId install -accessRights admin -input @osgi.install.area/install.xml -input @osgi.install.area/install-server.xml
Command-line arguments:  -os linux -ws gtk -arch x86 -toolId install -accessRights admin -input @osgi.install.area/install.xml -input @osgi.install.area/install-server.xml

!ENTRY org.eclipse.osgi 4 0 2011-12-16 21:54:25.456
!MESSAGE Application error
!STACK 1
java.lang.UnsatisfiedLinkError: Could not load SWT library. Reasons: 
/home/somchai/Downloads/Rational/RTC3.0.1/im/linux.gtk.x86/configuration/org.eclipse.osgi/bundles/213/1/.cp/libswt-pi-gtk-3655.so (libgtk-x11-2.0.so.0: cannot open shared object file: No such file or directory)
swt-pi-gtk (Not found in java.library.path)
/tmp/swtlib-32/libswt-pi-gtk-3655.so (libgtk-x11-2.0.so.0: cannot open shared object file: No such file or directory)
/tmp/swtlib-32/libswt-pi-gtk.so (/tmp/swtlib-32/liblibswt-pi-gtk.so.so: cannot open shared object file: No such file or directory)....
ปรากฏว่า ข้อความ error บอกว่าโหลดไลบราลี่ SWT ไม่ได้ ผมก็งงๆ เมื่อตรวจสอบดูก็พบว่ามี libswt ติดตั้งอยู่ในเครื่องแล้ว แต่ path ที่ error แสดงออกมานั้นมันเป็นไลบรารี่ของ IM ที่ /tmp/swtlib-32/ ซึ่งเป็นโฟลเดอร์ชั่วคราว ผมก็สังเกตุเห็นว่ามันเป็น SWT-32 ซึ่งก็น่าจะเป็นไลบราลี่แบบ 32 บิต แต่เครื่องที่ผมใช้งานอยู่เป็น amd64 แสดงว่ามันต้องเป็นปัญหาของการโหลด 32บิตไลบราลี่ บน OS 64 บิตแน่ๆ ผมเคยพบปัญหานี้มาบ้างแล้วบน Windows 64 บิต บางครั้งมันก็เกิดปัญหาเวลาที่เราเอาโปรแกรม 32 บิตไปรัน เอ แล้ว Ubuntu นี่มันจะแก้ยังไง คำตอบคือ ไม่รู้

ผมก็พยายามหาข้อมูลต่อไป สังเกตุว่าโปรแกรม IM นี้เป็นโปรแกรมภาษา Java และใช้ JRE ของ IBM เอง ผมก็พยายามหาว่า แล้วจะเอา JRE 64 บิตมาแทน แต่ก็พบความยุ่งยากอีกหลายอย่าง เพราะภายในตัว IM นั้น มีสคริปที่เซ็คค่าต่างๆที่เกี่ยวข้องกับ JRE อีกหลายที่หลายจุด ถ้าเปลี่ยนตรงนี้ สงสัย ผมอาจจะต้องเข้าไปแก้ตัว IM มันก็จะกลายเป็นเรื่องใหญ่เกินไป

พยายามหาข้อมูลอยู่นาน ... เอาเป็นว่า ผ่านไป 1 สัปดาห์ ก็ยังไม่ได้คำตอบ

สุดท้ายวันนี้ไปพบบล็อก Honza’s perspective ที่เขียนเกี่ยวกับ RTC และการติดตั้งบน 64 บิต Ubuntu ไว้ว่าให้ติดตั้งแพ็คเกจ ia32-libs และ libstw-gtk-x.x-jni (ซึ่งมีอยู่แล้วในเครื่องผม) ผมก็เลยติดตั้ง ia32-libs เพิ่มเข้าไป สุดท้ายทุกอย่างก็กลับมาใช้งานได้เป็นปกติ ก็เลยบันทึกไว้และเผยแพร่ให้ผู้ที่ติดปัญหาแบบเดียวกัน จะได้ไม่เสียเวลามากมายอย่างที่ผมเจอมา


วันพฤหัสบดีที่ 8 กันยายน พ.ศ. 2554

การสร้างโครงการใน Rational Team Concert

Software: Rational Team Concert 3.0.1

วันก่อนผมได้เขียนถึงการติดตั้งโปรแกรม Rational Team Concert (RTC) ไปแล้ว ครั้งนี้จึงอยากจะแนะนำการสร้างโครงการอย่างง่ายๆ เพื่อให้ผู้สนใจสามารถเริ่มต้นใช้งาน RTC ในการบริหารโครงการแบบง่ายๆได้ จะได้ไม่ต้องเสียเวลาไปกับการศึกษาระบบต่างๆของ RTC ซึ่งมีความซับซ้อนค่อนข้างมาก เพราะ RTC มีความสามารถมากจริงๆ

ผู้มีสิทธิ์ในการสร้างโครงการ

User ที่มีสิทธิ์สร้างโครงการได้นั้น จะต้องอยู่ในกลุ่ม JazzProjectAdmins ซึ่งเราจะสามารถกำหนดกลุ่มให้กับ User แต่ละคนได้โดยเข้าไปที่ User Administration หัวข้อ Active Users เลือก User ที่ต้องการกำหนดให้สร้างโครงการได้ ในหัวข้อ Repository Permissions เลือก CheckBox ที่ JazzProjectAdmins แล้วอย่าลืมกดปุ่ม Save ที่อยู่มุมบนขวานะครับ

ชนิดของโครงการ
โครงการแต่ละโครงการนั้น จะมีกระบวนการบริหารจัดการที่แตกต่างกันไป เช่น บางโครงการเป็นโครงการใหม่ ซึ่งจะต้องมีเฟสการทำงานครบถ้วนตั้งแต่ Requirement, Design, Implementation และ Testing แต่บางโครงการอาจจะเป็นเพียงโครงการที่ Maintenance ระบบเท่านั้น ดังนั้น กระบวนการทำงานของแต่ละโครงการก็จะแตกต่างกันออกไป ใน RTC จึงมี Template สำหรับให้สร้างโครงการได้หลายแบบ และเรายังสามารถปรับแต่ง Template แล้วบันทึกไว้เป็นต้นแบบของเราเองได้ด้วย (หากใครสนใจก็สามารถศึกษาเพิ่มเติมได้ในหัวข้อ Modifying a predefined template)

สำหรับ Template ของโครงการนั้น จะเป็นสิ่งที่บ่งบอกถึงโครงสร้างของการจัดการพื้นที่ของโครงการ (project area) ซึ่งแต่ละโครงการ จะประกอบไปด้วยพื้นที่ สำหรับเก็บผลผลิตหรือสิ่งประดิษฐ์ (Artifact) ที่ได้จากกระบวนการต่างๆ ไม่ว่าจะเป็นกระบวนการวิเคราะห์ (ได้ requirement) กระบวนการเขียนโปรแกรม (ได้ source code) และกระบวนการทดสอบ (ได้ผลการทดสอบ) เป็นต้น นอกจากนี้ ยังเป็นที่รวมของผู้ที่มีหน้าที่ต่างๆในทีมอีกด้วย

สำหรับ Template เริ่มต้นนั้น RTC มีให้ใช้งานอยู่ 8 แบบ โดยแบ่งตามหน้าที่หลักของผู้มีส่วนร่วมในโครงการ ดังนี้
 
1. Quality Professional, Analyst, Developer - เป็นโครงการที่มี QM, RM และ CCM อยู่ครบถ้วน ผู้ทดสอบ (Quality Professional ใน QM) ผู้วิเคราะห์ (Analyst ใน RM) และ ผู้พัฒนา (Developer ใน CCM) ทำงานร่วมกัน การเปลี่ยนแปลง QM และ requirement จะถูกติดตามใน CCM


2. Quality Professional, Developer – without Requirements - เป็นโครงการที่มีเฉพาะ QM และ CCM เท่านั้น ผู้ทดสอบ (Quality Professional ใน QM) และ ผู้พัฒนา (Developer ใน CCM) ทำงานร่วมกัน การเปลี่ยนแปลง QM จะถูกติดตามใน CCM ไม่มีการติดตั้ง RM งาน requirement จะต้องใช้เครื่องมืออื่นแทน

3. Quality Professional, Analyst - เป็นโครงการที่มีแต่ QM และ RM ส่วน CCM นั้นแยกออกไปต่างหาก ไม่ได้รวมอยู่ในโครงการ (อาจจะเป็น CCM ของโครงการอื่น)
 ความสามารถในเรื่อง Defect จะไม่ถูกติดตั้งไว้ จะต้องใช้เครื่องมืออื่นแทน


4. Analyst, Developer - เป็นโครงการที่มีแต่ RM และ CCM โดย Analyst ทำงานร่วมกับ Developer การปรับปรุง requirement จะถูกติดตามใน CCM

5. Analyst - เป็นโครงการที่มีแต่ RM ปรับปรุง requirement จะถูกติดตามใน CCM ที่แยกออกไปต่างหาก ไม่ได้รวมอยู่ในโครงการ (อาจจะเป็น CCM ของโครงการอื่น)

6. Quality Professional – without Defects and Requirements - เป็นโครงการที่มีแต่ QM เท่านั้น การเปลี่ยนแปลงใดๆของ QM จะถูกติดตามใน CCM ที่แยกออกไปต่างหาก ไม่ได้รวมอยู่ในโครงการ Defect และ requirement จะต้องใช้เครื่องมืออื่นแทน

7. Developer - เป็นโครงการที่มีเฉพาะ CCM

8. Quality Professional, Analyst, Developer – with separate Quality Management Tasks and Requirements Change Requests - เป็นโครงการที่มี QM และ RM แยกออกไปต่างหาก ซึ่งอาจจะเป็นคนละโครงการ


สร้างโครงการ
  1. เข้าไปที่ Lifecycle Project Administration แล้วเลือกหัวข้อ Create Project จะปรากฏหน้าต่างสำหรับกรอกรายละเอียดของโครงการ
  2. กรอกชื่อโครงการ
  3. เลือก Template ของโครงการ
  4. กรอกคำอธิบายโครงการ
  5. ที่หัวข้อ Artifact Container จะมีรายการพื้นที่สำหรับเก็บ Artifact จากกระบวนการต่างๆตามต้นแบบที่เลือก เช่น ถ้าเลือก Template แบบที่ 1 (Quality Professional, Analyst, Developer) จะมีพื้นที่สำหรับ QM, RM และ CCM นอกจากนี้ เรายังสามารถเพิ่มเติม Artifact Container อื่นๆเข้ามาได้อีกด้วย แต่ในบทความนี้จะไม่ขอกล่าวถึง
  6. กดปุ่ม Save ที่มุมบนขวา

เพิ่มสมาชิกในทีม
เราจะสามารถเพิ่มสมาชิกในทีมได้ก็ต่อเมื่อ สมาชิกคนนั้นเป็น User อยู่ในระบบ
  1. ที่หน้าของโครงการ หัวข้อ Members เลือกหัวข้อ Show project members
  2. เลือก Add member จะปรากฏหน้าต่างให้เลือกชื่อที่ต้องการเพิ่มเป็นสมาชิกของโครงการ
  3. เลือกคนที่ต้องการ แล้วกด Add หรือ Add & Close เพื่อปิดหน้าต่างเลือกรายชื่อ
  4. ที่หน้ารายชื่อสมาชิกของโครงการ จะปรากฏชื่อที่เพิ่มเข้ามา
  5. กดปุ่ม Save ที่มุมบนขวา (หากไม่กด Save จะยังไม่สามารถกำหนดหน้าที่)
 กำหนดหน้าที่ของสมาชิกในทีม
  1. ที่หน้ารายชื่อสมาชิกของโครงการ ที่แถว Actions ของสมาชิกที่ต้องการกำหนดหน้าที่ กดปุ่ม Show member detail จะปรากฏรายละเอียดของสมาชิกคนนั้น ว่ามีสิทธิ์อะไรบ้าง
  2. ที่แถว Actions ของแต่ละ Artifact Container กดปุ่ม Edit the user's process role เพื่อกำหนดบทบาท หน้าที่ของสมาชิก จะปรากฏหน้าต่างสำหรับเพิ่มหน้าที่
  3. เลือกหน้าที่ที่ต้องการแล้วกด Add หรือเลือกหน้าที่ที่ไม่ต้องการ แล้วกด Remove เมื่อครบถ้วนแล้วจึงกดปุ่ม Ok
  4. ที่แถว Process Role จะปรากฏหน้าที่ต่างๆที่เราเลือกตามที่ต้องการ
เท่านี้ก็จะได้โครงการและทีมงานเรียบร้อยแล้ว หลังจากนี้ไปก็จะเป็นเรื่องการทำงานตามกระบวนการต่างๆ ซึ่งจะขอกล่าวในคราวหน้านะครับ โปรดติดตามตอนต่อไป

วันศุกร์ที่ 26 สิงหาคม พ.ศ. 2554

การติดตั้ง Rational Team Concert

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

เริ่มจากการดาวโหลดโปรแกรม
โปรแกรมนี้สามารถดาวโหลดได้ที่เว็บ Jazz.net สำหรับรุ่นที่แนะนำในบทความนี้คือ Rational Team Concert 3.0.1 โดยสามารถเลือก Platform ที่ต้องการ และเลือกรูปแบบของ License ได้ ตอนนี้ IBM ให้ Free 10 Developer License สามารถดาวโหลดในหน้าเดียวกันได้เลย แต่ถ้าหากต้องการดาวโหลดแบบเต็มๆ ก็เลือกหัวข้อ More download options ที่อยู่ข้างๆ Platform List นะครับ

อ้อ ตอนดาวโหลดจะต้องสมัครเป็นสมาชิกของเว็บก่อน ถึงจะดาวโหลดได้นะครับ

หมายเหตุ: หากดาวโหลดแบบไม่เต็ม คือเป็น Web Installer นั้น ไฟล์จะมีขนาดเล็กก็จริง แต่ตอนที่เราติดตั้ง จะต้องออนไลน์เพื่อที่จะดาวโหลดไฟล์ที่เหลือมาติดตั้งอีกทีหนึ่ง ซึ่งจะต้องใช้ user ที่ลงทะเบียนไว้ในตอนที่เราดาวโหลดมาด้วย

ติดตั้งโปรแกรม
สำหรับ Platform ที่สามารถใช้งานได้นั้น เขาแนะนำว่าควรจะเป็น 64 บิต OS และมีหน่วยความจำอย่างน้อย 4GB เช่น ถ้าติดตั้งบน Windows ก็ควรจะเป็น Windows Server 2008 R2 หรือ 2003 SP2 ก็ได้ แต่เนื่องจากโปรแกรมนี้เป็น Java Web Application ทำงานอยู่บน Tomcat ซึ่งสามารถใช้งานบน 32 บิต OS ได้อยู่แล้ว สำหรับการทดลองใช้ ไม่ได้ใช้งานหนักๆ ก็สามารถทำงานได้ แต่อาจจะอืดๆนิดๆ

เมื่อแตกไฟล์ออกมาแล้ว ให้รันโปรแกรม launchpad โดยคลิ๊กเมาส์ปุ่มขวา แล้วเลือก Run as administrator เพื่อให้มีสิทธิ์ในการติดตั้งโปรแกรม ซึ่งจะแสดงหน้าต่างรายชื่อโปรแกรมที่จะติดตั้ง ให้เลือกหัวข้อ
Jazz Team Server with Required Base Keys, including Trials, and CCM, QM and RM Applications
ซึ่งจะเป็นการติดตั้งโปรแกรมทั้งหมดในคราวเดียว โดยจะเริ่มจากการติดตั้ง IBM Installation Manager ก่อน แล้วค่อยติดตั้งโปรแกรมอื่นๆจากตัวนี้อีกทีหนึ่ง

สำหรับผู้ที่ดาวโหลดไฟล์ติดตั้งชุดที่มีชื่อเป็น Web เช่น RTC-Web-Installer-Win-3.0.1.zip นั้น ตอนติดตั้ง โปรแกรมจะดาวโหลดส่วนอื่นๆจากอินเตอร์เน็ตมาเพิ่ม ซึ่งจะต้อง Connect ไปที่ jazz.net ด้วย user ที่ลงทะเบียนไว้ และออนไลน์อยู่ตลอดในตอนที่ติดตั้งโปรแกรมนะครับ

Start/Stop Server
เมื่อติดตั้งโปรแกรมเรียบร้อยแล้ว จะปรากฏเมนูโปรแกรม Jazz Team Server และหัวข้อ Start และ Stop Server ให้สามารถสั่งให้ Server ทำงานได้ เราจะต้องกดเลือกหัวข้อ Start ด้วยเมาส์ปุ่มขวา เพื่อเลือก Run as administrator นะครับ เพราะจะได้รันด้วยสิทธิ์ในการเขียน/อ่านข้อมูลในโฟลเดอร์ Program Files ได้

เมื่อ Start ครั้งแรก ควรจะรอให้ Tomcat Deploy โปรแกรมส่วนต่างๆให้เรียบร้อยก่อน ซึ่งมันจะแสดงข้อความว่ากำลังติดตั้ง admin.jar, ccm.jar, qm.jar, rm.jar ให้เราเห็นในหน้าต่าง ควรจะรอจนกว่าจะขึ้นข้อความว่า
INFO: Server startup in ???? ms
? คือเวลาที่ใช้ในการ start ระบบ สำหรับครั้งแรกจะนานหน่อย แต่ครั้งถัดไปจะเร็วขึ้น

เมื่อจะจบการทำงาน ก็ให้เลือกเมนู Stop ด้วยสิทธิ์ของ admin เหมือนตอน Start นะครับ

Setup Server
จากนั้น เราสามารถล็อกอินเข้าสู่ระบบเพื่อทำการ Setup ได้ด้วย URL https://localhost:9443/jts/setup และใช้ User ID: ADMIN ส่วน Password ก็ใช้ ADMIN เช่นเดียวกัน จากนั้นจะปรากฏขั้นตอนต่างๆอยู่ทางซ้าย และปุ่ม Back, Next, Finish อยู่ด้านล่าง ทำการตั้งค่าตามขั้นตอนข้างล่างนี้ไปเรื่อยๆ ส่วนใหญ่แล้วจะกด Next แต่ควรจะรอให้หน้าเว็บ แสดงข้อความทดสอบสีเขียวขึ้นมาก่อน จึงจะทำขั้นต่อไปได้ ถ้ามีข้อผิดพลาดอะไร จะขึ้นข้อความสีแดง หรือข้อความเตือนก็จะเป็นสีเหลือง
  1. RATIONAL JAZZ TEAM SERVER (/jts)
    1. Introduction - กด Next
    2. Configure Public URI - ป้อน URI ที่จะใช้อ้างอิง โดยระบบจะใช้ URI นี้ตลอดไป ถ้าใช้งานเฉพาะในเครื่องตัวเองควรใช้ URI เป็น https://localhost:9443/jts เหมือนที่เราใช้ล็อกอินเข้ามา โดยจะมีข้อความเตือน เพราะ localhost ไม่ใช่ public URI แต่ไม่มีปัญหาใดๆ สามารถ กด Check Box ยอมรับ และกด Next ต่อไปได้
    3. Configure Database - จะมีการ config ฐานข้อมูลอัตโนมัติ สำหรับการใช้งาน Derby Database Server โดยเราไม่ต้องแก้ไขค่าใดๆ เมื่อขึ้นข้อความสีเขียวแล้ว สามารถกด Next ต่อไปได้เลย แต่ถ้าต้องการใช้งานร่วมกับฐานข้อมูลชนิดอื่น เช่น Oracle, Microsoft SQL Server ก็สามารถเปลี่ยนได้ แต่ต้องศึกษาวิธีการตั้งค่าให้ละเอียดจากคู่มือ Rational solution for Collaborative Lifecycle Management
    4. Enable E-Mail Notification - ไม่จำเป็นต้องตั้งค่าใดๆ กด Next ต่อไป
    5. Register Application - จะมี 2 ขั้นตอนคือ การตรวจสอบ Application และการลงทะเบียน ให้รอจนกว่ารายชื่อ Application จะแสดงครบ คือ /rm, /ccm, /qm และ /admin จากนั้นก็กดปุ่ม Register Applications ให้รอจนกว่าจะขึ้นข้อความสีเขียว แสดงว่าลงทะเบียน Application ได้แล้ว กดปุ่ม Next ต่อไปได้เลย
    6. Setup User Registry - หน้านี้จะเป็นการลงทะเบียนผู้ใช้ที่เป็นผู้ดูแลระบบ แทนที่ ADMIN ที่เราใช้ล็อกอินเข้ามาครั้งแรก ซึ่ง ADMIN จะถูกยกเลิกการใช้งานไป ให้ป้อน user name password ตามที่ต้องการ แล้วกด Next ต่อไป แต่หากต้องการทดลองใช้งานความสามารถด้านต่างๆ ก็สามารถเลือก Activate Trial License ต่างๆได้ ซึ่งให้ทดลองใช้ได้ 60 วัน ถ้าเราไม่ Activate ในขั้นตอนนี้ เราสามารถไป Activate ภายหลังได้
    7. Configure Data Warehouse - จะต้องป้อนชื่อ user name password สำหรับ user ที่ใช้ในการจัดการภายในของฐานข้อมูล Data warehouse โดย user นี้จะใช้งานเชื่อมโยงทั้ง CCM, QM และ RM จึงควรใช้ชื่อเดิม เช่น dw_user ตามตัวอย่างที่แนะนำไว้ และ password จะใช้อะไรก็ได้ โดยจะต้องกรอกในขั้นตอนถัดๆไปด้วย จากนั้นก็กด Next เป็นอันสิ้นสุดการ config server
  2. CHANGE AND CONFIGURATION MANAGEMENT (/ccm)
    1. Configure Database - สำหรับฐานข้อมูล Derby จะมีการ configure อัตโนมัติ สามารถกด Next ต่อไปได้เลย
    2. Configure Data Warehouse - ป้อนรหัสผ่านให้ถูกต้อง แล้วกด Next
    3. Finalize Application - กดปุ่ม Finalize Application Setup รอจนกว่าจะขึ้นข้อความสีเขียว เป็นอันสิ้นสุดการ configure CCM กด Next
  3. QUALITY MANAGEMENT (/qm)
    1. Configure Database - สำหรับฐานข้อมูล Derby จะมีการ configure อัตโนมัติ สามารถกด Next ต่อไปได้เลย
    2. Configure Data Warehouse - ป้อนรหัสผ่านให้ถูกต้อง แล้วกด Next
    3. Finalize Application - กดปุ่ม Finalize Application Setup รอจนกว่าจะขึ้นข้อความสีเขียว เป็นอันสิ้นสุดการ configure QM กด Next
  4. REQUIREMENT MANAGEMENT (/rm)
    1. Finalize Application - กดปุ่ม Finalize Application Setup รอจนกว่าจะขึ้นข้อความสีเขียว เป็นอันสิ้นสุดการ configure RM กด Next
  5. LIFECYCLE PROJECT ADMINISTRATION (/admin)
    1.  Finalize Application - กดปุ่ม Finalize Application Setup รอจนกว่าจะขึ้นข้อความสีเขียว เป็นอันสิ้นสุดการ configure ADMIN กด Next
  6. FINISH SETUP
    1. Summary - แสดงหน้าสรุป สามารถเลือกที่จะเริ่มสร้าง User สร้าง Project หรือจบการทำงานด้วยการกดปุ่ม Finish แล้วค่อยล็อกอินเข้ามาจัดการภายหลังได้
เข้าใช้งาน
เข้าใช้งานระบบได้จาก Public URI ที่ตั้งไว้ในขั้นตอนก่อนหน้านี้ นั่นคือ https://localhost:9443/jts โดยล็อกอินด้วย user ใหม่ที่สร้างขึ้น

เพิ่ม Client Access License
หากต้องการเพิ่ม Client Access License เช่น Free 10 Developer License ที่ IBM ให้ฟรีนั้น สามารถเข้าไปเพิ่มได้ที่ Server Administration/License Key Management ตรงหัวข้อ Client Access License Types กด Add แล้วเลือกไฟล์ License ที่ดาวโหลดมา กด Finish ก็จะมีหัวข้อของ 10 Developer เพิ่มเข้ามา

ทั้งหมดนี้ คือขั้นตอนการติดตั้ง Rational Team Concert สำหรับการใช้งานส่วนอื่นๆนั้น ไว้ค่อยมาเขียนต่อคราวหน้านะครับ

วันศุกร์ที่ 19 สิงหาคม พ.ศ. 2554

เสียเวลาไปเดือนกว่าๆ กับการพยายามใช้ Rational Team Concert

เมื่อประมาณเดือนกว่าๆที่ผ่านมา ผมได้พยายามหาโปรแกรมที่ช่วยในการบริหารจัดการโครงการมาใช้ ส่วนหนึ่งนั้นเป็นเพราะในเทอมนี้ ได้สอนวิชา Software Engineering จึงอยากจะเอามาแนะนำให้นักศึกษาได้เรียนรู้ ส่วนหนึ่งก็เพราะมีโครงการวิจัยที่ต้องจัดการอยู่หลายโครงการ ก็เลยนึกถึงโปรแกรม Rational Rose ของ IBM ที่สมัยก่อน(ประมาณ 10 กว่าปีมาแล้ว) เคยใช้ในการออกแบบโปรแกรม สร้าง UML Diagram แต่สมัยนี้ ทาง IBM ได้สร้างเป็นโปรแกรมใหม่ชื่อว่า Rational Team Concert (RTC) หรือจะเรียกชื่อเต็มๆซึ่งเป็นโปรแกรมชุดใหญ่ชื่อว่า Rational solution for Collaborative Lifecycle Management (CLM)

โปรแกรมนี้จะทำงานเป็น Server โดยมีแกนของระบบชื่อว่า Jazz Foundation หรือ Jazz Team Concert (JTC) ซึ่งพัฒนาเป็น Open Source ในโครงการที่ชื่อว่า  Jazz Project (jazz.net) และที่น่าสนใจมากก็คือ สถาปัตยกรรมของระบบ จะมี Jazz Foundation เป็นโครงสร้างพื้นฐาน จากนั้นก็จะมีโมดูลต่างๆสวมเข้ามาในระบบคล้ายการ Plug-In ทำให้กลายเป็นระบบใหญ่ที่ทำโน่นทำนี่ได้หลายอย่าง ใครสนใจเจ้า Jazz Foundation ก็สามารถดาวโหลดได้ที่ https://jazz.net/downloads/jazz-foundation/

ปัญหาก็มีอยู่ว่า ผมได้ติดตั้งโปรแกรมนี้ตั้งแต่เมื่อเดือนกว่าๆที่ผ่านมา โดยติดตั้งโปรแกรมนี้บน Ubuntu 10.04 แต่เมื่อถึงขั้นตอน setup ก็เกิดปัญหาขึ้นกับฐานข้อมูล คือ โปรแกรมจะสร้างฐานข้อมูลอยู่นาน และบางครั้งก็ไม่สำเร็จ ทำให้เกิด error ต่างๆตามมา ผมก็ลบฐานข้อมูลทิ้งแล้ว setup ใหม่อยู่หลายรอบ ก็ได้บ้างไม่ได้บ้าง ครั้งที่ได้ เมื่อใช้งานไปสักพัก ระบบก็รวน เกิด error ต่างๆตามมาอีก ผมจึงคิดว่า ปัญหาน่าจะเป็นที่ตัว Derby ที่เป็น database server ซึ่งอาจจะไม่เหมาะกับโปรแกรมใหญ่ๆอย่าง RTC นี้ ซึ่งโปรแกรมนี้สามารถใช้งานร่วมกับ database server ได้หลายยี่ห้อ เช่น Oracle, Microsoft SQL และ DB2 และผมคิดว่า ฐานข้อมูลของ IBM น่าจะใช้งานร่วมกับโปรแกรมของ IBM ได้ดี ผมจึงเลือกเอา DB2 Express-C มาลง ซึ่ง IBM ใจดีให้ใช้ฟรีอีกด้วย แต่ผมเองก็ไม่เคยใช้งาน DB2 มาก่อน ก็เลยต้องเสียเวลาศึกษาวิธีการติดตั้งและใช้งานอยู่พักใหญ่ เสียเวลาไปอีกเป็นสัปดาห์ ก็ติดตั้งและ setup ได้บ้างไม่ได้บ้างเหมือนเคย

ก็คิดว่าอาจจะเป็นปัญหาที่ Java คือ โปรแกรมนี้ใช้ JRE ของ IBM เอง และทุกครั้งที่ shutdown server ก็มักจะมีข้อความ stack overflow โผล่มาให้เห็นทุกครั้ง ผมจึงพยายามเปลี่ยนให้ RTC มาใช้ JRE ของ Sun แทนโดยเข้าไปแก้ไข script ตอน startup server แต่ผลลัพธ์ที่ได้คือ โปรแกรมรันได้ แต่ไม่ตอบสนองต่อ browser เลย ผมก็พยายามอยู่หลายวิธี จนผ่านไปเดือนกว่าๆ จนผมแทบจะหมดความอดทน กำลังคิดว่า ถ้ายังแก้ปัญหาไม่ได้ คงต้องหาโปรแกรมตัวอื่นมาใช้แทนซะแล้ว แต่ก็น่าเสียดายอยู่ เพราะโปรแกรมของ IBM ตัวนี้ มีชื่อเสียงมาก มีความสามารถสูง และทำได้หลายอย่าง

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

ปัญหานี้ความจริงแล้ว ผมก็ได้ทำตามขั้นตอนการติดตั้งที่เขาบอกไว้แล้ว คือ เนื่องจากโปรแกรมจะเปิดไฟล์เป็นจำนวนมาก และโดยปกติแล้ว Linux จะตั้งค่าจำนวนไฟล์ที่เปิดได้ไว้ที่ 1024 ซึ่งก็มากโขอยู่ แต่ตามคู่มือบอกว่า ให้ตั้งไว้เป็น 65536 โดยให้ไปแก้ไขที่ /etc/security/limits.conf และสามารถตรวจสอบจำนวนไฟล์ที่จำกัดได้จากคำสั่ง ulimit -n ซึ่งจะได้ค่า 65536 กลับมา แสดงว่าเรากำหนดไว้ถูกต้องแล้ว และก็ไม่น่าจะมีปัญหาอะไร

แต่...ปัญหาก็คือ ทุกๆครั้งที่ผมจะ start server ผมก็จะเปลี่ยนไปเป็น root ด้วยคำสั่ง sudo su และผมก็ไม่เคยเอะใจเลยว่า มันจะทำให้ ulimit กลับมาเป็น 1024 ทำให้เมื่อโปรแกรมทำงานไปจนถึงขีดจำกัดนี้ มันก็ทำงานต่อไม่ได้ ทำให้เกิด error ต่างๆแบบ random ไม่แน่นอน สร้างปัญหาปวดหัวแบบไม่ซ้ำรูปแบบได้ตลอดเวลา สุดท้าย ผมก็เลยต้องเพิ่มคำสั่ง ulimit -n 65536 เข้าไปใน startup script เพื่อแก้ปัญหานี้ แล้วทุกอย่างก็ทำงานได้อย่างราบรื่น เฮ้อ...

หลังจากแก้ปัญหาได้แล้ว ผมก็เลยโพสปัญหาเข้าไปที่ Jazz Forum ปรากฏว่า มีคนพบปัญหานี้มาแล้วเช่นกัน ตั้งแต่เมื่อเดือนกุมภาพันธ์ และมีข้อแนะนำ เฉพาะสำหรับ Ubuntu ว่า มีปัญหาการใช้เครื่องหมาย * ในไฟล์  /etc/security/limits.conf ที่เดิมนั้นคู่มือแนะนำให้ใช้ * แทน user ทุกๆคน แต่สำหรับบน Ubuntu (หรือไม่แน่ใจว่าเป็นกับ Debian ด้วยหรือเปล่า) จะไม่มีผลต่อ root

วันจันทร์ที่ 4 กรกฎาคม พ.ศ. 2554

การใช้ VLC เป็น Screen Recorder

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

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

ข้อดีของการใช้โปรแกรม VLC คือ
  1. เป็น Open Source สามารถดาวโหลดมาใช้งานได้ฟรี
  2. ใช้งานได้ทั้งบน Windows, Mac และ Linux (บนมือถือ Android ก็มี แต่น่าจะเป็น Player อย่างเดียว, หรือเปล่า?)
  3. ใช้เป็นได้ทั้ง Player และ Recorder
  4. สามารถบันทึกวีดีโอไฟล์ได้หลายแบบ
  5. มี Codec รองรับการเข้ารหัสหลายแบบ
  6. ฯลฯ

สำหรับการบันทึกวีดีโอของ Screen แบบง่ายที่สุดคือ
  1. เลือกเมนู Media/Streaming หรือกด Ctrl+S จะเปิดหน้าต่างของ Media
  2. เลือก Capture Device/Capture Mode เป็น Desktop
  3. กำหนด Frame rate ว่าจะให้บันทึกกี่ Frame ต่อวินาที
  4. กดปุ่ม Stream จะเข้าสู่หน้าถัดไป
  5. กดปุ่ม Next เข้าสู่หน้ากำหนดปลายทาง (New destination) ให้เลือกเป็น File แล้วกด Add
  6. เพิ่มชื่อไฟล์เสร็จแล้วให้กด Next จะเข้าสู่หน้าให้เลือกวิธีการเข้ารหัส เมื่อเลือกเสร็จแล้วก็กด Next
  7. เข้าสู่หน้าสุดท้ายที่จะให้กำหนด Option ซึ่งไม่จำเป็นต้องตั้งค่าอะไร
  8. กดปุ่ม Stream จะเสร็จสิ้นการตั้งค่า และเริ่มการบันทึกวีดีโอ
  9. เมื่อบันทึกเสร็จ ก็กดปุ่ม Stop เป็นอันเสร็จสิ้นการบันทึกวีดีโอ
สำหรับวิธีง่ายที่สุดนี้ จะบันทึกเฉพาะภาพของ Screen เท่านั้น จะไม่มีเสียง หากต้องการให้มีการบันทึกเสียงด้วย จะต้องเลือก Capture Mode ในข้อ 2 เป็น DirectShow (สำหรับบน Windows) หรือ Video for Linux/Video for Linux 2 (สำหรับ Linux)

สำหรับการใช้ DirectShow นั้น ปกติแล้ว เราจะพบว่า Video Device มีให้เลือกเพียง Default กับ None ซึ่งไม่ว่าจะเลือกอะไร ก็จะไม่สามารถบันทึกภาพจาก Screen ได้ เราจะต้องติดตั้งโปรแกรมที่ทำงานเป็น Video Device ที่ Capture ภาพจาก Screen มาให้ DirectShow ได้ ซึ่งเท่าที่หาข้อมูลมา พบว่ามีคนแนะนำ VH Screen Capture ซึ่งใช้งานได้ แต่จะมีโลโก้ของบริษัทแปะไว้ในภาพตลอด สุดท้ายแล้ว ที่ใช้งานได้และไม่มีโลโก้ติดอยู่ก็คือ UScreenCapture

ถ้า ติดตั้ง UScreenCapture เสร็จเรียบร้อยแล้ว ตอนที่เราเลือก Video Device จะต้องมีชื่อ UScreenCapture ปรากฏให้เลือกได้ จากนั้นก็กำหนดค่าต่างๆตามที่เราต้องการ

การทำ Automatic Sync ข้อมูลบน Ubuntu

เดี๋ยวนี้อะไรๆก็ Sync ข้อมูลกันหมด เช่น Android เมื่อเราตั้งค่าอะไรไว้ในเครื่องแท็บเบล็ต หรือโทรศัพท์มือถือของเรา จะมีการ Sync ข้อมูลที่เราตั้งไว้ไปที่ Google หลายๆโปรแกรมก็ใช้หลักการเดียวกันนี้ เอาข้อมูลของเราไปเก็บไว้ เรียกว่าให้ความสะดวกแก่เรา แต่ในทางกลับกัน ก็ดึงเอาความเป็นส่วนตัวของเราไปเก็บไว้เป็นตัวประกันด้วย

วัน นี้ผมก็เลยอยากเสนอ การ Sync ข้อมูลของเราไปเก็บไว้ในที่ของเราเอง เช่น ผมมีเครื่อง Notebook และ Desktop ใช้งานกันอยู่ประจำ และจะต้องมีการ copy ข้อมูลกันอยู่ตลอด ปกติผมก็ใช้โปรแกรมช่วย copy อย่าง FileZilla ซึ่งเป็นโปรแกรม Open Source มีใช้งานได้ทั้งบน Linux และ Windows ก็สะดวกดีครับ หรืออีกโปรแกรมหนึ่งที่ผู้ใช้ Linux นิยมกันมาก นั่นก็คือ rsync หรือ Grsync (เป็น Gnome GUI) น่าใช้ไม่แพ้กัน โปรแกรม rsync นี้ เหมาะกับการ Sync ข้อมูลเป็นประจำมากกว่า คือ เราสามารถระบุ folder ที่ต้องการ Sync ระหว่างต้นทางกับปลายทาง แล้วทุกอย่าง rsync จะจัดการให้ ดังนั้น rsync จึงเหมาะกับการทำ backup ประจำนั่นเอง

แต่ เมื่อไม่นานมานี้ ผมมีความต้องการให้เครื่องของผม Sync ข้อมูลกันอัตโนมัติิ ผมก็เลยต้องพึ่งพาความสามารถของ cron หรือ crontab ซึ่งเป็นโปรแกรมที่จะคอยเรียกโปรแกรมมาทำงานตามคำสั่งที่เราตั้งไว้ ตามเวลาที่กำหนด เมื่อเอาคำสั่ง rsync ไปใส่ไว้ใน crontab ตรงๆ ปรากฏว่า ไม่ได้ผลครับ เช็คไป เช็คมา ปรากฏว่า เมื่อเรา remote Sync ไปยังอีกเครื่องหนึ่ง จะมีการถาม username/password แต่ cron เรียก rsync ให้ทำงานอยู่เบื้องหลัง เราก็เลยป้อน username/password ไม่ได้ หรือถ้าได้ เราก็คงไม่มารอป้อน username/password ทุกครั้งเป็นแน่ ไม่อย่างนั้น จะเรียกว่า อัตโนมัติได้ไงล่ะ

ผมก็เลยเดือดร้อน ต้องหาวิธีที่จะให้ rsync ทำงานได้โดยไม่ต้องป้อน username/password ซึ่งก็มีคนแนะนำไว้ใน internet วิธีแรกคือ การเรียก rsync ในโหมด daemon ซึ่งจะต้องมีการ เซ็ตค่าหลายๆอย่าง รวมทั้งการเก็บ password ไว้ในไฟล์ๆหนึ่ง ซึ่งเราจะต้องป้องกันไฟล์นี้ให้ดีๆ ไม่อย่างนั้น อาจจะเป็นช่องโหว่ให้คนอื่นมาเห็น password ของเราได้ แต่ทำไปทำมา สุดท้าย ก็ไม่สำเร็จครับ อาจจะเป็นเพราะ จะต้องเปิด port 873 ไว้เป็น default port ของ rsync daemon หรือการเซ็ตต่า /etc/rsync.conf ไม่ถูกก็แล้วแต่ สรุปว่า ไม่สำเร็จ และไม่น่าจะเป็นทางออกที่ดี เพราะมันค่อนข้างซับซ้อน

อีก วิธีหนึ่งคือการใช้ความสามารถของ ssh ซึ่งเป็น default shell ของ rsync ที่ใช้ในการติดต่อกับ remote อยู่แล้ว โดยเราจะต้องสร้าง key ไว้ใน folder .ssh ของเรา ด้วยโปรแกรม ssh-keygen ดังนี้

ssh-keygen -b 1024 -t rsa -f .ssh/id_rsa

หมายเหตุ ไม่ต้องกำหนด passphrase คือให้กด Enter ผ่านไปเลย

จาก นั้นให้ copy public key ซึ่งก็คือไฟล์ id_rsa.pub ไปไว้ที่ folder .ssh ของเครื่อง remote แต่ให้ตั้งชื่อเป็น authorize_keys เช่น

scp .ssh/id_rsa.pub somchai@x.y.z:~/.ssh/authorized_keys

เมื่อ copy เรียบร้อยแล้ว อาจจะทดลองสั่ง rsync ดู จะพบว่า โปรแกรมสามารถ Sync ได้ทันที โดยไม่ต้องป้อน username/password เช่น

rsync -r -t -p -o -g -v --progress --delete -c -l -z somchai@x.y.z:~/eBooks/ /home/somchai/eBooks/

เมื่อ ทุกอย่างเรียบร้อยดี ไม่มีปัญหา ก็สามารถเอาคำสั่งนี้ไปตั้งเวลาใน cron ได้ โดยสั่ง crontab -e จะปรากฏไฟล์ให้แก้ไข ซึ่งสามารถกำหนด นาที, ชั่วโมง, วันที่, เดือน, วันในสัปดาห์, คำสั่ง ดังนี้

# m h dom mon dow command
0 0 * * * rsync -r -t -p -o -g -v --progress --delete -c -l -z /home/somchai/eBooks/ somchai@x.y.z:~/eBooks/

ตัวอย่างข้างบนนี้ เป็นการตั้งให้ Sync ข้อมูลใน folder eBooks ทุกวัน เวลาเที่ยงคืน