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>




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


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


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


2009年10月10日 星期六

Facebook API Example - 客製化 Quiz 測驗教學筆記

雖然已經有一些制式的製作方式:



等等的,皆可以透過 Quiz 關鍵字在 Facebook 查詢到許多跟測驗相關的應用。大部分是已經製作好流程的,只要填寫一下問題、結果,就可以很快地完成一張測驗表。然而,有時候要推服務時,可能會用到許多 Javascript API ,往往那些 Quiz 製造機只適合用來填寫文字跟圖片,這時候就還是得靠人工方式了!沒錯,就是要寫程式!此例以 PHP 跟 Javascript 為範例實作。


製作一個 Quiz 的流程,主要可以分成四部份:



  1. 顯示問題及收集答案

  2. 顯示結果前,詢問是否要邀請朋友參與

  3. 顯示結果和留言

  4. 將結果發佈至塗鴉牆


整體上可以簡化到兩步,就是顯示問題收集答案跟顯示結果,但這樣會使得最後一頁要做的事很多,我做了一兩個制式的測試,發現還有每一個問題就要換一個頁面,這種理由多半是要顯示廣告用的,使得每到一頁就多了一次廣告流量。我覺得分成四部份應該還滿恰當的,再細分下去有點不妥,除非是介面的設計或是問題太多。


在實作上,依上述分類可以分成 3 個頁面,第一個頁面負責顯示問題跟收集答案;第二個頁面則是提供使用者便利地點選朋友寄送邀請函;第三個就是顯示結果,以及留言的顯示,至於第四部分則可在第三頁搭配 Javascript 來提供發送,故可以少一個頁面。


流程:



  1. 新增與設定 App



  2. 顯示問題及收集答案

    • 一般的 HTML Code



  3. 顯示邀請朋友參加的介面

    • FBML 版

      • <fb:fbml>
                <fb:request-form action="?status=2" method="POST" invite="true" type="MyAppName" content="快來挑戰!<?php echo htmlentities("<fb:req-choice url=\"http://apps.facebook.com/my_app_name/\" label=\"Authorize My Application\"") ?>"
                        <fb:multi-friend-selector showborder="false" actiontext="邀請朋友參加此測試">
                </fb:request-form>
        </fb:fbml>



    • Iframe 版


      • <fb:serverfbml style="width: 100%;">
            <script type="text/fbml">
                <fb:fbml>
                    <fb:request-form action="?status=2" method="POST" invite="true" type="XFBML" content="快來挑戰!<?php echo htmlentities("<fb:req-choice url=\"http://apps.facebook.com/my_app_name/\" label=\"Authorize My Application\"") ?>"

                        <fb:multi-friend-selector showborder="false" actiontext="邀請朋友參加此測試">
                    </fb:request-form>
                </fb:fbml>
            </script>
        </fb:serverfbml>





  4. 顯示結果後,提供 Post 到個人塗鴉牆(採用舊式申請 template 的方式,facebook 已打算在 2009/12/20 停用此功能,此例先保留給舊式範例,新式用法歡迎參考:發佈到個人塗鴉牆的樣版設定教學)


    • FBML

      • <script type="text/javascript">
        var template_id = number_id;
        var user_message_prompt = 'What do you think of this book?';
        var user_message = {value: 'write your review here'};

        var template_data={
                'test_name':'Taipei' ,
                'test_result':'OK',
               
        'images':[{'src':'http://pad.thedigitalmovement.com/_blaise/2007-06-15-dgen-breakfast.jpg',
        'href':'http://tw.yahoo.com/'}]
        }
        var body_general='';
        var target_ids = '';

        var continuation = function() {
                // do something
        };
        Facebook.showFeedDialog( template_id, template_data, body_general, target_ids , continuation, user_message_prompt, user_message );
        </script>


      Iframe

      • <script type="text/javascript">
        FB_RequireFeatures(["XFBML"], function(){
            FB.Facebook.init( 'appapikey' , '/path/xd_receiver.htm' , null );
            var template_id = number_id;
            var user_message_prompt = 'What do you think of this book?';
            var user_message = {value: 'write your review here'};

            var template_data={
                    'test_name':'Taipei' ,
                    'test_result':'OK',
                    'images':[{'src':'http://pad.thedigitalmovement.com/_blaise/2007-06-15-dgen-breakfast.jpg', 'href':'http://tw.yahoo.com/'}]
            }
            var body_general='';
            var target_ids = '';

            var continuation = function() {
                    // do something
            };

            FB.Connect.showFeedDialog( template_id, template_data, target_ids , body_general, null, FB.RequireConnect.require, continuation, user_message_prompt, user_message);
        </script>



    • 至於 template_id 部分,則是要先去製作樣版




  5. 新增留言板

    • <fb:fbml>
              <fb:comments xid="a_unique_id" showform="true" canpost="true" candelete="false">
                      <fb:title>請留下寶貴的意見</fb:title>
              </fb:comments>
      <fb:fbml>  






常見問題:



  • 什麼是 templates

    • 這是一個預先刻劃好的樣版,可重複使用,只需要填寫關鍵字就行了!最大好處是可以很漂亮的排好擺在塗鴉牆上,而搭配關鍵字的變動,就可以拿來當做測試結果的顯示,好比如 A 得 90 分、 B 得 75 分等等,就只要把關鍵字弄成可變動囉!詳細部份可以到 http://developers.facebook.com/tools.php?templates 玩玩,可以為自己的應用程式製作專屬的樣版,而上述就是一個使用樣版的塗鴉牆例子。

    • 採用舊式申請 template 的方式,facebook 已打算在 2009/12/20 停用此功能,此例先保留給舊式範例,新式用法歡迎參考:發佈到個人塗鴉牆的樣版設定教學



  • 無法顯示 templates

    • 要特別留意傳給 templates 的資訊,連 images 變數中的 src 位置不存在也會導致不會顯示,當初以 IE 測試,發現很久都沒顯示訊息,改用 Firefox 才蹦出 src 位置不對的消息,另外,還可以參考下面連結的 showFeedDialog 的相關文章,有的跟隱私有關。



  • 使用 fb:request-form 之 略過 / Cancel 問題

    • 當第二頁採取呈現 Invite Friends 頁面時,當使用者點選 [略過] 或 [寄送邀請] 時,頁面將導向於 action 的位置,然而,有時我們會使用 GET 的方式來掌控頁面流程,但有些時候不希望將訊息暴露在瀏覽器的 url 資訊上,此時可以解決的方式是將資料改採用 POST 傳遞


    • 留意的是當使用者點選 [略過] 或 [Cancel] 時,這份資訊卻不會送給 action 所指定的頁面,最簡單的處理方式,就是使用 SESSION 變數來處理

      • 在進入第二頁時,將 $_SESSION['flag']  =  1 

      • 當使用者用了 [略過] 或 [Cancel] 時,就可在 action 所指向的 url 進行處理囉,例如得知此 flag 資訊,自動將 status 設成 2 。設定完後,可以再將 flag 清掉

        • unset( $_SESSION['flag'] );








參考資訊:



簡單的 FBML 範例程式,需填寫 API Key 、Template ID 等設定:


<?php
// Copyright 2007 Facebook Corp. All Rights Reserved.
//
// Application: TEST
// File: 'index.php'
// This is a sample skeleton for your application.
//

require_once 'facebook.php';

$appapikey = 'your_app_api_key';
$appsecret = 'your_app_secret';
$facebook = new Facebook($appapikey, $appsecret);
$user_id = $facebook->require_login();
$template_id = 0123456789;

$status = isset( $_REQUEST['status'] ) ? intval( $_REQUEST['status'] ) : 0 ;
switch( $status )
{
case 1:
?>
<p style="width:100%;text-align:center;">
...等待結果運算...<br /><br /><a href="?status=2">觀看結果</a><br />
</p>
<fb:fbml>
<fb:request-form action="?status=2" method="POST" invite="true" type="MyQuizName" content="快來挑戰!<?php echo htmlentities("<fb:req-choice url=\"http://apps.facebook.com/your_app_name/\" label=\"Authorize My Application\"") ?>" >
<fb:multi-friend-selector showborder="false" actiontext="邀請朋友參加此測試">
</fb:request-form>
</fb:fbml>
<?php
break;
case 2:
?>
<script>
function do_post()
{
var template_id = <?php echo $template_id; ?>;
var user_message_prompt = '想說的話:';
var user_message = {value: ''};
var template_data={
'test_name':'Tapie' ,
'test_result':'OK',
'images':[
{
'src':'http://pad.thedigitalmovement.com/_blaise/2007-06-15-dgen-breakfast.jpg',
'href':'http://tw.yahoo.com/'
}
]
}
var body_general='';

var continuation = function() {
// do something
};
Facebook.showFeedDialog( template_id, template_data, body_general, '', continuation, user_message_prompt, user_message );
}
</script>
<p style="width:100%;text-align:center;">
測試成果:100分<br /><a href="#" onclick="new Dialog().showMessage('測驗結果', '100分').onconfirm = do_post ; return false;">詳細資訊</a><br />
</p>
<?
break;
default:
?>
<form id="testForm" method="POST" action="?status=1">
<input type="hidden" id="Q_number" name="Q_number" value="1" />
<table width="100%">
<tr>
<td>Q1:你會製作表單嗎?</td>
</tr>
<tr>
<td>
<input type="radio" name="Q[0]" value="1" />會 <br />
<input type="radio" name="Q[0]" value="2" />不會
</td>
</tr>
<tr>
<td>
<button style="submit" onclick="document.getElementById('testForm').submit();">Submit</button>
</td>
</tr>
</table>
</form>
<?php
break;
}
exit;
?>



2009/10/28 筆記:


上述例子採用單一檔案(index.php)搭配參數(status)來決定目前的狀態(1:填寫答案,2:邀請朋友,3:顯示結果與張貼個人塗鴉牆),在部分情況會有一些問題,如新增留言板服務時等等的。


測試結果,建議可以改成 3 個頁面獨立運作比較乾淨,依序是 index.php 、 invite.php 和 result.php,程式碼範例如下:



  • base.php

    • 這個是下面這幾支程式的最上頭都要 include 進來的片段

    • <?php
      // Copyright 2007 Facebook Corp.  All Rights Reserved.
      //
      // Application: TEST
      // File: 'index.php'
      //   This is a sample skeleton for your application.
      //

      session_start();

      require_once 'facebook.php';

      $appapikey = 'your_app_api_key';
      $appsecret = 'your_app_secret';
      $facebook = new Facebook($appapikey, $appsecret);
      $user_id = $facebook->require_login();
      $template_id = 123456789;
      ?>




  • index.php

    • <?php
      require( 'base.php' );
      ?>
      <form id="test" name="test" method="POST" action="invite.php">
              <table width="85%">
                      <tr>
                              <td><br /><hr width="70%" /></td>
                      </tr>
                      <tr>
                              <td>
                                      Q1:請問太陽是否都從西邊出來?
                              </td>
                      </tr>
                      <tr>
                              <td>
                                      <input type="radio" name="Q1" value="1" checked /> Yes <br />
                                      <input type="radio" name="Q1" value="2" /> No <br />
                              </td>
                      </tr>
                      <tr>
                              <td><br /><hr width="70%" /></td>
                      </tr>
                      <tr>
                              <td>
                                      Q2:請問月亮是否都從東邊出來?
                              </td>
                      </tr>
                      <tr>
                              <td>
                                      <input type="radio" name="Q2" value="1" checked /> Yes <br />
                                      <input type="radio" name="Q2" value="2" /> No <br />
                              </td>
                      </tr>
                      <tr>
                              <td>
                                      <button>送出</button>
                              </td>
                      </tr>
              </table>
      </form>





  • invite.php

    • <?php
      require( 'base.php' );

      // 計算分數
      $_SESSION['score'] = 0;
      if( isset( $_REQUEST['Q1'] ) && $_REQUEST['Q1'] == 1 )
              $_SESSION['score'] += 50;

      if( isset( $_REQUEST['Q2'] ) && $_REQUEST['Q2'] == 2 )
              $_SESSION['score'] += 50;

      ?>
      <fb:fbml>
              <fb:request-form action="result.php" method="POST" invite="true" type="MyQuizName" content="快來挑戰!<?php echo htmlentities("<fb:req-choice url=\"http://apps.facebook.com/your_app_name/\" label=\"Authorize My Application\"") ?>" >
                      <fb:multi-friend-selector showborder="false" actiontext="邀請朋友參加此測試">
              </fb:request-form>
      </fb:fbml>





  • result.php

    • <?php
      require( 'base.php' );
      ?>
      <script>
      var message = '你真厲害';
      function do_post()
      {
              var template_id = <?php echo $template_id; ?>;
              var user_message_prompt = '感言:';
              var user_message = {value: ''};
              var template_data={
                      'images':[
                                      {
                                              'src':'http://upload.wikimedia.org/wikipedia/commons/thumb/0/06/Facebook.svg/200px-Facebook.svg.png',
                                              'href':'http://www.facebook.com/'
                                      }
                              ] ,
                      'level' : message
              }
              var body_general='';

              var continuation = function() {
                      // do something
              };
              Facebook.showFeedDialog( template_id, template_data, body_general, '', continuation, user_message_prompt, user_message );
      }
      </script>
      <h1>測驗結果: <?php echo $_SESSION['score'] ; ?> 分</h1>
      <a href="#" onclick="new Dialog().showMessage( '分數' , '<?php echo $_SESSION['score']; ?>' ).onconfirm = do_post;return false;">張貼至個人塗鴉牆</a>
      <hr witdh="95%" />
      <fb:comments xid="a_unique_id" showform="true" canpost="true" candelete="false">
              <fb:title>請留言</fb:title>
      </fb:comments>




除了要更改 base.php 中的資訊外,要記得在 result.php 中的 template 等資訊也要適當修改,我記得如果連 src 位置打錯或不存在時,此時就不會蹦出樣版喔,要分外留意啦


2009年10月8日 星期四

將 dmg 檔轉成 img 檔或 iso 檔 @ Ubuntu & Windows XP

一隻將 MAC OS 的 dmg 格式轉成 img 格式,另外還有相似的 dmg2iso ,顧名思義就是轉成 iso 檔,只是在網站上並沒看到後續的維護,那就使用轉成 img 檔。有需要在從 img 轉成 iso 檔吧。


下載 dmg2img 、dmg2iso 網站位置:http://vu1tur.eu.org/tools/


實作上以 dmg2img 為例,畢竟 dmg2iso 已經很久沒更新。



  • Ubuntu 9.04

    1. 下載與解壓縮

      • # wget 'http://vu1tur.eu.org/tools/download.pl?dmg2img-1.6.1.tar.gz'

      • # tar -xvf dmg2img-1.6.1.tar.gz



    2. 編譯 dmg2img

      • # cd dmg2img-1.6.1

      • # make dmg2img

        • 若出現錯訊息,大概是找不到 bzlib.h,需先安裝 libbz2-dev

        • # sudo apt-get install libbz2-dev





    3. 轉檔

      • # ./dmg2img test.dmg test.img



    4. 掛載

      • # sudo mkdir /media/my_tmp

      • # sudo mount -t auto -o loop test.img /media/my_tmp




  • Windows XP with SP3


    • 下載 win32 binary

    • 指令跟上述一樣


      • dmg2img test.dmg test.img




此外,在 Mac OS X 的環境中,可以透過 磁碟工具程式 要將 DVD/CD 備份成 DMG 檔,若要轉成 ISO 檔的話,可透過 command line 執行:


$ hdiutil convert input.dmg -format UDTO -o output.iso
...
created: output.iso.cdr

$ mv output.iso.cdr output.iso


即可 


2009年10月3日 星期六

iPhone 3G IPSW Path @ Windows XP

C:\Documents and Settings\"UserID"\Application Data\Apple Computer\iTunes\iPhone Software Updates