2009年10月24日 星期六

打包‧致未來

Lear


這是國二參加學校美西團時,認識一位美術班的 Lear ,在高中所送我的禮物。這是件特別的禮物,翻面過來則是簡短的幾句話兒,道述著對當年夏威夷、學校宿舍生活的回憶。這週在家打包東西,原本清了許多要丟要賣的,沒想到在這個時間點還能整理、佇留。


今天便就是我國高中的好友 Kudo 的結婚宴客日。許多回憶也湧上心頭。我手上恰好翻到國中國文老師把班上幾篇作文弄起來的文集,有 Kudo 寫的,也有高一下去美國的 Alex 寫的,有著許多青澀卻又帶味的文筆。這陣子在新的環境打滾後,開始有感未婚族群的勢力漸漸單薄囉


雖然來不及參與 Kudo 與 Gina 戀情的譜曲過程,但我想,看到國高中的好友能夠有這麼一段甜蜜深情的成果,可止難得兩字道盡。過去的事就交給歲月塵封,把未來再好好地邁進,再不用十一小時,就會在結婚宴會上碰面,更要正式地好好地祝福這對新人囉!


Wretch 無名小站 API - Yahoo! Developer

@2010/01/01 新增一篇更完整的教學:Wretch 無名小站 API - 申請、使用完整教學


記得以前寫過模擬瀏覽器的程式,像是模擬使用者登入、發表文章等程式,現在,終於不必再如此偷偷摸摸了!如果無名能夠再提供 XML-RPC 那就更好了!(好像也可以自己寫了?),先來測試一下無名小站 API 吧!參考資料如下:



至於要怎樣才能使用,我覺得比一般還麻煩一點點 :P



  1. 申請 API 使用權


    • 連到網站上,填寫一些資訊即可

      • Kind of Application : Web-based

      • Application URL :  你家程式想跑的位置

      • Application Domain : 這比較麻煩,似乎不能帶 port 資訊

      • Access Scopes : 記得要選無名小站 Wretch 的 Read/Write 啦



    • 之後就會要確認 Application Domain ,要在網站根目錄擺在特定的檔名供 Yahoo 認證。

    • 如果蹦出 Domain Verification Failed 訊息

      • There was an internal error while an application is being created. Please try again.

      • 如果你沒用網域只有 IP 的話,請先申請個 Domain 吧!例如 http://tw.twbbs.org 可免費申請,一開始我懶的弄,僅用 IP 位置,結果在這邊卡關就不玩了 :P 幾天後我終於去申請網域後再 Try 成功囉





  2. 下載 PHP Library


  3. 測試 PHP 程式

    • 需要支持 curl 喔 (其實hack也是用這個lib寫的 XD)


      • sudo apt-get install php5-curl (Ubuntu安裝法)



    • <?php  
          require("Yahoo.inc");  

          // Your Consumer Key (API Key) goes here.  
          define('CONSUMER_KEY', "");  

          // Your Consumer Secret goes here.  
          define('CONSUMER_SECRET', "");  

          // Your application ID goes here.  
          define('APPID', "");  

          $session = YahooSession::requireSession(CONSUMER_KEY,CONSUMER_SECRET,APPID);  
      ?>

    • 將上述的相對位置弄一弄後,連過去就會將你導去 Yahoo 登入畫面,登入完就回到你的程式了

      • 登入者會收到 Yahoo 寄來的信件,其標題類似於"你的 Yahoo! 帳戶現已與 xxx 連結",也可以再解除設定,就像在 facebook 上玩遊戲時的情況一樣,不想用可以再拿掉。






以上都搞定了,那代表可以真的開始寫程式囉!以下是一些小小的讀取範例!程式如下(別忘了加上上述測試Session的程式碼):


<?php

$yahoo_user = $session->getSessionedUser();

// Profile
$url = 'http://wretch.yahooapis.com/v1/profileService/'.$yahoo_user->guid;
//$response = $session->client->get($url);
//print_r($response);

// Albums
$url = 'http://wretch.yahooapis.com/v1/albumService/'.$yahoo_user->guid.'/albums';
//$response = $session->client->get($url);
//print_r($response);

// Blog
$url = 'http://wretch.yahooapis.com/v1/blogService/'.$yahoo_user->guid.'/articles';
$response = $session->client->get($url);

print_r($response);


?>


寫入範例,建立相簿。但很奇怪地建出來都沒照我想要名字或敘述?比較想試的其實是發表文章至無名小站,但測試的結果都是錯誤訊息?改天有空再玩玩吧。經由 GTStudy 提醒,在 POST  的 contentType 設定成 "application/xml" 就可以成功建立相簿囉!我也順道找了一下投影片,裡頭的敘述果真詳細了一點,第 18 頁的確有看到這個關鍵字,十分感謝!


<?php

$yahoo_user = $session->getSessionedUser();

$url = 'http://wretch.yahooapis.com/v1/albumService/'.$yahoo_user->guid.'/albums';

$content = <<<multi_line_end
<?xml version="1.0" encoding="utf-8"?>
<req>
  <title>My title</title>
  <desc>My desc</desc>
</req>
multi_line_end;

//$content = simplexml_load_string($content);

$request = Array (
        'class_id' => 1
);
$url .= '?'.http_build_query( $request );

$contentType = 'application/xml';
$response = $session->client->post( $url , $contentType , $content );

print_r( $response );
?>


雖然無名小站正式提供不錯的 API ,但我覺得能提供如 MetaWeblog API 將會是更好的服務,但也許是綁著 Yahoo 帳號的關係,在管控上已經不能簡單化。更多 API 細節請至 Wretch API 文件 查看。


2009年10月21日 星期三

[Linux] 安裝單機版 Hadoop 0.20.1 Single-Node Cluster (Pseudo-Distributed) @ Ubuntu 9.04

沒想到這麼快就又要裝 hadoop 啦!之前的經驗並不算是從頭安裝,整個環境都是別人建的,僅在該環境將 hadoop 從 0.18 版弄到 0.20 版而已。這次由於要測試 HBase REST 部分,因此又來先建一個來測試測試,且僅需安裝 Single Node 模式。若搭上前陣子安裝 Ubuntu 的經驗,或許勉強稱得上從無到有吧?!


網路上有非常不錯的文章,我主要是參考資料如下,但他是 0.20.0 的版本,經我測試的結果,剛好又有 Ubuntu 9.04 的問題,有些地方要變動,慶幸地花了些時間終於搞定了!建議先看看這些參考資料,這篇寫得東西純粹給用來給自己記憶而已



環境資訊


# uname -a
Linux changyy-desktop 2.6.28-15-generic #52-Ubuntu SMP Wed Sep 9 10:49:34 UTC 2009 i686 GNU/Linux



  1. 安裝 Openssh-server

    • # sudo apt-get install openssh-server

    • 因為我是用 Ubuntu 7.04 Desktop 並更新至 9.04 的,主要是 Desktop 版需要安裝一下 openssh-server 才能支援多人登入,若是 Server 版應該預設就有了吧,可用 ssh localhost 來測試



  2. 安裝 Java 環境

    • # sudo apt-get install sun-java6-jdk



  3. 建立與設定 Hadoop 使用的帳號

    • # sudo addgroup hadoop

    • # sudo adduser --ingroup hadoop hadoop



  4. 設定 Hadoop 帳號登入不需帳密

    • # su - hadoop

      • 若已是 hadoop 帳號則可以略過此步



    • # ssh-keygen -t rsa -P ''

    • # cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys

    • 用 hadoop 帳號測試連線

      • # ssh localhost

      • 應該不需要輸入帳密即完成登入,若有問題可參考上述文章來解決。





  5. 安裝 Hadoop 0.20.1

    • 相關位置


    • 依上篇文章安裝在 /usr/loca 位置

      • # cd /usr/local

      • # sudo wget http://apache.stu.edu.tw/hadoop/core/hadoop-0.20.1/hadoop-0.20.1.tar.gz

      • # sudo tar -xvf hadoop-0.20.1.tar.gz

      • # sudo chown -R hadoop:hadoop hadoop-0.20.1

      • # sudo ln -s hadoop-0.20.1/ hadoop



    • 主要為了提供未來可以便利的切換版本,因此我先用 symbolic link ,若不懂的話,建議使用 sudo mv hadoop-0.20.1 hadoop 取代最後一步

    • 刪掉下載的檔案

      • # sudo rm -rf hadoop-0.20.1.tar.gz





  6. 設定 Hadoop 0.21

    • 請先切換成 hadoop 身份,若已是則可跳過此步

      • # su - hadoop



    • 設定環境變數

      • # vim /usr/local/hadoop/conf/hadoop-env.sh

        • Java 資訊


          • export JAVA_HOME=/usr/lib/jvm/java-6-sun



        • 停用 IPv6

          • HADOOP_OPTS=-Djava.net.preferIPv4Stack=true







    • 設定資料位置、port等資訊

      • 預定將資料擺在 /home/hadoop/db 中,可以先去建立一下,記的該目錄使用權歸於 hadoop 帳號

      • # vim /usr/local/hadoop/conf/core-site.xml


        • <property>
            <name>hadoop.tmp.dir</name>
            <value>/home/hadoop/db/hadoop-${user.name}</value>
            <description>A base for other temporary directories.</description>
          </property>
           
          <property>
            <name>fs.default.name</name>
            <value>hdfs://localhost: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>



      • # vim /usr/local/hadoop/conf/mapred-site.xml


        • <property>
            <name>mapred.job.tracker</name>
            <value>localhost: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>



      • 切記不要偷懶全寫在 core-site.xml ,因為我就是這樣導致預設的服務一直跑不起來,在 logs 中的 jobtracker 和 jobtracker 會一直看到的訊息

        • ERROR org.apache.hadoop.mapred.TaskTracker: Can not start task tracker because java.lang.RuntimeException: Not a host:port pair: local

        • FATAL org.apache.hadoop.mapred.JobTracker: java.lang.RuntimeException: Not a host:port pair: local





    • 格式化儲存空間

      • # /usr/local/hadoop/bin/hadoop namenode -format



    • 啟動 Hadoop

      • # /usr/local/hadoop/bin/start-all.sh



    • 關閉 Hadoop

      • # /usr/local/hadoop/bin/stop-all.sh





  7. 啟動 Hadoop 後,可用以下指令來查看狀態

    • # jps

    • # netstat -plten | grep java

    • # /usr/local/hadoop/bin/hadoop dfsadmin -report




上頭紅色部份就是跟參考資料不同的地方,至於在 Kernel 停用 IPv6 的事,似乎在 Ubuntu 9.04 得要重編核心,我測試的結果最後還是選用 Hadoop 的設定檔,其他資訊可以參考這篇



測試 Hadoop (別忘了要用 hadoop 身份以及啟動 Hadoop Framework 囉)



  • 建立目錄

    • # /usr/local/hadoop/bin/hadoop dfs -mkdir input



  • 檢視

    • # /usr/local/hadoop/bin/hadoop dfs -ls



  • 丟個測資和檢視一下

    • # /usr/local/hadoop/bin/hadoop dfs -put /usr/local/hadoop/conf/core-site.xml input/

    • # /usr/local/hadoop/bin/hadoop dfs -lsr



  • 跑範例和看結果

    • # /usr/local/hadoop/bin/hadoop jar hadoop-0.20.1-examples.jar wordcount input output

    • # /usr/local/hadoop/bin/hadoop dfs -cat output/*




收工





<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
 

 
<configuration>
 
<property>
<name>hadoop.tmp.dir</name>
<value>/your/path/to/hadoop/tmp/dir/hadoop-${user.name}</value>
<description>A base for other temporary directories.</description>
</property>
 
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:54310</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>mapred.job.tracker</name>
<value>localhost:54311</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>
 
<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>
 
</configuration>




2009年10月16日 星期五

[Unix] 使用 Tarball 安裝 SQLite + Python + Apache + Django @ FreeBSD 7.2

想要了解一個系統架構,最好的方式就是從頭架起它!由於工作上會接觸 Django 這套架構,這個禮拜花不少時間看它的英文介紹,再花一天看個 Python 語法吧,說實在我已忘的差不多了。


一些好用的電子書:



至於安裝 Django 並不難,有很多現成的安裝方式,但我選擇用 Tarball 的方式來享受一下過程,挑選一台 FreeBSD 機器。在安裝的過程中一直卡在 Python 無法使用 SQLite 的部分,恰好我測試的機器還沒裝 SQLite ,讓我有乾淨的環境來安裝一下!安裝步驟如下:



  1. 安裝 SQLite 3.6.19


  2. 安裝 Python 2.6.3

    • wget http://www.python.org/ftp/python/2.6.3/Python-2.6.3.tgz ;

    • tar -xvf Python-2.6.3.tgz ; cd Python-2.6.3 ;

    • 編輯 setup.py 檔案

      • 在 sqlite_inc_paths 上加上 '$HOME/sqlite/include',

      • 上述 $HOME 僅是個示意,請自行修改成剛剛安裝的絕對路徑

      • 如此一來方能解決 Python 2.6.3 無法使用 sqlite3 的問題,而原先內附的 README 也有說過這麼一段話

        • Building the sqlite3 module
          ---------------------------

          To build the sqlite3 module, you'll need the sqlite3 or libsqlite3
          packages installed, including the header files. Many modern operating
          systems distribute the headers in a separate package to the library -
          often it will be the same name as the main package, but with a -dev or
          -devel suffix.

          The version of pysqlite2 that's including in Python needs sqlite3 3.0.8
          or later. setup.py attempts to check that it can find a correct version.



      • 只是我一直沒找到編譯 Python 時,可指定 SQLite 的安裝位置的參數 :P 最後則是直接改 setup.py 啦,這應該是用 Tarball 安裝且不是安裝在系統預設位置上才會碰到的問題。



    • ./configure --prefix=$HOME/python && make && make install ;



  3. 安裝 Apache HTTP Server 2.2.14


  4. 安裝 mod_wsgi 2.6


  5. 安裝 Django 1.1.1



如此一來,就完成架設 Django 環境囉!緊接著就是測試一下啦



  • $HOME/python/bin/django-admin.py startproject helloworld ; cd helloworld ;

  • 編輯 settings.py

    • DATABASE_ENGINE = 'sqlite3'

    • DATABASE_NAME = 'test.db'



  • $HOME/python/bin/python manage.py runserver 8080

  • 接著就可用 http://server_host:8080/ 來觀看 Django 的畫面囉!


2009年10月11日 星期日

工作後的第一個週末

公園宿舍窗外一景


這從我的寢室往外頭拍攝的,可能是早上七點或八點的景色,一幅田園風光,看似悠閒。


工作滿三週,前兩個週末都返家,直到這週才有空閒緩緩腳步,只是下週起又得到處爬爬照囉。工作滿三週的心情嘛,雖然碩士時已將求學心態改成近於公司上班的情景,但仍不夠強烈,還可以自由地選擇起床、上班、吃飯和下班的時間,現在的生活,完全地規律化,約莫六點五十起床、七點半出發,在餐廳或合作社買個早點,回到辦公室大概五十分不到,就差不多開始上工了。約十一點五十出發吃中餐,回來睡個午睡,又開始工作到五點近半。


這陣子有些感觸,記得以前我跟在上班的老姐提過,要否下班繼續進修,像是考公務人員等,說真的連我上下班都算正常,還都提不起勁。假設晚上七點回到寢室,晚上十一點半準備睡覺,這樣一天也才四個半小時可用,還不包括洗澡摸魚閒聊。想一想,時間比學生時代還要少,還要更緊湊,很難想像這已是科技業最符合人性的上下班時間了。









前陣子看了上面那則影片,主要的是它呈現的字句,的確很接近週遭人的感受,雖然有人說影片後面算是宅宅的幻想,算是最不實際的片段,因為鮮少有人會發現孤單的自己的。


這幾天的工作內容,大多是使用 facebook 相關的東西,讓我意外地看到以前國三認識的美術班同學,跟他好像高二後聯絡變很少,印象中最近的一次可能是他大一打電話跟我閒聊,那時他還在播弄著琴弦。從他稀疏的照片文字,我發現他應該是鮮少還保留那份青春動力,真令我感到佩服。記得學生時代發生的種種,加速自己體驗現實社會的一切,人真的很難輕易地瀟灑,有太多的重擔擺在前頭,唯一最輕鬆的面對方式,就是扛起它吧!


我覺得要改變自己之前,就要先了解環境,目前接近完成第一步驟吧?至於目前的目標嘛,先嘗試做個對團隊有貢獻的人,雖然還有一大段路要走。


冷氣房,大概是唯一的缺憾,灑在臉上的永遠是日光燈。悶的時候,出去晃晃曬曬太陽吹吹風看看天,將會是最享受的一種方式。