ป้ายกำกับ

วันศุกร์ที่ 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

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

Eclipse cannot start after upgrade Ubuntu to 13.10

สองวันมานี้ผมเสียเวลาไปกับการอัพเกรดเครื่องจาก Ubuntu 12.04 LTS ไปเป็น 13.10 เนื่องจากผมต้องการทดลองใช้งานโปรแกรมใหม่ๆ จึงคิดว่าถึงเวลาเตรียมพร้อมสำหรับ 14.04 LTS ที่จะออกมาประมาณเดือนเมษายนนี้แล้ว โดยผมใช้วิธีค่อยๆอัพเกรดเป็นขั้นๆ เนื่องจากมีโปรแกรมหลายๆอย่างที่ผมไม่อยากตั้งค่าใหม่ และอยากจะเห็นความเปลี่ยนแปลงของแต่ละรุ่นด้วย แต่ก็เสียเวลามากหน่อยเพราะต้องอัพเกรดดังนี้

  • จาก 12.04 LTS ไปเป็น 12.10
  • จาก 12.10 ไปเป็น 13.04
  • จาก 13.04 ไปเป็น 13.10
เสียเวลาไปเกือบสองวัน สุดท้ายก็ได้ทุกอย่างสมกับที่ยอมเสียเวลาเหนื่อย

แต่ก็มีปัญหากับ Eclipse ที่รันไม่ได้ ปัญหานี้มักจะเจอบ่อยๆในหลายๆครั้งที่ผมอัพเกรด Ubuntu ครั้งนี้มี Error คือ

!SESSION Mon Jan 20 21:15:05 ICT 2014 ------------------------------------------
!ENTRY org.eclipse.equinox.launcher 4 0 2014-01-20 21:15:05.091
!MESSAGE Exception launching the Eclipse Platform:
!STACK
java.lang.ClassNotFoundException: org.eclipse.core.runtime.adaptor.EclipseStarter
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:626)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:584)
at org.eclipse.equinox.launcher.Main.run(Main.java:1438)
at org.eclipse.equinox.launcher.Main.main(Main.java:1414)

มีหลายคนแนะนำให้แก้ไขไฟล์ eclipse/configuration/config.ini เนื่องจากชื่อไฟล์ org.eclipse.osgi_x.x.x.jar ไม่ตรงกับรุ่นที่ติดตั้ง ซึ่งเมื่อผมตรวจสอบ พบว่า ในเครื่องของผมไม่มีไฟล์นี้อยู่ ไม่รู้ว่าหายไปไหน และก็ไม่รู้ว่าจะเอามาจากไหนดีด้วย ค้นไปค้นมา ก็พบว่ามันอยู่ใน Package ชื่อ libequinox-osgi-java ครับ แต่ในเครื่องมันแสดงว่าผมติดตั้งไว้แล้ว ซึ่งควรจะมีไฟล์อยู่ ผมจึง reinstall ใหม่ ก็ใช้ได้เลยครับ

วันพุธที่ 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 ใหม่ตามที่ต้องการ

วันอังคารที่ 17 ธันวาคม พ.ศ. 2556

CDN (Content Delivery Network) คืออะไร

CDN คืออะไร?

ความจริงคำว่า CDN มีมานานพอสมควรแล้ว แต่อาจจะไม่แพร่หลายเหมือนอย่างคำว่า Cloud ซึ่ง CDN นี้ ย่อมาจากคำว่า Content Delivery Network หรือบางท่านอาจจะเรียกว่า Content Distributed Network ความหมายสั้นๆตรงๆเลยก็คือ ระบบเครือข่ายที่จะทำหน้าที่ส่งข้อมูลให้ถึงผู้รับได้อย่างรวดเร็วโดยวิธีการกระจายเครื่องแม่ข่ายออกไปยังภูมิภาคต่างๆให้ไกล้กับผู้รับมากที่สุด เช่น เมื่อเราเปิดเว็บ Facebook ถ้าสังเกตข้อความแสดงสถานะการรอคอยข้อมูลด้านล่างของ Browser เราจะพบว่า แทนที่จะมีการดึงข้อมูลจาก www.facebook.com อย่างเดียว กลับมีการดึงข้อมูลมาจาก xxx.akamixx.net ซึ่งเป็น server ของบริษัท Akamai Technologies ที่ให้บริการ CDN ให้กับ Facebook นั่นเอง

แล้วมันยังไง?

หลายคนอาจจะสงสัยว่า แล้วเขาทำอย่างนั้นได้อย่างไร? คำตอบก็คือว่า จะมีการกระจายเครื่องแม่ข่ายออกไปตามภูมิภาคต่างๆ เช่น เว็บหลักอยู่ที่อเมริกา แต่มีการตั้งเครื่องแม่ข่ายกระจายไปยังประเทศอื่นๆ ไม่ว่าจะเป็น ญี่ปุ่น จีน อังกฤษ ออสเตรีย สิงคโปร์ เป็นต้น โดยจะมีการกระจายเนื้อหาที่เป็นแบบ static มาไว้บนเครื่องแม่ข่ายเหล่านี้ก่อน เช่น ไฟล์ภาพ ไฟล์วีดีโอคลิป ไฟล์ CSS และไฟล์ JavaScript เป็นต้น เมื่อมีการร้องขอข้อมูลใดๆไปยังเครื่องหลักที่ใช้ระบบ CDN การร้องขอนั้นก็จะถูก Re-Direct ไปยังเครื่องแม่ข่ายในระบบเคลือข่ายของ CDN ที่อยู่ไกล้ที่สุด ทำให้เราได้รับข้อมูลอย่างรวดเร็ว และลดภาระงานให้กับเครื่องหลักได้มาก นอกจากนี้ หากเครื่องใดรับภาระงานมากเกินไป ระบบก็สามารถกระจายภาระงานออกไปยังเครื่องแม่ข่ายอื่นๆที่อยู่ไกล้เคียงได้อย่างเหมาะสมอีกด้วย โดยที่เราแทบจะไม่รู้สึกเลยว่าข้อมูลนั้นมาจากไหน

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

วันพุธที่ 30 ตุลาคม พ.ศ. 2556

Visual Studio 2013 ดาวโหดฟรีสำหรับนักศึกษา

วันนี้เมื่อผมเปิดใช้ Visual Studio 2012 มันเตือนให้ Update โดยขณะนี้เป็น Update 3 แล้ว ผมจำได้ว่าไม่ได้ใช้ Visual Studio เพียงไม่กี่เดือนเท่านั้นนี่นา เอแต่ทำไมจึงยังไม่เคยเห็น Update 2 เลย แต่ไม่ว่าจะเป็นรุ่นไหน ยังไงก็ขอ Update ซะหน่อย ปรากฏว่ามีปัญหาเล็กน้อย เนื่องจากไฟล์โปรแกรม Update ที่มันให้ดาวโหลดมาติดตั้งนั้น เมื่อรันแล้ว มันจะดาวโหลดส่วนอื่นๆที่เหลือมาลง และปรากฎว่า มันดาวโหลดมาเพียง Package เดียวแล้วก็ติดตั้งเลย ซึ่งทำให้เกิด Error ว่าหา Package อื่นๆไม่เจอ ผมก็เลยต้องดาวโหลดไฟล์เต็มๆมา ขนาดทั้งหมด 2.2GB เสียเวลาไปเป็นชั่วโมง สุดท้ายก็ติดตั้งได้เรียบร้อย

เมื่อเสร็จแล้ว ผมก็เลยคิดว่า แล้ว Visual Studio มีอะไรใหม่ๆเพิ่มขึ้นมาบ้าง ก็เลยเข้าเว็ปของไมโครซอฟต์ดู ปรากฏว่ามี Visual Studio 2013 ออกมาแล้วครับ ตามข่าวในเว็ปบอกว่าออกมาตั้งแต่เมื่อวันที่ 17 ตุลาคม 2556(2013) นี้  อืมช้าไปประมาณ 10+1 เดือน เพราะตามข่าวบอกว่าตอนนี้ปล่อยออกมาทางเว็ปให้ดาวโหลดไปทดลองกันดู เป็นรุ่น Released Candidate (RC) และจะปล่อยจริงเดือนหน้าครับ

อย่างไรก็ตาม ไมโครซอฟต์ก็ยังคงนโยบายเดิมคือมีรุ่น Express ให้ดาวโหลดไปใช้กันฟรีๆด้วย ซึ่งก็เรียกว่าเป็นปกติมาตั้งแต่สมัย Visual Studio 2005 แล้ว และยิ่งกว่านั้นคือ มีรุ่น Professional ให้ดาวโหลดฟรี สำหรับนักศึกษาด้วย อันนี้มีมาตั้งแต่สมัย Visual Studio 2012 ครับ งานนี้ไมโครซอฟต์ทุ่มทุนอย่างมากเลย แต่ก็ดีครับ เราก็จะได้ไม่ต้องใช้ของเถื่อน ละเมิดลิขสิทธิ์กัน ยังไงไมโครซอฟต์ก็ไม่ขาดทุนอยู่แล้ว ยิ่งมีนักพัฒนาบน Windows มากเท่าไหร่ ก็ยิ่งขายดีมากขึ้น

วันอังคารที่ 8 ตุลาคม พ.ศ. 2556

Professional jQuery

Title:Professional JQuery
Authors:Cesar Otero & Rob Larsen
Formats:PDF
Ids:Google, Douban Books,9781118026687
Tags:JavaScript, jQuery, Programming Language, Web
Publishers:John Wiley & Sons
Author Sort:Otero, Cesar & Larsen, Rob
Title Sort:Professional JQuery
Date:08 ต.ค. 2013
uuid:0d8f471b-3b3a-428d-bec3-fe77f0382add
id:5953
Published:พ.ค. 2012
Modified:08 ต.ค. 2013
Size:22.69MB
Languages:English
Type:book

Over the past several years JavaScript has undergone a remarkable transformation. It is now one of the most important programming languages in the world. With the ongoing importance of Ajax-based development and the rise of full-featured JavaScript libraries, most of the stigma around JavaScript has vanished. The most beginner-friendly library, jQuery, is responsible for most of this turnaround. jQuery is used at some of the largest organizations in the world, including Amazon, IBM, Twitter, NBC, Best Buy, and Dell. In 2011 there were three major releases in jQuery and the community surrounding it continues to grow. jQuery is prominently featured at the front end of Java/Spring, PHP, .NET, Ruby on Rails, and Python/Django stacks all over the Web. If you have experience with HTML, CSS, and JavaScript, this book is for you. It will expand your jQuery knowledge by focusing on the core library with the benefit of strong core JavaScript expertise in many of the lessons.This book is aimed at three groups of readers: Experienced server-side web application developers looking to move into the client-side using the world's most popular front-end libraryExperienced JavaScript programmers looking to ramp up quickly on jQueryNovice to intermediate jQuery developers looking to expand their jQuery knowledge into more advanced topicsThis book is not aimed at beginners. For those looking to start with the basics of HTML, CSS, and JavaScript/jQuery development, " Beginning JavaScript and CSS Development with jQuery (Wrox Programmer to Programmer)" by Richard York will most likely help you more.This book covers a lot of information about jQuery including a developer-level introduction as well as providing an in-depth look into some of the more advanced features. The book is divided into two parts, jQuery Fundamentals and Applied jQuery. jQuery Fundamentals introduces the core concepts while Applied jQuery focuses on more advanced subjects. The first part of the book offers an in-depth introduction to jQuery fundamentals, which includes selecting elements, manipulating the DOM, and binding and reacting to browser books. After providing a solid foundation, the book will then outline more advanced topics such as plugin development, unit testing with JavaScript, and other advanced features of the library. The book also focuses on features available as of jQuery 1.7.1. but also tries to incorporate feature support in older versions of the library wherever it is relevant.The first few chapters will help you set up a development environment and they also review important JavaScript concepts. Chapters 3-7 examine the jQuery core concepts. The second half of the book focuses on applying jQuery in the real world as well as detailing jQuery UI, plugin development, and templates among other lessons.Part 1, jQuery Fundamentals, contains chapters 1-7. Chapter 1 sets up an environment for developing and debugging jQuery and JavaScript code. It also defines the code standards that will be used throughout the book. Chapter 2 goes through the basics of JavaScript programming language to strengthen the foundation that the rest of the book is built upon. Chapter 3 introduces the basic functions that make up the library and illuminates usages of the core jQuery functions. It also introduces many of the functions that you will need to perform varieties of tasks. Chapter 4 goes in-depth into one of the core features of jQuery, which is the ability to select and manipulate HTML elements. Chapter 5 introduces another feature of jQuery: the cross-browser ability to bind and manage browser events. Chapter 6 explores one of the biggest revolutions in web development in recent years--Ajax. Chapter 7 focuses on some of the shortcuts jQuery offers for animating components in your web applications. These include moving, fading, toggling, and resizing elements.Part 2, Applied jQuery, contains chapters 8-14. Chapter 8 introduces jQuery UI, which is an associated user interface library for jQuery and contains things such as widgets, effects, animations, and interactions. Chapter 9 explores additional jQuery UI features including moving, sorting, resizing, and selection elements with a mouse. Chapter 10 teaches a variety of techniques, best practices, and patterns that you can apply to your code to immediately make it more efficient, maintainable, and clear. Chapter 11 focuses on the jQuery Template plugin. Templates are a standard way of marrying data and markup snippets. Chapter 12 focuses on authoring jQuery plugins. It is important to know how to extend the power of jQuery with custom methods as it is a fundamental skill for a top jQuery developer. Chapter 13 introduces the jQuery Deferred Object, which was introduced in version 1.5. It is a chainable utility object that provides control over the way callback functions are handled. Chapter 14 introduces the general concept of unit testing and goes into detail with the specific unit testing framework created by and used by the jQuery project itself, QUnit.In order to use this book effectively, you will need one of the following web browsers to run the samples provided within the book: Firefox 3.6, Current -1 VersionInternet Explorer 6+Safari 5.0xOpera current - 1 VersionChrome Current - 1 VersionCesar Otero is a freelance web developer. His technical interests include Python, Django, JavaScript, and jQuery. He sometimes contributes articles to IBM's developer works. He holds a degree in electrical engineering.Rob Larsen has many years' experience as a front-end engineer and team leader. He has built websites and applications for some of the world's biggest brands. He is currently a Senior Specialist, Platform at Sapient Global markets. Rob is an active writer and speaker on web technology with a special focus on emerging standards like HTML5, CSS3, and JavaScript.

jQuery Ui 1.8

Title:jQuery Ui 1.8
Authors:Wellman, Dan
Formats:PDF
Ids:Google, Douban Books,9781849516525
Tags:JavaScript, jQuery, Programming Language, UI, Web Programming
Publishers:Packt Publishing, Limited
Author Sort:Dan, Wellman,
Title Sort:jQuery Ui 1.8
Date:08 ต.ค. 2013
uuid:4ba7f0a4-6a55-4ba5-82aa-80865000c5d1
id:5952
Published:ส.ค. 2011
Modified:08 ต.ค. 2013
Size:7.11MB
Languages:English
Type:book

jQuery UI, the official suite of plugins for the jQuery JavaScript library, gives you a solid platform on which to build rich and engaging interfaces with maximum compatibility, stability, and a minimum of time and effort.jQuery UI has a series of ready-made user interface widgets and a comprehensive set of core interaction helpers to reduce the amount of code that you need to write to take a project from conception to completion.jQuery UI 1.8: The User Interface Library for jQuery has been specially revised for version 1.8 of jQuery UI. It is written to maximize your experience with the library by breaking down each component and walking you through examples that progressively build upon your knowledge, taking you from beginner to advanced usage in a series of easy-to-follow steps.Throughout the book, you'll learn how each component can be initialized in a basic default implementation and then customize and configure each component to tailor it to your application. You'll look at the configuration options and the methods exposed by each component's API to see how these can be used to bring out the best of the library. Each chapter will also show you the custom events fired by the component covered and how these events can be intercepted and acted upon.What you will learn from this book :How the CSS framework consistently themes the widgets and how these styles can be used in your own codeCreate a custom jQuery UI widget using the widget libraryThe underlying mark-up required by different components, and how each widget or interaction helper is initializedConfigure the different components, and the different options that each component usesWork with each widget programmatically using its methods and event hooksPractical examples of how each component can be usedAdd flair to your interface with animation effectsApproachAn example-based approach leads you step-by-step through the implementation and customization of each library component and its associated resources. Reference tables of each configuration option, method, and event for each component are provided, alongside detailed explanations of how each widget is used.Who this book is written forThis book is for front-end designers and developers who need to quickly learn how to use jQuery UI. To get the most out of this book you should have a good working knowledge of HTML, CSS, and JavaScript, and should ideally be comfortable using jQuery.

jQuery Pocket Reference

Title:jQuery Pocket Reference
Authors:David Flanagan
Formats:PDF
Ids:Google, Douban Books,9781449397227
Tags:HTML, JavaScript, jQuery, Programming Languages, Reference, Web, Web Programming
Publishers:O'Reilly
Author Sort:Flanagan, David
Title Sort:jQuery Pocket Reference
Date:08 ต.ค. 2013
uuid:e6a094f5-2e20-412d-a9cb-0d176e71c239
id:5949
Published:ธ.ค. 2010
Modified:08 ต.ค. 2013
Size:0.71MB
Languages:English
Type:book

"As someone who uses jQuery on a regular basis, it was surprising to discover how much of the library I’m not using. This book is indispensable for anyone who is serious about using jQuery for non-trivial applications." -- Raffaele Cecco, longtime developer of video games, including Cybernoid, Exolon, and Stormlord
jQuery is the "write less, do more" JavaScript library. Its powerful features and ease of use have made it the most popular client-side JavaScript framework for the Web. This book is jQuery's trusty companion: the definitive "read less, learn more" guide to the library.
jQuery Pocket Reference explains everything you need to know about jQuery, completely and comprehensively. You'll learn how to:
* Select and manipulate document elements
* Alter document structure
* Handle and trigger events
* Create visual effects and animations
* Script HTTP with Ajax utilities
* Use jQuery's selectors and selection methods, utilities, plugins and more
The 25-page quick reference summarizes the library, listing all jQuery methods and functions, with signatures and descriptions.

jQuery in Action

Title:jQuery in Action
Authors:Bear Bibeault & Yehuda Katz
Formats:PDF
Ids:Google, Douban Books,9781933988351
Tags:HTML, JavaScript, jQuery, Programming Languages, Web
Publishers:Manning Publications
Rating:★★★★
Author Sort:Bibeault, Bear & Katz, Yehuda
Title Sort:jQuery in Action
Date:08 ต.ค. 2013
uuid:aa51abf2-05cd-40d9-bafa-b0efa2693463
id:5948
Published:ก.พ. 2008
Modified:08 ต.ค. 2013
Size:23.17MB
Languages:English
Type:book

A good web development framework anticipates what you need to do and makes those tasks easier and more efficient; jQuery practically reads your mind. Developers of every stripe-hobbyists and professionals alike-fall in love with jQuery the minute they've reduced 20 lines of clunky JavaScript into three lines of elegant, readable code. This new, concise JavaScript library radically simplifies how you traverse HTML documents, handle events, perform animations, and add Ajax interactions to your web pages. "jQuery in Action," like jQuery itself, is a concise tool designed to make you a more efficient and effective web developer. In a short 300 pages, this book introduces you to the jQuery programming model and guides you through the major features and techniques you'll need to be productive immediately. The book anchors each new concept in the tasks you'll tackle in day-to-day web development and offers unique lab pages where you immediately put your jQuery knowledge to work. There are dozens of JavaScript libraries available now, with major companies like Google, Yahoo and AOL open-sourcing their in-house tools. This book shows you how jQuery stacks up against other libraries and helps you navigate interaction with other tools and frameworks. "jQuery in Action" offers a rich investigation of the up-and-coming jQuery library for client-side JavaScript. This book covers all major features and capabilities in a manner focused on getting the reader up and running with jQuery from the very first sections. Web Developers reading this book will gain a deep understanding of how to use jQuery to simplify their pages and lives, as well as learn the philosophy behind writingjQuery-enhanced pages.

WebKit คืออะไร

WebKit คำนี้ หลายคนที่เคยเขียนเว็ป น่าจะเคยผ่านตากันมาบ้างแล้ว เพราะมันเป็นส่วนหนึ่งที่สำคัญมากๆของเว็ปบราวเซอร์หลายๆตัว เช่น Safari และ Chrome รวมทั้งยังมีการนำไปใช้ในโปรแกรมอื่นๆอีกมากมาย สงสัยไหมล่ะครับว่ามันคืออะไร

WebKit คือ

WebKit (webkit.org) เป็นโครงการ open source ที่สร้าง render engine สำหรับ web browser หรืออาจจะเรียกได้ว่ามันคือ render engine ของผลิตภัณฑ์หลายๆตัวใน Mac OS X System Framework  เช่น Safari Dashboard Mail และอื่นๆอีกมากมาย ซึ่งต้องขอย้ำว่า WebKit ไม่ใช่ browser แต่เป็น render engine สำหรับ browser โดยมีการนำ WebKit ไปสร้าง browser มากมาย ดังรายชื่อที่มีคนรวบรวมไว้ที่ Wiki ไม่ต่ำกว่า 30 ตัว

ความสามารถของ WebKit

  1. CSS (CSS1/CSS2.1/CSS3)
  2. DOM (HTML DOM, XML DOM)
  3. HTML/XHTML
  4. HTML Editing
  5. HTML Forms
  6. JavaScript (ECMAScript)
  7. MathML
  8. Plug-ins
  9. Printing
  10. SVG (SVG 1.1)
  11. Accessibility
  12. XML
  13. XSLT

Port

หลักๆแล้ว WebKit สร้างขึ้นสำหรับระบบปฏิบัติการ Mac OS X ซึ่งแกนหลักเป็น Linux ดังนั้นเวลาจะ build โปรแกรมให้ใช้งานบน Windows ได้ จะต้องมีโปรแกรมจำลองสภาพแวดล้อมให้เป็น Linux และที่เขาแนะนำไว้ก็คือโปรแกรม cygwin ส่วนระบบอื่นๆก็ยังมีอีก เช่น Qt GTK+ EFL และอื่นๆอีกมากมายเป็นต้น ซึ่งล้วนเป็น Linux เพียงแต่เปลี่ยน UI เท่านั้น โดยก่อนหน้านี้ WebKit เขียนด้วย Objective-C และกำลังเปลี่ยนผ่านมาสู่ WebCore ซึ่งเป็น C++ ทำให้สามารถ port ไปยังระบบอื่นๆได้ง่ายขึ้น

สรุป

ใครสนใจสร้างโปรแกรมที่ต้องการความสามารถบางส่วนเป็น browser ก็ลองศึกษาเพิ่มเติมดูตามลิ้งค์ที่ให้ไว้ได้เลยนะครับ

วันศุกร์ที่ 4 ตุลาคม พ.ศ. 2556

The Handbook of Formulas and Tables for Signal Processing

Title:The Handbook of Formulas and Tables for Signal Processing
Authors:Alexander D. Poularikas
Formats:PDF
Ids:Google, Douban Books,9780849385797
Tags:Handbooks & Manuals, Reference, Signal Processing, Technology & Engineering
Publishers:CRC Press
Author Sort:Poularikas, Alexander D.
Title Sort:Handbook of Formulas and Tables for Signal Processing, The
Date:04 ต.ค. 2013
uuid:99c823b7-9eaa-49c1-bd78-6a21f199448c
id:6121
Published:ก.ย. 1998
Modified:04 ต.ค. 2013
Size:10.96MB
Languages:English
Type:book

Signal processing is a broad and timeless area. The term 'signal' includes audio, video, speech, image, communication, geophysical, sonar, radar, medical, and more. Signal processing applies to the theory and application of filtering, coding, transmitting, estimating, detecting, analyzing, recognizing, synthesizing, recording, and reproducing signals. "Handbook of Formulas and Tables for Signal Processing" a must-have reference for all engineering professionals involved in signal and image processing.Collecting the most useful formulas and tables - such as integral tables, formulas of algebra, formulas of trigonometry - the text includes: material for the deterministic and statistical signal processing areas; examples explaining the use of the given formula; numerous definitions; and, many figures that have been added to special chapters. "Handbook of Formulas and Tables for Signal Processing" brings together - in one textbook - all the equations necessary for signal and image processing for professionals transforming anything from a physical to a manipulated form, creating a new standard for any person starting a future in the broad, extensive area of research.