Google+ Followers

2010年2月22日 星期一

Facebook API Stream.publish 與 Extended permissions 應用 - 同步發文至個人塗鴉牆

這邊所定義的發文是指,當使用者允許某個 Facebook 上的應用程式,給予它 status_update 權力後,擁有 status_update 的權限時,將使得該應用程式擁有發布資訊到使用者塗鴉牆上的權限,可以用在同步資料的處理。這些也就上許多 Facebook 應用程式所使用到的基本互動,如玩遊戲玩到一半時,因為一些事件想要發怖到使用者塗鴉牆上來提供更多互動,像等級提昇、獲得獎品、菜園裡出現大蟲子等等的訊息。


Plurk Facebook Connect
來源:http://www.plurk.com


關於權限部份,請參考 Extended permissions - Facebook Developer Wiki 頁面,上頭有詳細的權限資訊。至於要讓使用者點選允許的方式,一開始我參考了 Plurk 同步發文至 Facebook 的權限設定,才發現原來有 FB.Connect.showPermissionDialog 這東西可以使用!非常方便,例如跳出要求允許 offline_access 權限:


 FB.Connect.showPermissionDialog("offline_access", function(perms) {
   if (!perms) {
     continue_without_permission();
   } else {
     save_session();
   }
 });


然而,我預計要開發的環境,可能連 Javascript 都可能不能跑,所以,我又參考了 Authentication and Authorization for Facebook for Mobile Applications ,發現也有簡單版的純網頁方式囉。


我把它寫成簡單的程式,列出權限清單:


<?php

define( 'APP_API_KEY' , '################################' );
define( 'APP_SECRET_KEY' , '********************************' );

function get_permission_url( $permission )
{
        $params = array();
        $params['api_key'] = APP_API_KEY;
        $params['ext_perm'] = $permission;
        $params['next'] = 'The next URL to request after the user logs in to your application.';
        $params['cancel'] = 'The URL to redirect a user who cancels the dialog.';
        //$params['display'] = 'wap';
        return 'http://www.facebook.com/connect/prompt_permissions.php?' . http_build_query( $params );
}

if( !isset( $_REQUEST['auth_token'] ) )
{
        $params = array();
        $params['api_key'] = APP_API_KEY;
        $params['next'] = 'The URL to redirect a user who successfully logging in to Facebook.';
        $params['cancel'] = 'The URL to redirect a user who cancels the login.';
        $params['v'] = '1.0';

        header( 'LOCATION: http://m.facebook.com/tos.php?'. http_build_query( $params ) );
        exit;
}

$p = array( 'publish_stream' , 'read_stream' , 'email' , 'read_mailbox' , 'offline_access' , 'create_event' , 'rsvp_event' , 'sms' , 'status_update' , 'photo_upload' , 'video_upload' , 'create_note' , 'share_item' );

foreach( $p as $v )
        echo '<a href="'.get_permission_url($v).'" target="_blank">'.$v.'</a><br />';
?>


上例是以 Mobile Device 為例,如果一開使未登入時,那就導回去登入頁面,若登入完後,那就會列出一個清單,每個清單上的項目就是一個超連結,點選超連結就會看到權限的確認頁面,清單如下:


publish_stream
read_stream
email
read_mailbox
offline_access
create_event
rsvp_event
sms
status_update
photo_upload
video_upload
create_note
share_item


以上一旦該使用者允許了 status_update 後,那程式其實就擁有遠端發訊息至個人塗鴉牆的權力,因為不需要 session 資訊,取而代之的是要去紀錄使用者的 ID。


以 PHP 當作範例(post.php):


<?php

define( 'APP_API_KEY' , '################################' );
define( 'APP_SECRET_KEY' , '********************************' );

require_once 'facebook.php';
$facebook = new Facebook( APP_API_KEY , APP_SECRET_KEY );

$message = 'message';
$target_id = 'uid';
$facebook->api_client->stream_publish( $message , null , null , null , $target_id );
?>


由於可以遠端發文,所以就不需透過瀏覽器來執行啦


# php post.php


若沒有彈跳任何訊息,那就代表發文成功吧!其中上頭的 $target_id 就是使用者的數字帳號 ID ,如 "123456789000",另外,倘若是使用以下程式碼


$facebook->api_client->stream_publish( $message , null ,  null , $target_id );


會得到 'parameter uid or session key required' 的錯誤訊息


Fatal error: Uncaught exception 'FacebookRestClientException' with message 'parameter uid or session key required' in /path/facebookapi_php5_restlib.php:3065
Stack trace:
#0 /path/facebookapi_php5_restlib.php(926): FacebookRestClient->call_method('facebook.stream...', Array)
#1 /path/post.php(9): FacebookRestClient->stream_publish('message', NULL, NULL, '123456789000')
#2 {main}
  thrown in /path/facebookapi_php5_restlib.php on line 3065


如果 status_update 的權限沒有給予,那就會有 'The user hasn't authorized the application to perform this action' 錯誤訊息


Fatal error: Uncaught exception 'FacebookRestClientException' with message 'The user hasn't authorized the application to perform this action' in /path/facebookapi_php5_restlib.php:3065
Stack trace:
#0 /path/facebookapi_php5_restlib.php(926): FacebookRestClient->call_method('facebook.stream...', Array)
#1 /path/post.php(9): FacebookRestClient->stream_publish('message', NULL, NULL, NULL, '123456789000')
#2 {main}
  thrown in /home/frank/public_html/threeupaxman/facebookapi_php5_restlib.php on line 3065


最後,比較完善但連線次數會較多的程式碼:


<?php

require( 'facebook.php' );

define( 'APP_API_KEY' , '################################' );
define( 'APP_SECRET_KEY' , '********************************' );

require_once 'facebook.php';
$facebook = new Facebook( APP_API_KEY , APP_SECRET_KEY );

$message = 'message';
$target_id = 'uid';
if( $facebook->api_client->users_hasAppPermission( 'status_update' , $target_id ) )
        $facebook->api_client->stream_publish( $message , null , null , null , $target_id );
?>


2010年2月16日 星期二

使用 Eclipse 3.5 安裝 J2ME (Wireless Toolkit) 開發環境 @ Windows 7

說真的上一次裝 Wireless Toolkit 開發環境已經算是 2005 年了。老實說我還真的忘了該做什麼設定,就透過這次記錄一下吧!或許改天就要寫寫 Amazon Kindle 的相關程式


首先是下載 J2ME 開發的環境,接著則是設定 Eclipse 環境,流程:



  1. 安裝 Eclipse 和 JDK 開發環境


  2. 下載與安裝 J2ME 環境



  3. 增加相關 Eclipse Plugin


    • [Help]->[Install New Software]

      • Work with:http://eclipseme.org/updates

      • 勾選 EclipseME 吧,在此測試版本是 1.7.9

      • 版權什麼得就要同意一下,沒多久也就下載安裝好





  4. 設定 Eclipse


    • [Window]->[Preferences]->[J2ME]->[Device Management]->[Import]

      • Specify search directory

        • C:\WTK2.5.2_01



      • 打完若沒有動作,那就按一下 Refresh 就行





  5. 測試 J2ME

    • [File]->[New]->[Project]->[J2ME]->[J2ME Midlet Suite]

      • Project New:HelloWorld

      • 接著點 Next 到 Finish 就行了



    • 點選 Eclipse 左邊的 HelloWorld->src ,接著按右鍵 [New]->[Class]

      • Name:HelloWorld



    • 接著就把 HelloWorld.java 使用以下的程式碼覆蓋,程式來源:J2ME Eclipse - Setting up development environment with EclipseME


      • import javax.microedition.midlet.*;
        import javax.microedition.lcdui.*;

        public class HelloWorld extends MIDlet implements CommandListener {
            private Command exitCommand;
            private TextBox tbox;

            public HelloWorld() {
                exitCommand = new Command("Exit", Command.EXIT, 1);
                tbox = new TextBox("Hello world MIDlet", "Hello World!", 25, 0);
                tbox.addCommand(exitCommand);
                tbox.setCommandListener(this);
            }

            protected void startApp() {
                Display.getDisplay(this).setCurrent(tbox);
            }

            protected void pauseApp() {}
            protected void destroyApp(boolean bool) {}

            public void commandAction(Command cmd, Displayable disp) {
                if (cmd == exitCommand) {
                    destroyApp(false);
                    notifyDestroyed();
                }
            }
        }



    • 最後存檔完就可以按 Run 來看看






eclipseme


2010年2月15日 星期一

使用 Clonezilla Live 再生龍免費軟體備份 Windows 系統


圖片來源:http://clonezilla.nchc.org.tw/


以前常常重灌完電腦後,使用 Ghost 軟體將自己的系統槽進行備份,這個好處是電腦突然中毒的話,短時間又要做事,就可以拿備份資料來還原系統了!然而,現在比較常見的情況,反而是幫家人弄完電腦後,擔心哪天電腦出事,不在身邊時,至少還可以想辦法讓家人去執行還原系統的指令囉


我之前是用 Ghost 2003 的版本,完全的視窗化,非常方便。如今,來使用免費軟體 Clonezilla 再生龍 !使用過程雖然比較麻煩一點,但功能相對上強大許多,最重要的是免費囉!整體上我覺得比較適合系統管理者操作的軟體,一般使用者可能容易被一些不清楚的選項搞迷糊,慶幸的都可以選擇預設的選項。在此紀錄一下使用的備份環境及選項囉


電腦配備與環境



  • Windows XP with SP3

  • AMD Sempron 2600+

  • DDR400 1.5GB

  • Hard Disk x 2


    • 200GB IDE

    • 80GB IDE




首先可以參考 Clonezilla Live對Windows系統的備份與還原 嘉義縣網這篇教學文章,我覺得挺夠用了,雖然 Clonezilla 有更新部分選項,但原理並沒有改變,很推薦先看網站中的自機備份還原,以了解流程,上頭也都會有部分教學訊息。


此次我使用的是 LiveCD 版本(clonezilla-live-1.2.3-27.iso),把它燒成光碟來使用。而我的環境是將 200GB 切成兩槽,其中一個是系統槽(40GB),另一個是資料槽(160GB),而另一顆硬碟就是 80GB 的空間。我打算備份 40GB 那個分割槽。


流程:



  1. 下載並燒錄好 LiveCD 後,把它擺入光碟機並且重開機,須讓光碟開機為優先,不久之後即可進入 CloneZilla Live 的開機選單,我選擇預設進去。

  2. 我挑選中文環境:zh_TW.UTF-8 Chinese (Traditional) 正體中文 - 台灣

  3. 不要修改鍵盤對應

  4. Start_Clonezilla 使用再生龍

  5. device-image 使用印象檔處理整顆硬碟或部份分割區

  6. local_dev 使用本機的分割區(如:硬碟, 隨身碟)

  7. 選擇要掛載用來儲存備份結果的地方

    • 依我的電腦環境會列出三個項目,分別對應是 40GB 、160GB 和 80GB

    • 實際選項:


      • hda1 41.9GB_ntfs(In_HDT722520DLAT80)_VD051DTD00JB9L

      • hda5 158GB_ntfs(In_HDT722520DLAT80)_VD051DTD00JB9L

      • hdb1 82.3GB_ntfs(In_HDS722680VLAT20)_VN621RCHC7LARE



    • 我選擇將結果儲存在 80GB 那邊,所以勾選 hdb1



  8. 選擇要擺在剛剛掛載硬碟的位置,我選擇根目錄:/

  9. 我選擇專家模式

  10. saveparts 儲存本機分割區為印象檔

  11. 儲存為 2010-02-15-20-img (預設的目錄名稱,會將備份的資料擺入此目錄中)

  12. 選擇要備份的分割區

    • 我打算備份系統槽 40GB

    • 實際選項:

      • hda1 41.9GB_ntfs(In_HDT722520DLAT80)_VD051DTD00JB9L

      • hda5 158GB_ntfs(In_HDT722520DLAT80)_VD051DTD00JB9L



    • 選擇 hda1



  13. 預設將使用甚麼程式來備份,因為我是要備份 Windows 環境,所以就選擇把 ntfsclone 擺在最前頭的那個選項

    • -q  優先順序: ntfsclone > partimage > dd



  14. 備份程式的選項,我只使用預設的

    • -c     用戶電腦再開始複製前會再次確認是否要執行

    • -j2    複製介於 MBR 與第一個分割區中的隱藏資料



  15. 詢問是否要壓縮備份的結果,我使用預設的 gzip 壓縮

    • -z1 使用 gzip 壓縮



  16. 詢問是否要分割備份的結果,以 MB 當作單位,若不想分割就輸入大一點的數字,我不想分割,所以輸入了 200000MB 這個數字(我要備份的系統槽才 40GB)

  17. 工作結束的是否要自動執行動作

    • 由於我想要觀看結果的資訊,所以選擇不做其他動作

    • -p true  用戶複製完畢時不做其他動作



  18. 整個過程結束後,以我 40GB 的系統槽來說,真正使用到的資料約 9.23GB ,備份花了約 20 分鐘,每分鐘 500MB 左右的處理速度,結束後有選單會詢問你要做甚麼事,我選擇重開機:reboot

  19. 最後進去 Windows XP 後,我在 80GB 那顆硬碟中看到 2010-02-15-20-img 目錄,該目錄占了 6.19GB 的空間,或許該試試更好的壓縮模式。


使用心得,感覺比Ghost 速度慢?而預設使用 gzip 的結果也比較大?我印象中以前用 Ghost 2003 時,大概花 10 分鐘,而結果我也記得不到 4GB。或許有機會再試試其他的參數來看看吧!至於他的好處是免費,再來則是不用安裝軟體,直接使用 LiveCD 的模式,但對於管理者來說很方便,但倘若哪天要還原時,若操作的是一般的使用者,那他還是必須透過 LiveCD 來執行,相較之下,我覺得 Ghost 2003 之完全視窗介面的操作,還是比較貼切一點。


2010年2月12日 星期五

Facebook API Template - 塗鴉牆共同互動留言教學

之前因為 Template Bundle 的取消,所以我藉機學了 Facebook.streamPublish 的使用,詳情請參考:Facebook API Template Bundle - 發佈到個人塗鴉牆的樣版設定教學。只是,自從 Facebook 大部份的測驗,其邀請函根本不透過使用者的確認就自動發佈出去,讓我開始對測驗有些失望,便也不想再嘗試使用了。


最近有網友留言請教關於留言的問題,使用 Facebook.streamPublish 發佈到使用者的塗鴉牆時,那些制定好的 template 訊息,該如何讓所有的使用者都可以一起留言、按讚呢?而不在只是個人留言板。他稱呼這為留言派對。


這個我有印象在文件上有提到一些關鍵字,但直到今天才正式來測試使用,也算是在複習一下,或許過不久我又得投入這方面的研究吧。只是我一直搞不懂,有些 facebook develop wiki 頁面我很難從官方 wiki 連過去找到,好比如我想要像 Java API 那樣,可以很快地去找到想要用的函數及其說明。


首先可以逛逛的網頁:



這次實做只使用 Facebook Developers | FB.Connect.streamPublishAttachment (Streams) - Facebook Developer Wiki 資訊,其中對於 template 訊息部份,其實只要去制定 comments_xid 就可以了,但這種留言派對我覺得也有缺點,那就是大家的留言都串在上面,隱私會有問題,但在一些公告訊息方面,的確可以考慮使用啦。


comments_xid: An application-specific xid associated with the stream post. The xid allows you to get comments made to this post using the Comments API. It also allows you to associate comments made to this post with a Comments Box for FBML fb:comments.


程式碼範例:


<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!',
                'comments_xid':'1',
                '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  );
        FB.Connect.streamPublish( '' , attachment , null , null , 'Message:' , null , false  );
}
</script>
<a href="#" onclick="do_post();return false;">Click</a>


在此例中,指定了 comments_xid 數值,使得大家的討論都會很明確地紀錄在一起。


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;
}


2010年2月1日 星期一

[Book] 你不能不懂的統計常識


圖片來源:http://books.com.tw/


前幾天下班時,跑到圖書館撈撈寶,館內的統計相關書籍好像沒有那般生活化,不是一堆年報不然就是工程上的教學筆記。


我習慣在圖中的書中找書,而不是在網頁上找書,偶爾可以發現一些沒有在計畫中的書名,順手拿起來,就像在爬山時,無意間碰到的朋友,有緣就停下來說說話,要不望著他的身影離去,也有一番味道。


說說其他的,今天我又借了五本書,我想我可能看不完它們吧!但又何妨?與其待在圖書館,不如換到我家作客吧。我借的也都是老書,至少不會影響到其他人囉。


忘了一提,上面那張圖的書我看完了,比起上一本書來說,我覺得比較像切入數學了,之前看的那本比較像個故事大餅,可以從中得到偉大的統計學者,解決問題的故事,但看不到數學式子,而這本書也算是故事型的,但書後有些數學式子,像一些經典問題:


假設一個班上有 50 人,我猜班上有兩位生日同一天,那你敢不敢跟我打賭呢?


這題一開始我也容易陷入迷失,看了書後的解法,我才想到,有時候思索問題解法時,別忘了轉個方向再繼續囉!這題的解法:( 1 - "50 個人的生日都不一樣的機率" ),答案約 97%


至於這本書適合誰看呢?作者好像是定位給上過高中課程的人看,恰恰好我有符合啦,最近想先看看統計相關的故事書,等到真的很有興趣時,我在重新來學學數學吧!