2010年3月9日 星期二

不要輕易相信廟口上廣告效果誇張的偏方藥

記得那幾年前,隔壁鄰居發生車禍後,幾個禮拜稍稍復原後,到中部廟宇拜拜求平安。


當時碰到一對也前來拜拜的老夫妻,看著鄰居受傷未拆封的繃帶,唏噓幾句,便也分享自己的故事。說著以前身體不好,但有次碰到一位老師,教導他們怎樣練身體,像是每天透過在單槓上拉拉身體,可以處理久坐的脊髓側彎問題,抑或透過泡澡的方式改善血液循環等等的,說的讓我那鄰居好似心動,隨後拜拜完後則一起繞道過去那位老師家裡坐一坐。


鄉下的房子,看似小間,沒想到踏入後又是另一片天,有張大大的木桌,氣派氣派,老師在熱心地請大家喝高山茶,剛剛那對夫妻則越來越少話,直到後面才發現,原來老師是賣藥酒的,就是那一兩幾千的鹿茸,看著我那鄰居,還說便宜賣給他們,並且看著他們受傷的地方,提供很多健身養氣的方式,但最終還是要他們買那瓶算一算幾萬元的鹿茸酒!


老實的鄰居就這樣抱了一瓶回家,但心裡越想越奇怪,後找我聊聊,彼此討論後,才想起來以前常常有在賣假藥酒的事,也是以一對夫妻去外地拉人的情境,賣的正是鹿茸酒,漸漸地也覺得越來越多的疑點,於是鄰居在我的建議下,展開小小地退件計畫。雖然那位老師一開始並沒有收錢,還特許過陣子再給錢,但這一切仍是太多奇怪的事。最後,幸運地終於把藥酒退還了!鄰居們心中的重擔也放了下來。


有一則小故事:「有隻小鳥在天寒中受凍,這時有隻大象在牠身上大了一坨熱熱大便,讓小鳥活了過來,然而牠仍動彈不了,不久後來了隻替牠拍掉身上的大便,卻一口吃掉了牠。」


人在低潮時期,很容易接受別人的援助,但有可能如同故事中的小鳥的遭遇,看似對牠壞的,其實救了牠一命,看似對牠好的,卻要了牠的命。對於身體保健,千萬不要購買來路不明的藥品,人體是豐富的化學變化,隨便用藥很容易造成連鎖反應而引起後遺症的,還是透過專業醫生的診斷處理才是維持健康身體的不二法門囉!盡管這次事件並沒有真正造成鄰居的損失,但也上了寶貴的一課囉!


相關網站:http://pharmacists.pixnet.net/blog/
衛生署藥物資訊網:http://drug.doh.gov.tw/
衛生署食品資訊網:http://food.doh.gov.tw
台南縣藥師公會:http://www.tainan-pharmacist.org.tw/


第一次用 Mac OS 的筆記 @ Mac 10.6.2

最近手邊多了一台 Mac Mini 可以用,所以還可以用來開發 iPhone 程式!只是對 Mac 不熟的我而言,反而什麼都用不順,就多筆記一下吧,並且我只有一般的鍵盤可以用。


之後會持續慢慢補東西



  1. 切換輸入法:視窗鍵+space

  2. 快速尋找:ctrl+space

    • 有點類似 Windows 上的 視窗鍵+r ,可以接著輸入 textedit 就可以叫出文字編輯器囉



  3. 安裝 Yahoo! 奇摩輸入法

    • 因為內建的輸入法有些不順手,改用 Yahoo! 輸入法後,關於一些標點符號可以用 ctrl + 鍵盤位置 打出來,另外一提的,在 Windows 上新注音選字是直接按下,但在 mac 上則是要按 space 囉,但換成 Yahoo! 輸入法後,就可以用下鍵去選字囉



  4. 使用 Safari 瀏覽器

    • 用 firefox 時,常常搭配 ctrl 做事,例如開啟新的一頁 ctrl+t ,在 mac 上是使用 視窗鍵,如 視窗鍵+t



  5. 很多在 Windows 或 Linux 上會搭配 ctrl 做事的,如全選、複製、貼上,請用視窗鍵還替換 ctrl 鍵囉

  6. 關於作業系統版本,請從最左上角 mac logo 點進去,裡頭有"關於這台 Mac",不用再傻傻用 uname -a 啦

  7. 安裝軟體後,在右下角有個長得很像資料夾的,上頭有個 A 字樣,可以從那邊去去找,但不是所有安裝完的軟體都可以在那邊找到

  8. 在 Mac 上的 Finder 有一點點類似在 Windows 上的檔案總管,快速鍵:視窗鍵+n

  9. 切換工作視窗:ctrl+F4


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 之完全視窗介面的操作,還是比較貼切一點。