2009年10月29日 星期四

Facebook API Template Bundle - 發佈到個人塗鴉牆的樣版設定教學

今早打算編寫新的 Template 時,在 Tools 頁面發現以下訊息:


Facebook will deprecate template bundles and their related API calls December 20, 2009.
Please start using stream attachments with stream.publish, FB.Connect.streamPublish, and Facebook.streamPublish instead.


這個衝擊說大不大說小不小!影響不大是因為我還沒很善用它,但我已經有點彈性疲乏啦,因為準備要塞進 Template 的資料,弄得很疲憊。不過,該做的正事還是要完成。


目的:


在 FBML 模式下,以 FBJS 達成過去 Facebook.showFeedDialog 的效果。


解法:


使用 Facebook.streamPublish 來代替,而原先的 template 部份將變成在 Code 裡。好處是可以少一次跟 Facebook Server 要資料吧。或許這也是 template 佔用資源而被拿掉的可能性??


除此之外,還需要用到 attachment 概念,就是以前寫在 template 上的資訊


程式碼:


<script type="text/javascript">
function do_post()
{
        var attachment = {
                'name':'Quiz',
                'href':'http://apps.facebook.com/your_apps/',
                'description':'good!',
                'caption':'{*actor*} is very smart!',
                'media':[
                                {
                                        'type':'image',
                                        'src':'http://upload.wikimedia.org/wikipedia/commons/thumb/0/06/Facebook.svg/200px-Facebook.svg.png',
                                        'href':'http://zh.wikipedia.org/wiki/Facebook'
                                }
                ]
        };
        Facebook.streamPublish( ''  , attachment , null , null , 'Message:' , null , false  );
}
</script>


接著在適當地地方呼叫 do_post(); 吧!



  1. 以 click 呼叫

    • <a href="#" onclick="do_post();return false;">Click Here!</a>



  2. 自動執行

    • <script type="text/javascript">
          do_post();
      </script>

    • 記得這段 code 要擺在 function() do_post{ ... } 後頭才用喔




收工。


參考資料:



相關文章



2009年10月26日 星期一

[電影] 男女生了沒 - The Ugly Truth


昨天看了這部電影,印象中好像也有幾部電影都用 "XXX 生了沒" ,說真的我反而比較喜歡英文的片名: The Ugly Truth !









戲劇主題是由一位能說善道的麥克帶領他的製作人艾比去把帥哥的故事,在這之前他們只是彼此看不慣的上司與屬下的關係,但隨著劇情的發展,越來越有趣。有興趣的可以在到 Yahoo! 觀看簡單的劇情簡介,在此就不加以贅述。


聊聊其他的感受,一開始有個片段是麥克教導艾比無論怎麼都要微笑應對,恰好跟片尾的麥克問艾比自己是不是那麼棒,那時艾比回他說:「You'll never know」,這段的呼應,讓我在一個人吃晚餐時想起來會有點暗自傻笑,恰好工作或餐廳環境常常會聽到別人高談闊論,而有些笑聲感覺好像聽起來很快樂,但細細品味又有種說不出來的空虛感?真真又似假假。


或許,不止男女間的互動,商場工作間,虛虛實實都難以完全地辨識,人在江湖身不由己!需要花點巧思拿捏好廣度與深度囉。


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>