2010年2月11日 星期四

Facebook Connect 搭配 API 提供帳號管控教學

網路上已經有許多關於 Facebook API 的使用教學,而最近則是越來越多關於 Facebook Connect 的應用,例如替自己的 Blog 加入留言,但留言可以發佈到 Facebook 塗鴉牆上,在這邊試著結合 Facebok API 與 Facebook Connect ,建立一個網站服務,但網站管理者不管理帳號密碼,反而全部都使用 Facebook 的帳密管理機制。


這樣的最大的好處是網站服務的推廣時,主要透過 Facebook 的平台,提供類似 OpenID 或 OAuth 的服務,讓使用者不必再註冊一個新帳號,並且使用 Facebook 的平台推廣自己開發的服務。


先看看 Facebook 上頭使用者的活躍程度:


More than 400 million active users
50% of our active users log on to Facebook in any given day
More than 35 million users update their status each day
More than 60 million status updates posted each day
...


資料來源:Facebook | 統計資料


除此之外,Facebook 也提供許多官方與非官方 Client libraries ,如:


PHP 5
JavaScript
Facebook Connect for iPhone
ActionScript 3.0 Library for Facebook Platform
Microsoft SDK for Facebook Platform
...
資料來源:User:Client Libraries - Facebook Developer Wiki


所以,有機會就試試 Facebook Connect 的效果吧!


設定方式:





  • 可以透過傳統的 Facebook | 開發人員 建立應用程式或是從 Facebook Developers | Facebook Connect 上頭的 Start Building 按鈕進行,使用後者比較簡單,也有完整的程式範例。

  • Facebook | 開發人員 為例

    1. 建立新的應用程式


      • 填寫一些名稱資訊

        Facebook Connect Setup 01



    2. 設定 "聯外通" 並填寫 "聯外通網址"

      • 此例以 http://my.domain.com/path/fb/
        Facebook Connect Setup 02



    3. 設定儲存完則會切回此應用程式整體資訊,例如顯示 API 金鑰、Application Secret 等資訊。

    4. 切換到自己的機器上( http://my.domain.com )

      • 準備 xd_receiver.htm ,將它擺在網站的根目錄,以此例就是可以用網頁連到 http://my.domain.com/xd_receiver.htm 這個位置。如果沒有權限,那擺在 http://my.domain.com/path/fb/xd_receiver.htm 也可以試試,我試的結果兩者都可以。

      • xd_receiver.htm 檔案內容

        • <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><title>xd</title></head><body><script src="http://static.ak.facebook.com/js/api_lib/v0.4/XdCommReceiver.js" type="text/javascript"></script></body></html>






  • Facebook Developers | Facebook Connect 為例

    1. 點選 Start Building 建立基本資料
      Facebook Connect Setup 01

    2. 擺放 xd_receiver.htm 在網站的根目錄中,如果有權限可以擺放該檔,建議可以先測試後在進行,不然就點選稍候再上傳,並且把檔案擺在網站服務目錄下
      Facebook Connect Setup 02

    3. 接著網站上也會有一些現成的程式碼可以用,比傳統建立的方式輕鬆許多,資料也豐富很多。
      Facebook Connect Setup 03


  • 其他留意項目

    • 關於 Server 位置,雖然設定在使用非 80 port 時可以正常設定完成,如 http://my.domain.com:8080/path/fb/ ,但在使用 Facebook 提供的認證過程中,並不會幫你導回正確的 port ;使用 http://my.domain.com/~user/path/fb/ 的設定方式也會有問題,要留意一下。




辦完向 Facebook 申請的設定部份後,緊接著則是對 Server 撰寫合適的程式碼,在此以簡單的程式碼舉例:



  • 假設網站位置在 http://my.domain.com/path/fb/ ,在 Server 位置恰好是 /data/path/fb/ 目錄,那該目錄會有兩個檔案,分別是 config.php 跟 index.php ,如果無法設定網站根目錄 xd_receiver.htm ,那可以把它擺在 /data/path/fb/ 目錄中,也就是在 /data/path/fb 目錄中共有三個檔案。

  • config.php

    • <?php
      session_start();

      $appapikey = 'API_KEY';
      $appsecret = 'Application Secret';

      // check login
      if( isset( $_REQUEST['check_login'] ) )
      {
              require_once 'facebook.php';

              $facebook = new Facebook($appapikey, $appsecret);
              $user_id = $facebook->get_loggedin_user();

              if( !empty( $user_id ) && !isset( $_SESSION['id'] ) )
              {   
                      $_SESSION['type'] = 'facebook' ;
                      $_SESSION['id'] = $user_id;

                      if( isset( $_REQUEST['continue'] ) )
                      {   
                              header( 'LOCATION: '.$_REQUEST['continue'] );
                              exit;
                      }   
              }   
      }

      $curr_url = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
      ?>



  • index.php

    • <?php
      require_once( 'config.php' );
      ?>
      <html>
              <head>
              </head>
              <body>
                      <script src="http://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php/zh_TW" type="text/javascript"></script><script type="text/javascript">FB.init("<?php echo $appapikey;?>");</script>
       <?php
      if( !isset( $_SESSION['id'] ) )
      {
              $login_url = strpos( $curr_url , '?' ) > -1 ? $curr_url.'&check_login=on' : $curr_url.'?check_login=on';

      ?>
                      <fb:login-button v="2" size="small" onlogin="window.location='<?php echo $login_url; ?>';">用 Facebook 登入</fb:login-button>
      <?php
      }
      else
      {
      ?>
                      <fb:comments numposts="4" title="My Blog Comments" css="http://www.yourwebsite.com/css/comments.css?1234" simple="1"></fb:comments>
      <?php
      }
      ?>
               </body>
      </html>




網站 Demo 畫面:



  1. 初次訪問 http://my.domain.com/path/fb/ ,此頁只會有單純的一個登入按鈕
    Facebook Connect Demo 01

  2. 點選 Facebook 登入按鈕,會跳出相關的資訊給使用者,告知使用者一些資訊
    Facebook Connect Demo 02

  3. 若登入後,則將畫面轉成可以留言到個人塗鴉牆上的介面
    Facebook Connect Demo 03


目前的缺點:


尚未找到妥善的登出方式。


2010年2月10日 星期三

Windows XP 之 CPU 使用率 100% @ VirtualBox 3.1.2

前天重灌完電腦,我的 Host OS 是 Windows 7 x64 的環境,使用 VirtualBox-3.1.2-56127-Win 版本,而 Guest OS 是安裝 Windows XP with SP3 ,但無緣無故沒做甚麼事,那個 Windows XP 卻一直不斷地停在 100% ,害我甚麼事都不能做。


後來 Google 一下,幸運地發現一些文章:



解法:


將虛擬機器關機後,點選那個 Guest OS 並按下 [設定] ->[系統]->勾選 [延伸功能:啟用 IO APIC] ,目前打開選項後就沒有 100% 的現象,但我覺得那只是暫時改變一些環境條件使得該現象消失,之後我把這個選項關掉後,卻又沒有出現 CPU 100% 的問題,先記一下這個狀況,這種作法可能仍不是正解


2010年2月7日 星期日

三分之一的省思

一天有 24 小時,花 8 小時休息,花 8 小時工作,那還有 8 小時給自己。


工作一陣子,原先有點在想,為什麼一天要花八小時工作,後來發現只要工作 8 小時,就可以養活自己跟家人,已經是不錯的事了。倘若還沒有工作的人,也不用沮喪,因為多了 8 小時可以利用。


工作後,並不一定能做自己想做的事,有的人只做重複性的事務,有些人能做有挑戰的事,但這些也都一樣重要,因為社會就是這樣搭建起來,但滿足社會體系後,還是得看看自己,如果我花了 8 小時養身體,再花 8 小時養活自己,那剩下的 8 小時是不是很重要呢?其實那最後的 8 小時,還需扣掉洗澡洗衣吃飯準備上班等等的,其實並不多。


大概已有一陣子準時上下班,理由簡單,因為若多花了幾分鐘在公司,那我就對不起 1/3 的自己,所以盡量把工作安排恰當,目前我大概早 5 ~ 15 分鐘到辦公室,但其實有點像用來吃早餐,然後晚 5 ~ 15 分鐘下班。除此之外,最近有感主管是非常重要的角色,參加公司辦的新人訓練,才真正了解主管的意義,他們就是要幫你扛更多的責任!你可以安心地做工作上的事務,不需要花心思去爭取計畫費、跑業務,因為這個責任是主管在扛的,除此之外,其實工作上的進度不單單只是自己的責任,也是主管要拿捏的,一個人工作進度不佳,往往都會覺得是那個人的問題,那轉個方向,其實也是主管沒有評估好風險或能力的關係,這時候可以透過考績顯示出來,但我不喜歡用脾氣來顯示出來。考績好與壞,主要看待的是公司體系的運作,但如果一個人考績佳但是完全是犧牲掉個人的 1/3 天,那這樣不見得是成功的,只是這一切又會牽扯到價值觀的事…


看來工作與生活,還是需要很多的智慧來處理的。


莊子〈秋水〉

莊子與惠子遊於濠梁之上。
莊子曰:「鯈魚出游,從容是魚樂也。」
惠子曰:「子非魚,安知魚之樂?」
莊子曰:「子非我,安知我不知魚之樂?」
惠子曰:「我非子,固不知子矣。子固非魚也,子之不知魚之樂,全矣。」
莊子曰:「請循其本。子曰:『女安知魚樂』云者,既已知吾知之而問我,我知之濠上也。」


2010年2月3日 星期三

[C] 使用 fread 讀取檔案的觀念 - 小心使用 End-of-file (EOF)

連續幾天晚睡。主要是想解決一個 bug,這是用 C 語言開發的 tools,但每次都要讀取很多筆資料時才會出現,每一次運作要將三個小時才會看到這個現象,慶幸的,還是追到了。


這個現象碩班時就碰過了,所以知道要處理,然而我碩一下才開始寫 C 語言,恰好是經驗最淺得時候寫了一些 tools ,不曉得還暗藏多少 bug 啊!未來只能繼續見招拆招 。請看看下面的例子:


程式碼


#include <stdio.h>
#include <stdlib.h>

int main()
{
        FILE * fp = stdin;
        char readbuf[4];
        int cnt = 0;
        int length = 0;

        while( !feof( fp ) )
        {
                length = fread( readbuf , 1 , 4 , fp );
                printf( "cnt:%d , data size:%d\n" , ++cnt , length );
        }
        return 0;
}


測資


# echo "123" > data
# ls -la data
rw-r--r-- 1 user group 4 2010-02-03 13:21 data


其中 4 這個數字代表 data 這個檔案的大小,雖然只 echo 三個字元,但它還會幫你多加個換行符號囉


運作結果


# gcc t.c
# ./a.out < data
cnt:1 , data size:4
cnt:2 , data size:0


看得出來嗎?那就是 read buffer size 設成跟讀取資料的大小一樣時,第一次呼叫 fread 時,雖然把資料讀完,但它依舊無法判斷到 end of file 。恰好我的實做上只使用 feof 來判斷有沒讀完資料,接著才要做事,所以就出錯了。因此,最好地作法還是要搭配變數(ex: length)紀錄讀取資料的資訊來加以判斷吧!


2010年2月2日 星期二

關於 PIXNET 痞客邦 Blog 部落格面板 CSS 寬螢幕教學


目前我用的面板,出自於 myjourney911 實作:痞客邦管理後台 > 部落格 > 樣式選擇 > 電影 > [電影樣式] 帶我去遠方


我喜歡他的配色,但由於喜歡單調,就擅自把他的圖片去掉,在加上我的 Blog 字比較多,甚至帶有程式碼,所以我就又調整它,讓他支援寬螢幕,希望喜歡的人還是用用原版的風格!因為有網友在問我,所以就順手筆記一下,以免我自己也忘光。


首先很多面板的文章內容沒有調列式( ul 或 ol ),這主要是因為部落格旁邊的選單及項目也是用 ul 或 ol ,為了美觀就把它取消,但其實是可以個別設定的,基於需求,所以我有設定它,關於這部分也可以參考以前的筆記



以下列出對這次面板修改的部分:


/*dl,dt,dd,ul,ol,li*/ { margin:0; padding:0; }

/*
ol,ul { list-style:none; }
*/

#container2 {
/*    width: 900px; */
    width: 96%;
}

#header {
    height: 50px;
/*
    height: 378px;
    background: url(http://p4.p.pixnet.net/albums/userpics/4/5/420045/4a950ae67bc00.jpg) no-repeat;
*/
}

        #banner h2 {
/*
            width: 260px;
*/
            width: 400px;
        }

    #navigation {
        top: 55px; left: 0;
/*
        top: 383px; left: 0;
*/
    }

    .box {
/*        width: 263px; */
        width: 100%;
    }

#content {
/*    width: 620px; */
    width: 78%;
}

.article-head , .inner-box ul , .inner-box ol , .box-text ul , .box-text ol { list-style:none; margin:0; padding:0; } 


剩下的就只剩調調字型大小,只是每個面板設計不一樣,或許每一次都要客製化了?此例為:


.article-content {
/* font-size: 13px; */
font-size: 16px;
margin: 0px 0px 0px;
}
#banner h1 {
position: absolute;
bottom: 10px;
right: 0px;
z-index: 500;
width: 550px;
height: 30px;
line-height: 30px;
overflow: hidden;
font-family: "simhei";
/* font-size: 18px; */
font-size: 26px;
text-align: right;
}


.title {
font-family: "simhei";
/* font-size: 18px;  */
font-size: 22px;
line-height: 20px;
margin: 0px 0px 0px;
}