2011年7月31日 星期日

資訊展之痛徹心扉

資訊展


周末幫人買筆電,很巧碰上台北資訊展,於是就第一次去參加資訊展,成果是...損失慘重 XDD 人很多,看到不少單眼男跟 show girls!迷失了自己以往買 3C 產品的步調。啊,我現在才發現世貿是在台北 101 旁邊呢!


這次購買的目標是 Acer 筆電,原先是想買小筆電 Acer AO753 ,所以調查的 PCHome 的價格,然後就去資訊展逛逛,但是逛到一半改變了主意,往 4830TG 或 3830TG 發展,由於功課沒做好,就在第二家敗了 4830TG 了。回家後看了 PTT 的 NB-shopping 版,就十分痛心 XD 看到有人買 4830TG + 4GBx2 創見記憶體 + 750GB 空間,總價 26000 而已!驚覺自己太依賴過去的經驗,覺得新機在 PCHOME 賣三萬,那大概在資訊廣場用 27000 前後買的就差不多了,萬萬沒想到資訊展就是該用力砍價才對。


越想越傷心啊~ 錢雖然不是最重要的,但是受傷的心靈再次地提醒我:『市場調查一定要做好!千萬不要擺入過多的經驗。』我覺得這次買貴的主因是...忘了場合是資訊展,在資訊展就該用力砍價,以及要確實做好市場調查,每一間有買的一定要去問問,多花一點時間可以省到千元也是很值得的!


附上 4830TG 的美照 XD 還滿喜歡這款色調:


4810TG-01 4810TG-03 4810TG-05


Acer 筆電系列,選擇 48 開頭是因為有光碟機,若不在意可以選 38 開頭的,沒有光碟機可以輕 350g 左右吧!


2011年7月27日 星期三

[Linux] 安裝單機版 Hadoop 0.20.203 + HBase 0.90.3 @ Ubuntu 10.04.2 64Bit Server

前幾天又安裝 Hadoop 一次,查了一下,其實上一次也才九個月左右 :P 有這樣的感觸,實在是個人用到 Hadoop 的機會不高 Orz 所以每次都重裝一次,裝完沒多久又砍掉,這次安裝主要是避免新手的我,不小心玩壞同事的機器


過去的安裝紀錄:



整理一下,才發現第一次接觸 Hadoop 是 2009 年的夏天,那篇設定說穿了就是為了筆記做了啥設定,啥都不懂就跑去比賽,可還是初賽那一周才開始用 Hadoop 的說。回想起來還滿高興那時不懂 Hadoop/HBase 的,所以沒有被其中的功能給侷限住 XD 反而還是很盡情地享受資料設計,把想要的東西套用在 Hadoop 的架構上。例如做一個跑在 Hadoop 上的 Merge Sort 等,如果知道 Hadoop 的功能或架構,大概會認為有點脫褲子放屁 Orz 至於上一次安裝 Hadoop 則是架設在異質環境,用了 FreeBSD 32bit/64bit 和 Linux 64bit 環境,算第一次架了那麼多台,盡管只有五台啦,那時是學弟有跑 Hadoop 的需求,就是看看在系上工作站架看看 XD 但最後還是選擇使用 國網中心 Hadoop 公用實驗叢集,申請一下就有十多台機器可以用囉!


這次安裝 Hadoop 採用預設設定,在執行 wordcount 時會出現:


Task Id : attempt_#############_0001_r_000000_0, Status : FAILED
Error: java.lang.NullPointerException
        at java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:768)
        at org.apache.hadoop.mapred.ReduceTask$ReduceCopier$GetMapEventsThread.getMapCompletionEvents(ReduceTask.java:2900)
        at org.apache.hadoop.mapred.ReduceTask$ReduceCopier$GetMapEventsThread.run(ReduceTask.java:2820)


猜測應該是機器上有多張網卡或是支援 IPv4 和 IPv6 的關係吧?總之,預設的使用情境是 Pseudo-Distributed 的,所以一堆都填 localhost ,只要把它改成一個自訂的,再到 /etc/hosts 設定一個 IP (127.0.0.1) 即可解決。


總之,又再架了一次了 Orz 說真的,這陣子總覺得雲端熱潮已經結束了,周邊也很少人談論起 Hadoop/HBase 等事,或許就像 MySQL 已經很融入 Web development 環境,大家都覺得很直觀而不用多談?還是說,其實需要 Hadoop/HBase 的環境真的不多呢?除此之外,也有感無招勝有招啊,看了很多新東西,表面上好像增廣見聞,實際上卻容易越來越局限想法。


其他資訊:


從 ubuntu-10.04.2-server-amd64.iso 光碟安裝,並使用 hadoop 當作使用者帳號:


hadoop@hadoop:~$ uname -a
Linux hadoop 2.6.32-28-server #55-Ubuntu SMP Mon Jan 10 23:57:16 UTC 2011 x86_64 GNU/Linux


設定自動登入:


hadoop@hadoop:~$ ssh-keygen -t rsa -P '' && cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys
hadoop@hadoop:~$ ssh localhost
The authenticity of host 'localhost (::1)' can't be established.
RSA key fingerprint is ##:##:##:##:##:##:##:##:##:##:##:##:##:##:##:##.
Are you sure you want to continue connecting (yes/no)? yes


下載軟體 jdk-6u26-linux-x64.bin / hadoop-0.20.203.0 / hbase-0.90.3:


hadoop@pc:~$ wget http://download.oracle.com/otn-pub/java/jdk/6u26-b03/jdk-6u26-linux-x64.bin
hadoop@pc:~$ wget http://apache.cdpa.nsysu.edu.tw//hadoop/common/hadoop-0.20.203.0/hadoop-0.20.203.0rc1.tar.gz
hadoop@pc:~$ wget http://apache.stu.edu.tw//hbase/hbase-0.90.3/hbase-0.90.3.tar.gz


目錄狀態(解壓縮後,擺在家目錄,tarball 只是用來存放原始壓縮檔):


hadoop@pc:~$ ls && echo 'tarball:' && ls tarball/
hadoop-0.20.203.0  hbase-0.90.3  jdk1.6.0_26  tarball
tarball:
        hadoop-0.20.203.0rc1.tar.gz  hbase-0.90.3.tar.gz  jdk-6u26-linux-x64.bin


Hadoop 設定檔:


hadoop@pc:~$ vim hadoop-0.20.203.0/conf/hadoop-env.sh
export JAVA_HOME=$HOME/jdk1.6.0_26


hadoop@pc:~$ vim hadoop-0.20.203.0/conf/core-site.xml
<property>
  <name>fs.default.name</name>
  <value>hdfs://mycloud:9000</value>
  <description>The name of the default file system.  A URI whose
  scheme and authority determine the FileSystem implementation.  The
  uri's scheme determines the config property (fs.SCHEME.impl) naming
  the FileSystem implementation class.  The uri's authority is used to
  determine the host, port, etc. for a filesystem.</description>
</property>
<property>
  <name>dfs.replication</name>
  <value>1</value>
  <description>Default block replication.
  The actual number of replications can be specified when the file is created.
  The default is used if replication is not specified in create time.
  </description>
</property>


hadoop@pc:~$ vim hadoop-0.20.203.0/conf/mapred-site.xml
<property>
  <name>mapred.job.tracker</name>
  <value>mycloud:9001</value>
  <description>The host and port that the MapReduce job tracker runs
  at.  If "local", then jobs are run in-process as a single map
  and reduce task.
  </description>
</property>


hadoop@pc:~$ vim hadoop-0.20.203.0/conf/master
mycloud


hadoop@pc:~$ vim hadoop-0.20.203.0/conf/slaves
mycloud


hadoop@pc:~$ sudo vim /etc/hostname
mycloud


hadoop@pc:~$ sudo vim /etc/hosts
127.0.0.1 mycloud


hadoop@pc:~$ vim ~/.bashrc
PATH=$HOME/hadoop-0.20.203.0/bin:$HOME/hbase-0.90.3/bin:$HOME/jdk1.6.0_26/bin:${PATH}
hadoop@pc:~$ sudo reboot


初始化 Hadoop:


hadoop@mycloud:~$ hadoop namenode -format
INFO namenode.NameNode: STARTUP_MSG: 
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG:   host = mycloud/127.0.0.1
STARTUP_MSG:   args = [-format]
STARTUP_MSG:   version = 0.20.203.0
STARTUP_MSG:   build = http://svn.apache.org/repos/asf/hadoop/common/branches/branch-0.20-security-203 -r 1099333; compiled by 'oom' on Wed May  4 07:57:50 PDT 2011
************************************************************/
INFO util.GSet: VM type       = 64-bit
INFO util.GSet: 2% max memory = 19.33375 MB
INFO util.GSet: capacity      = 2^21 = 2097152 entries
INFO util.GSet: recommended=2097152, actual=2097152
INFO namenode.FSNamesystem: fsOwner=hadoop
INFO namenode.FSNamesystem: supergroup=supergroup
INFO namenode.FSNamesystem: isPermissionEnabled=true
INFO namenode.FSNamesystem: dfs.block.invalidate.limit=100
INFO namenode.FSNamesystem: isAccessTokenEnabled=false accessKeyUpdateInterval=0 min(s), accessTokenLifetime=0 min(s)
INFO namenode.NameNode: Caching file names occuring more than 10 times 
INFO common.Storage: Image file of size 112 saved in 0 seconds.
INFO common.Storage: Storage directory /tmp/hadoop-hadoop/dfs/name has been successfully formatted.
INFO namenode.NameNode: SHUTDOWN_MSG: 
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at mycloud/127.0.0.1
************************************************************/


啟動 Hadoop 及相關檢查方式: 


hadoop@mycloud:~$ start-all.sh 
starting namenode, logging to /home/hadoop/hadoop-0.20.203.0/bin/../logs/hadoop-hadoop-namenode-mycloud.out
mycloud: starting datanode, logging to /home/hadoop/hadoop-0.20.203.0/bin/../logs/hadoop-hadoop-datanode-mycloud.out
mycloud: starting secondarynamenode, logging to /home/hadoop/hadoop-0.20.203.0/bin/../logs/hadoop-hadoop-secondarynamenode-mycloud.out
starting jobtracker, logging to /home/hadoop/hadoop-0.20.203.0/bin/../logs/hadoop-hadoop-jobtracker-mycloud.out
mycloud: starting tasktracker, logging to /home/hadoop/hadoop-0.20.203.0/bin/../logs/hadoop-hadoop-tasktracker-mycloud.out


hadoop@mycloud:~$ jps
984 NameNode
1526 TaskTracker
1626 Jps
1368 JobTracker
1139 DataNode
1303 SecondaryNameNode


hadoop@mycloud:~$ hadoop dfsadmin -report
Configured Capacity: 81232019456 (75.65 GB)
Present Capacity: 75465768975 (70.28 GB)
DFS Remaining: 75465744384 (70.28 GB)
DFS Used: 24591 (24.01 KB)
DFS Used%: 0%
Under replicated blocks: 1
Blocks with corrupt replicas: 0
Missing blocks: 0

------------------------------------------------
Datanodes available: 1 (1 total, 0 dead)
Name: 127.0.0.1:50010
Decommission Status : Normal
Configured Capacity: 81232019456 (75.65 GB)
DFS Used: 24591 (24.01 KB)
Non DFS Used: 5766250481 (5.37 GB)
DFS Remaining: 75465744384(70.28 GB)
DFS Used%: 0%
DFS Remaining%: 92.9%
Last contact: ##########


hadoop@mycloud:~$ netstat -plten | grep java


使用 wordcount 測試:


hadoop@mycloud:~$ hadoop fs -mkdir in
hadoop@mycloud:~$ hadoop fs -put ~/hadoop-0.20.203.0/README.txt in
hadoop@mycloud:~$ hadoop jar ~/hadoop-0.20.203.0/hadoop-examples-0.20.203.0.jar wordcount in out
INFO input.FileInputFormat: Total input paths to process : 1
INFO mapred.JobClient: Running job: job_####_0001
INFO mapred.JobClient:  map 0% reduce 0%
INFO mapred.JobClient:  map 100% reduce 0%
INFO mapred.JobClient:  map 100% reduce 100%
INFO mapred.JobClient: Job complete: job_####_0001
INFO mapred.JobClient: Counters: 25
INFO mapred.JobClient:   Job Counters 
INFO mapred.JobClient:     Launched reduce tasks=1
INFO mapred.JobClient:     SLOTS_MILLIS_MAPS=14829
INFO mapred.JobClient:     Total time spent by all reduces waiting after reserving slots (ms)=0
INFO mapred.JobClient:     Total time spent by all maps waiting after reserving slots (ms)=0
INFO mapred.JobClient:     Launched map tasks=1
INFO mapred.JobClient:     Data-local map tasks=1
INFO mapred.JobClient:     SLOTS_MILLIS_REDUCES=10740
INFO mapred.JobClient:   File Output Format Counters 
INFO mapred.JobClient:     Bytes Written=1306
INFO mapred.JobClient:   FileSystemCounters
INFO mapred.JobClient:     FILE_BYTES_READ=1836
INFO mapred.JobClient:     HDFS_BYTES_READ=1476
INFO mapred.JobClient:     FILE_BYTES_WRITTEN=45881
INFO mapred.JobClient:     HDFS_BYTES_WRITTEN=1306
INFO mapred.JobClient:   File Input Format Counters 
INFO mapred.JobClient:     Bytes Read=1366
INFO mapred.JobClient:   Map-Reduce Framework
INFO mapred.JobClient:     Reduce input groups=131
INFO mapred.JobClient:     Map output materialized bytes=1836
INFO mapred.JobClient:     Combine output records=131
INFO mapred.JobClient:     Map input records=31
INFO mapred.JobClient:     Reduce shuffle bytes=1836
INFO mapred.JobClient:     Reduce output records=131
INFO mapred.JobClient:     Spilled Records=262
INFO mapred.JobClient:     Map output bytes=2055
INFO mapred.JobClient:     Combine input records=179
INFO mapred.JobClient:     Map output records=179
INFO mapred.JobClient:     SPLIT_RAW_BYTES=110
INFO mapred.JobClient:     Reduce input records=131


hadoop@mycloud:~$ hadoop fs -lsr 
drwxr-xr-x   - hadoop supergroup          0 /user/hadoop/in
-rw-r--r--   3 hadoop supergroup       1366 /user/hadoop/in/README.txt
drwxr-xr-x   - hadoop supergroup          0 /user/hadoop/out
-rw-r--r--   3 hadoop supergroup          0 /user/hadoop/out/_SUCCESS
drwxr-xr-x   - hadoop supergroup          0 /user/hadoop/out/_logs
drwxr-xr-x   - hadoop supergroup          0 /user/hadoop/out/_logs/history
-rw-r--r--   3 hadoop supergroup      10522 /user/hadoop/out/_logs/history/job_####_0001_####_hadoop_word+count
-rw-r--r--   3 hadoop supergroup      19894 /user/hadoop/out/_logs/history/job_####_0001_conf.xml
-rw-r--r--   3 hadoop supergroup       1306 /user/hadoop/out/part-r-00000


 hadoop@mycloud:~$ hadoop fs -cat out/p*
BIS),  1
(ECCN)  1
(TSU)   1
(see    1
5D002.C.1,      1
...
...


設定 HBase (http://hbase.apache.org/book/quickstart.html):


hadoop@mycloud:~$ mkdir /home/hadoop/hStoreDir
hadoop@mycloud:~$ vim hbase-0.90.3/conf/hbase-env.sh
export JAVA_HOME=$HOME/jdk1.6.0_26
hadoop@mycloud:~$ vim hbase-0.90.3/conf/hbase-site.xml
<configuration>
  <property>
    <name>hbase.rootdir</name>
    <value>file:///home/hadoop/hStoreDir/hbase</value>
  </property>
</configuration>


hadoop@mycloud:~$ start-hbase.sh 
starting master, logging to /home/hadoop/hbase-0.90.3/bin/../logs/hbase-hadoop-master-mycloud.out


hadoop@mycloud:~$ hbase shell
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 0.90.3, r1100350, ### ###  # ##:##:## PDT 2011

hbase(main):001:0> 


2011年7月25日 星期一

[PHP] 快速縮網址程式碼 (TinyURL API)

想說試用一下縮網址的功能,就找了 tinyurl.com 來測試。


一開始寫了冗長的 curl 程式碼:


<?php  
        $ch = curl_init();
        curl_setopt( $ch , CURLOPT_URL , 'http://tinyurl.com/create.php' );
        curl_setopt( $ch , CURLOPT_RETURNTRANSFER , true );
        curl_setopt( $ch , CURLOPT_POST , true );
        curl_setopt( $ch , CURLOPT_POSTFIELDS , array(
                'url' => 'http://www.google.com' ,
                'submit' => 'Make TinyURL!'
        ) );
        curl_setopt( $ch , CURLOPT_HTTPHEADER , array('Expect:') );
        echo curl_exec( $ch );
        curl_close( $ch );
?>


正準備用 preg 來撈資料時,看到一段訊息:


/////////////////////////////////////////////////////////////////////////////////
///// DON'T SCREEN-SCRAPE, PLEASE CONTACT US TO FIND OUT HOW TO USE OUR API /////
/////////////////////////////////////////////////////////////////////////////////


我才開使用 tinyurl.com + api 關鍵字問 Google 得知更簡單的用法:


<?php
        $url = 'http://www.google.com';
        echo file_get_contents( 'http://tinyurl.com/api-create.php?url='.urlencode($url) );
?>


有 API 不用,這樣對嗎 :p


2011年7月24日 星期日

Android 平民機是否快來臨?


來源:http://www.android.com/media/


今天跟許青蛙吃飯碰面,好像兩年沒碰面了?聊到了 Android 手機。經由周邊人士的使用心得,在智慧手機或行動平台方面,iOS (iPhone/iPad) 的使用者體驗還是遠高於 Android 系統,也就是說有錢人還是比較肯花錢敗一支 iPhone 手機,雖然 CP 值沒有 Android 高,但是文化潮流驅使大家比較想擁有 iOS 設備,甚至有的一開始用 Android 手機的,在接觸 iOS 設備後,就被拉走了。這是 OS 的設計發展、時程關係,整體上 iOS 還是比 Android 成熟許多,並且在封閉系統中,可以將硬體效能使用得更一致更好,軟硬體開發更有效率,一來以往,就會發現 Android 的缺陷,例如開發工具沒有制式美化的 UI 架構等,以至於產出的 app 都是很簡單的畫面,那種感覺就像早期寫 HTML 時,沒有美化的 TABLE 列表,而 iOS 就像有官方制式 CSS 套版,隨便做都比較好看。


目前的近況還是把 iOS 跟 Android 定位在智慧手機、比較有錢的人才會買的,雖然市佔率一直上升,但還沒到八、九成民眾都使用的階段。然而 Android 手機的價格一直往下掉了,現在就可以看到空機 4000 元左右(去外頭通訊行,可以用更低的價買到),那代表在不遠的將來(?)就會存在綁最低方案的 0 元的 Android 手機,就像中華電信月租費 183 元綁 18 or 24 個月!


這樣推估的方式是基於月租費 183元 (綁約18或24個月) 的 0 元手機,大概可以在一些賣場上看到空機賣 2000~2500 元左右,所以 Android 假設跌到這個價錢,就即將進入高市佔率的時代了! 如果綁上網方案(mCool/mPro),那可能性又增加了。


時代變遷:


單色手機 -> 彩色手機/和弦鈴聲 -> 手機拍照/大螢幕 -> 智慧手機/上網功能 (Android 手機?)


雖然 Android 進步要追到 iOS 還有段距離,但可以看到他有不斷地增加架構、運行效能等,並搭配硬體的升級,在不久的將來,應該更可以達到以前四、五年前 Nokia/Motorola 的時代,人人都可以擁有的大眾機。近期的問題大概是 Android 專利問題 Orz 希望能夠更快、更妥善地解決。


2011年7月19日 星期二

小筆電的效能不該只看數字

跟一位在 Acer 工作的同學閒聊,跟他說前幾天我接觸了一台 ASUS EEEPC 的小筆電,只是一台要價快兩萬,使用後覺得效能還不錯,問看看他的意見,結果就被推薦一款 Acer 小筆電,要價不到一萬五,並且說 Acer 這台小筆電是採用 Intel® Celeron® 處理器,效能應該比我指的那台還好,因為 ASUS 那台是 Intel® Atom™ 處理器。只是我很不解的是前者 Intel® Atom™ 處理器 D525 (1.8GHz) 且 2 cores, 4 threads 的,總覺得比後者 Intel® Celeron® 處理器 U3600 (1.2GHz) 之 2 cores, 2 threads 來的好吧?


後來在網路上也找到評論,大部分都說 U3600 比 D252 好,於是終於找到一個網站還滿豐富的 cpu benchmarks 資料:


PassMark - CPU Benchmarks - List of Benchmarked CPUs


可以查到 U3600 的分數比 D252 來的高 XD 算是稍微有點數據來證明,只是嚴格的話應該還是要去考量測試的方式及環境等等。


經過這次的討論,讓我想起計算機組織的教授曾提過的事,當你買一台車的時候,不太會用多少馬力來評估,那為何要用 CPU 的時脈來評估效能呢?並且查看了 spec 後,覺得 CPU 的規劃的確都很不一樣:


Intel® Atom™ processor D525 (1M Cache, 1.80 GHz)


Max TDP:13 W


Intel® Celeron® Processor U3600 (2M Cache, 1.20 GHz)


Max TDP:18 W


Atom 應該是著重在省電吧?還有超省電的:


Intel® Atom™ Processor N270 (512K Cache, 1.60 GHz, 533 MHz FSB)


Max TDP:2.5 W


至於要買哪一台比較好,大概還是要試用過才知道 :P 現在對 ASUS 那台算用過,所以稍微有好感,雖然真的貴很多 XD 至於兩者 CPU 差了 5W 的部分,不曉得是不是可以用 W=IV 公式來計算可以多撐多久?只是省電又不只 CPU 的問題 XD 看看別人的實測資料吧:


Nvidia ION 的 Asus 1215N 筆電評測


一台高階小筆電--宏碁AspireOne AO753小筆電開箱  (可以找到一些大陸的測試,但在此就不列出了)