2009年9月24日 星期四

[MEMO]富國銀行(Wells Fargo)線上保險箱:vSafe

Wells Fargo在2008的10月推出了線上保險箱服務。此服務主打:提供實體文件的備份服務


為什麼Fargo會有這樣的想法?根據官方blog影片的說法,這些重要文件往往可能因為天災人禍而毀損。或者換個想法:通常這些重要文件通常是在關鍵時刻才會被用到。所以銀行就推出了保險箱概念的線上服務。


由於vSafe可以保存數位化過後的資料,因此,不只是文件檔,甚至聲音、影像也可以被放置到這個虛擬保險箱中,例如重要的證件電子副本、工作的重要文件、小孩成長的家庭影片、帳單與稅務相關資料、遺囑...等等。


從使用者的角度來看,將節省下 保存/整理 這些資料的心力,銀行將替使用者解決掉這問題,且重要的文件電子檔配合電子簽章與有銀行的公信力,將具備有法律上的效力(等同於紙本)。這比較起使用者將檔案數位化後放在自己的設備中更加有用。

Wells Fargo的教育中心提供了影片介紹線上試用功能,讓使用者能更輕易的了解這項服務。

參考資料
    官方介紹:


    其他報導:

2009年9月23日 星期三

[MEMO]套件管理系統內的軟體index broken

因為上次在EPC上編Kernel的時候沒有注意到硬碟剩餘空間,編完之後硬碟使用率就接近100%。在硬碟使用率接近100%時往往會出現許多靈異現象,像這次就出現firefox的search bar沒辦法用、pidgin沒辦法上線。

一開始沒發現系統怪怪的時候,我按照慣例連上網路apt-get update、apt-get dist-upgrade放著更新,順便做其他事情。後來覺得"這電腦幾天沒用而已,怎麼就不聽話了...",想說"把pidgin移除掉重裝好了",接著就發現了fx也怪怪的,才開始檢查系統,檢查的過程,因為開pidgin讓我電腦當掉(此時apt還未更新完),整台電腦只好重開(直接關電源)。重開之後移先除掉kernel檔解決了空間不足,本來以為OK了,不過卻發現另一個問題:apt怪怪的(應該是直接關電源重開機的副作用)。f-spotinstall或remove都會顯示dpkg: post-installation(removal) script code error 139

查了一下之後,發現可能是套件管理系統內的software index broken

解決方式如下
  1. $sudo apt-get clean #清除apt cache
  2. /var/lib/dpkg/info下移除出問題的軟體相關檔案(有包含該軟體名稱的檔案都移掉)
  3. $sudo apt-get install -f
  4. $sudo apt-get update
  5. $sudo apt-get upgrade

這樣處理之後應該就會正常了!

ref:[ubuntu] software index broken

2009年5月31日 星期日

[MEMO]ubuntu 9.04 on EeePC 701/702 & CPU Full Speed

在EEEPC 701/702上使用USB替EPC安裝ubuntu 9.04 且讓CPU能運作在900 MHz
[2011/11/17 update:link ]

準備工作:
USB隨身碟 (1G以上)
ubuntu 9.04 UNR USB image file
Image Writer for Windows

如果EPC沒有連接網路,需先下載下列檔案
asus_eee kernel module
elmurato Eeeasy Scripts

開始安裝
  1. 使用ImageWriter 將ubuntu UNR 的img檔案置入USB中
  2. 在EPC上選用USB開機
  3. 安裝ubuntu
  4. 因為ubuntu 9.04的UNR mode在EPC上有Bug,因此進入UNR之後需切換到傳統桌面
    1. 點選"偏好設定"
    2. 點選"切換桌面模式"
    3. 選擇"經典桌面"並且套用
  5. 編譯並且安裝asus_eee Kernel Module
    1. 開啟terminal
    2. $wget http://std1.mis.yzu.edu.tw/~s941643/share/asus_eee-0.3.tar.gz
      • 如果該link有問題, 可以改用$wget http://moon.cse.yzu.edu.tw/~s941643/file/asus_eee-0.3.tar.gz
    3. $cd asus_eee-0.3
    4. $gedit asus_eee.c,將該檔案內的&proc_root皆取代為成NULL
    5. $make
    6. $sudo insmod asus_eee.ko
  6. 安裝Eeeasy Scripts
    1. $wget http://www.informatik.uni-bremen.de/~elmurato/EeePC/Jaunty_Eeeasy-Scripts.tar.gz
    2. $tar xfvz Jaunty_Eeeasy-Scripts.tar.gz
    3. $cd Jaunty_Eeeasy-Scripts/
    4. $chmod +x eeeasy-scripts.sh
    5. $sudo ./eeeasy-scripts.sh install
  7. $sudo reboot,重開機之後即完成整個流程。
=============================================================================================================== asus_eee Kernel ModuleEeeasy Scripts可以使EPC對於fn鍵的支援正常,並且讓CPU在AC mode之下恢復900MHz的運作模式。另外有一套eee-control也可以做到同樣的功能,但是我裝完之後,每次將CPU調至performance mode都會當機,所以我改用這個安裝上較為複雜的工具。雖然安裝較為複雜,但是目前運作一切良好 :P Screenshot: 參考:
  1. 請問Ubuntu Notebook Remix 9.04這個版本怎作安裝動作
  2. EEEPC at Full Speed!
  3. Jaunty UNR Running Super Slow:-(
  4. Notes for EEE 701 Users running Ubuntu 9.04 Jaunty
  5. asus_eee kernel module
  6. [Ubuntu 9.04] Eeeasy scripts

2009年2月28日 星期六

[電影]送行者:禮儀師的樂章


會看這部電影是起因於辛意雲老師的推薦。雖然當時《送行者》還沒
獲得奧斯卡最佳外語獎的肯定,但是老師對於這部片用心呈現的人生死之
際努力非常推崇,並且建議我們有空可以去看。每次跟老師聚會,都會聊
到最近的表演、電影、時事。辛老師常推薦許多經典給我們,但其實我鮮
少跟隨著老師的推薦走,反而常將自己框在習慣的視界。

隨著最近一些事情的發生,漸漸開始去思考過往不曾認真想過的課題:

“人為何而生死的”
“既然終究得死,為什麼要那麼努力”

過往的日子中之所以不曾認真思考,是因為我在各個階段通常都有目標,
一直都概略知道自己要做什麼。但是最近一年發生的事情讓我得開始去將
這個想法細化,試圖磨出更具型體的智慧。因外在現實的壓力與內在自我
的提醒讓我開始順著老師的思路走,透過經典與現代生活中的表演與電影
去了解人的生活與愛,並且試著找出自己問題的答案。

看著送行者,讓我想起在大一那年祖母的過世。這是造成我最大心態轉變
的事件。因為這件事情,我開始思考在電子競技運動發展的現實,轉而把
心放回一直有興趣的資訊相關領域,並且陸續做了轉學考與重考的決定,
讓我現今能待在元智資工,並且即將畢業(雖然會延畢)。朝著我的夢想更
進了一步。

人去世通常不會短暫的事件,不會像開關一樣馬上就可以ON/OFF。

對親屬朋友而言,去世的人在生前已是自己生活一部分,當他往生之後如
何讓自己在感情上作調適並讓自己習慣"這個人已經不在了",將是一段很
長時間的功課。

撇開宗教的理論,我想禮儀師這樣一個職業,可以帶給尚在世的人一種儀
式上的暗示,告訴自己:“這個人已經走了,不管他/她生前如何,至少在
最後使他走的順利、莊嚴。在整件事結束之後,也將他該放下了。”

藉著這個過程,可以適度節制生者的哀傷,不至於影響對每個人該做的本業
,也讓生者可以繼續接棒,在人生旅途上繼續展現生命力。


《送行者》能被那麼多人肯定,不是因為它描述了日本的喪葬儀式,
而是它對於電影場景中各個角色在生前死後之情感、生活互動的深刻呈現
,讓許多人能後獲得共鳴。(在140分鐘裡,播放廳中不時可以聽到觀眾的
笑聲、啜泣聲)對這部片來說,真正的價值於此。

在這裡很誠懇的推薦大家去電影院看這部片子。推薦去電影院的原因並不
是我支持正版,而是電影院的環境、音響可以讓人較融入劇情(像我在家
看電影就常常PAUSE去作別的事)。有個可以讓你專心欣賞電影的環境,
相信你會獲得更多,也較不會糟蹋了這部好片。



台灣官方網頁:http://departures.pixnet.net/blog

《預告片》


2009年2月23日 星期一

[音樂]民族音樂家阿炳的音樂人生


阿炳
(1893年8月17日-1950年12月4日)本名華彥鈞,中國民間音樂家,江蘇無錫人。他青年時患了眼疾而雙目失明,一生坎坷。失明後,他常身背琵琶,手提胡琴在無錫街頭和惠山一帶演奏,故人稱「瞎子阿炳」、「盲公炳」或「盲炳」。

1950年夏,中央音樂學院楊蔭瀏、曹安和教授專程來無錫為阿炳演奏錄音,此時阿炳已完全荒棄音樂達三年之久,經過三天的練習,分兩次錄音,共留下《二泉映月》《聽松》《寒春風曲》三首二胡作品和《大浪淘沙》《龍船》《昭君出塞》三首琵琶作品。但阿炳自己最得意的《梅花三弄》因為錄音鋼絲不夠而沒有錄製。後《二泉映月》、《大浪淘沙》獲二十世紀華人經典音樂作品獎。

阿炳在音樂上的成就,遠遠超越了家傳師承的藩籬,博採眾長,廣納群技,把對痛苦生活的感受,全部通過音樂反映出來。他的音樂作品,滲透著傳統音樂的精髓,透露出一種來自人民底層的健康而深沉的氣息,情真意切,扣人心弦,充滿著強烈的藝術感染力。

文字資料來源:維基百科-阿炳http://0rz.tw/pkmAy















2009年2月10日 星期二

[音樂]Symphony


Symphony means "put something together".

當樂團音準、節奏放在一起了,不能忘了最重要還是需要大家將注意力與感情也一起投入!透過音樂去讓身邊的夥伴及台下聽眾瞭解你要訴說的事情。

~ 2009.02.04 林晉名老師

[國樂]十二國風‧犇


第一次在大團中坐那麼前面的位置

第一次在舞台上收到花 (感謝神眉學弟!)

第一次覺得自己整場音樂會都表現不錯!


這真的很棒的一場音樂會,結果比我跟建安預期的好太多了,非常感謝晉名老師帶我們完成了這個目標。

音樂會錄音:http://0rz.tw/ttQgo

特別推薦-穆桂英掛帥: http://0rz.tw/gHloV

2009年1月18日 星期日

【教學】WindTopBBS的彩色複製貼上設定

WindTopBBS系統的彩色複製貼上設定

在使用風之塔系統的BBS時,常常會發現無法將彩色文字複製貼上。

問題出在風之塔系統對於"ESC"處理較不一樣。一般站台是"^U",而風之塔是"^C^H^H"

所以只要更動BBS連線軟體在"貼上時對於ESC的處理"就可以順利將彩色文字貼上。

以PCman為例:
1.先在控制列點選《自定PCman各項設定










2.點選《站台選項
3.設定"貼上彩色文字轉換成:^C^H^H"
4.點選《確定》後即完成設定。

[程式]C/C++之指標 (pointer),參考 (reference) 觀念整理與常見問題

原文轉載自Sean's Warehouse

C/C++之指標 (pointer),參考 (reference) 觀念整理與常見問題
這篇文章是由我舊的blog轉貼過來的
文中某些小細節稍作修改
--------------------------------
前 言
這是以前替人代班教課時寫的一些東西
重新整理後放上來,一方面當作自己的備忘錄 (自己最看得懂的還是自己寫的東西)
另一方面如果有人有這方面的問題,希望此文能對你們也有一點點幫助。
--------------------------------
很多程式員說:學C/C++而不會使用指標,相當於沒學過C/C++。
本文針對C/C++中,指標與參考的常見問題或錯誤,做了一番整理,但求能達到拋磚引玉之效。如有疏漏或錯誤之處,尚請不吝告知指教。
目錄

  1. 何謂指標 (pointer)? 何謂參考 (reference)?

  2. call by value? call by address (或call by pointer)? call by reference? -- swap(int* a, int* b) v.s. swap (int &a, int &b)

  3. pointer to pointer, reference to pointer (int** v.s. int*&)

  4. function pointer

  5. void ** (*d) (int &, char **(*)(char *, char **))....如何看懂複雜的宣告…


1. 何謂指標 (pointer)? 何謂參考 (reference)?
我們先談指標 (pointer)。指標,其實也只是一個變數,只是這個變數的意義是:指向某個儲存位址。很玄嗎? 一點也不。下面這張圖就可以輕易的看出指標為何物。

圖中,a, b, c, d, p1, p2都是一般的變數,儲存在記憶體 (memory) 中。其中,p1變數所記載的值是變數a的記憶體 (memory) 位址,而p2則記載著b的記憶體位址,像這樣的狀況,我們就稱p1是一個指向a的指標,相同的,p2是一個指向b的指標。
在C/C++中,我們用下面的式子來表示這個關係:

int *p1 = &a;
int *p2 = &b;

其中的&,稱為address of (取址)。即,p1 = address of a,p2 = address of b。
另一個符號*,代表的意義是指標。

int *p1


要由後往前閱讀來瞭解它的意義:p1 is a pointer points to an integer。因此,

int *p1 = &a;

這整行,我們可以看成:p1 is a pointer points to integer variable a,即:p1是一個指標,指向整數變數a。

且讓我們暫時打住指標的討論,轉頭看看參考 (reference)。
參考,可以想像成是一個變數或物件的別名 (alias)。通常,當函式 (function) 的參數 (parameter) 在函式中會被修改,而且要把這個修改結果讓呼叫函式的部份繼續使用,我們會用參考來當參數傳入函式中。
讓我們看看下面的例子:


void swap(int &a, int &b){
int tmp = a;
a = b;
b = tmp;
}



當其他程式呼叫此交換程式時,只要直接寫swap(x, y)就能交換x與y的值。在這裡,a和b為x與y的別名,即:a就是x,b就是y,如同美國國父就是華盛頓一樣。a和b不是x和y的複製品,任何做用在a與b上的動作都會反應在x與y上面,反之亦然。

指標和參考之所以難懂,有很大一部份的原因是符號上的陌生所致。加上&既能用於取址又能用於參考,容易造成初學者的混淆。下面我們提供幾個建議來幫助各位看懂這些符號。

  • 把int *p視為 int* p。
    把int和*連在一起看,當作是一種型態叫做 "指向整數之指標",要比int *p自然得多。同樣的方式也可以套在char* p或void* p等。但要注意的是下面的狀況:

    int* p, q;


    不要把這行誤解成p, q都是指向int之指標,事實上,q只是一個int變數。上面這行相當於

    int *p, q;



    int *p; int q;


    如果p, q都要宣告成指向int之指標,應寫成:

    int *p, *q


    或者干脆分兩行寫:

    int* p;
    int* q;



  • 若&前面有資料型態 (ex: int &),則為參考,&前面有等號 (ex: int* p = &a),則為取址。
    由於&同時具有多種意義,因此容易造成混淆。這裡列出的這個方法,可以幫助弄清楚每個&的意義。



2. call by value? call by address (或call by pointer)? call by reference? -- swap(int* a, int* b) v.s. swap (int &a, int &b)

JAVA中的reference與C++的reference意義上並不相同,卻使用同一個字,這也是reference容易造成混淆的原因。在此,我們暫不考慮JAVA中reference的觀念 (關於java中reference的觀念,請參考Reference in JAVA -- 淺談java的指標),純粹把主題放在C/C++上。
呼叫副函式時,call by value, address, 或reference是三種不同的參數傳遞方式。其意義如下:

  • call by value
    假設函式A呼叫函式B(p, q),則B中的p和q是「複製」自函式A所傳入的參數,B中對p, q所做的任何運算都不會影響到A中的p和q,因為B執行完後,並不會把複製的p, q存回到A中。這種參數傳遞方式,我們稱之為call by value。
    以swap這個常見的函式為例,若swap寫成下面的樣子:


    void swap(int a, int b){
    int tmp = a;
    a = b;
    b = tmp;
    }



    則呼叫

    swap(x, y)

    後,x和y的值並不會有變化。

  • call by address (或call by pointer)
    利用指標來做參數傳遞,這種方法骨子裡仍是call by value,只不過call by value的value,其資料型態為指標罷了。我們同樣看看用call by address來寫swap交換兩個integer的例子。


    void swap(int* a, int* b){
    int tmp = *a;
    *a = *b;
    *b = tmp;
    }




    呼叫swap時,要寫成swap(&x, &y)。呼叫swap時,x的指標 (x的儲存位置) 與y的指標 (y的儲存位置) 會被複製一份到swap中,然後把該位置內所記載的值做更換。swap結束後,&x (address of x) 和&y (address of y) 依然沒變,只是address of x所記錄之變數值與address of y所記錄之變數值交換了。因為&x 和&y 其實是利用call by value在傳,因此,call by address其實骨子裡就是call by value。

  • call by reference
    這是C++才加進來的東西,C本身並沒有call by reference。call by reference基本上是把參數做個別名 (alias),以下面的swap為例:


    swap(int &a, int &b){
    int tmp = a;
    a = b;
    b = tmp;
    }



    未來使用時,只要呼叫swap(x, y),就可以讓x和y的值交換。在這個例子中,a 就是 x, b 就是 y。這個觀念在上一節已經提過,在此不再贅述。


3. pointer to pointer, reference to pointer (int** v.s. int*&)

當我們用call by pointer (或address) 來傳遞參數時,被呼叫的函式複製一份pointer的值過去。但是,當我們想在函式內改變pointer的值 (而非pointer所指向之變數的值),而且改變的效果要能在函式外看得到時,call by pointer就不足夠用了。此時應該用的是"call by pointer to pointer"或"call by reference to pointer"。我們先看下面的例子:


int g_int = 0;
void changePtr(int* pInt){
pInt = &g_int;
}
void main(){
int localInt = 1;
int* localPInt = &localInt;
changePtr(localPInt);
printf("%d\n", *localPInt);
}




在這個例子中,印出來的數字仍然會是localInt的1,因為changPtr中的pInt是由localPInt「複製」過去的,對pInt做改變並不會反應到localPInt身上。
我們先用pointer to pointer對localPInt做改變,請看下例。



int g_int = 0;
void changePtr(int** pInt){
*pInt = &g_int;
}
void main(){
int localInt = 1;
int* localPInt = &localInt;
changePtr(&localPInt);
printf("%d\n", *localPInt);
}



本例中,印出來的數字會是g_int的0。changePtr函式中的pInt是由&localPInt複製所得,因此對pInt做改變並不會影響 main中的&localPInt (資料型態:pointer to pointer to integer)。但在changePtr函式中我們改變的對象是pInt所指向的內容,因此這項改變在main中會顯示出來。

同樣的功能,我們也可改用reference to pointer來完成。但同樣切記,reference是C++才有的功能,因此reference to pointer也只能在支援C++的環境中使用。


int g_int = 0;
void changePtr(int* &refPInt){
refPInt = &g_int;
}
void main(){
int localInt = 1;
int* localPInt = &localInt;
changePtr(localPInt);
printf("%d\n", *localPInt);
}



這段程式印出來的數字會是0。因為在changePtr中,我們宣告的參數型態為int* &,即:reference to pointer to integer。因此,main中的localPInt與changePtr函式中的refPInt其實是「同一件東西」。

另一種常見的混淆是pointer array (指標陣列) 與pointer to pointers,因為兩種都可以寫成**的型式。如,int**可能是pointer to pointer to integer,也可能是integer pointer array。但pointer array的觀念相對來講要簡單且直觀許多,這裡我們就暫不花篇幅敘述。常見的例子:main(int argc, char** argv)其實應該是main(int argc, char* argv[])。

4. function pointer

變數的指標指向變數的位址,同樣的,function pointer (函式指標) 也是指向函式的位址的指標。
函式指標的加入,讓C/C++的符號更複雜,也使更多人望之而卻步。在說明函式指標的用途前,我們先直接由語法來看看函式指標該怎麼宣告、怎麼理解。
假設有個函式長成下面的樣子:

void func1(int int1, char char1);


我們想宣告一個能指向func1的指標,則寫成下面這樣:

void (*funcPtr1)(int, char);


這樣的寫法應理解成:funcPtr1是一個函數指標,它指向的函數接受int與char兩個參數並回傳void。如果今天有另一個函式長成

void func2(int int2, char char2);


則funcPtr1也能指向func2。
指標指向的方法,寫成下面這樣:

funcPtr1 = &func1;


取址符號省略亦可,效果相同:

funcPtr1 = func1;


若欲在宣告時就直接給予初值,則寫成下面這樣:

void (*funcPtr1)(int, char) = &func1; //&亦可省略



stdlib.h中提供的qsort函式是函式指標最常見的應用之一。此函式之prototype長得如下:

void qsort(void* base, size_t n, size_t size, int (*cmp)(const void*, const void*));


其中的int (*cmp)(const void*, const void*) 就使用到函式指標。

函式指標常見的使用時機是multithread時。函數指標負責把函數傳進建立執行緒的API中。
另外,callback function也是常使用函式指標的地方。所謂callback function即:發生某事件時,自動執行某些動作。在event driven的環境中,便時常使用callback function來實現此機制。
事實上,函式指標還能讓C語言實作polymorphism。但礙於篇幅,在此不再詳述。

5. void ** (*d) (int &, char **(*)(char *, char **))....如何看懂複雜的宣告…

在這裡,我們介紹兩種方式來看懂複雜的宣告。第一種要判斷的是:常數與指標混合使用時,到底const修飾的是指標還是指標所指的變數? 第二種是面對如標題所示這種複雜的宣告時,我們要怎麼讀懂它。

5.1 常數與指標的讀法

const double *ptr;
double *const ptr;
double const* ptr;
const double *const ptr;


以上幾個宣告,到底const修飾的對象是指標,還是指標所指向的變數呢?
其實,關鍵在於:*與const的前後關係!
當*在const之前,則是常數指標,反之則為常數變數。因此,

const double *ptr; // ptr指向常數變數
double *const ptr; // ptr是常數指標
double const* ptr; // ptr指向常數變數
const double *const ptr; // 指向常數變數的常數指標


事實上,在The C++ Programming Language中有提到一個簡單的要訣:由右向左讀!!讓我們用這個要訣再來試一次。

const double *ptr; // ptr is a pointer points to double, which is a constant
double *const ptr; // ptr is a constant pointer points to double
double const* ptr; // ptr is a pointer points to constant double
const double *const ptr; // ptr is a constant pointer points to double, which is a constant


結果完全相同 :-)

5.2 複雜宣告的讀法 void ** (*d) (int &, char **(*)(char *, char **)).......
其實閱讀C/C++中複雜的宣告有點像是讀英文的長句子,看多了,自然知道句子是怎麼構造出來的。
但對於句子還不熟的人,難免得藉助文法來拆解一個句子。關於C語言複雜宣告的解析文法,最令我印象深刻的,莫過於印度工程師Vikram的"The right-left rule"。他是這麼說的:
「從最內層的括號讀起,變數名稱,然後往右,遇到括號就往左。當括號內的東西都解讀完畢了,就跳出括號繼續未完成的部份,重覆上面的步驟直到解讀完畢。」
舉個例子:void ** (*d) (int &, char*)依下面方式解讀:

  1. 最內層括號的讀起,變數名稱: d

  2. 往右直到碰到) : (空白)

  3. 往左直到碰到( :是一個函數指標

  4. 跳出括號,往右,碰到(int &, char*): 此函式接受兩個參數:第一個參數是reference to integer,第二個參數是character pointer。

  5. 往左遇上void **: 此函式回傳的型態為pointer to pointer to void。


==> d是一個函式指標,指向的函式接受int&和char*兩個參數並回傳void**的型態。
如何,是不是好懂很多了呢?

標題中的void ** (*d) (int &, char **(*)(char *, char **))其實和上面的例子幾乎一樣,只是函式的第二個參數又是一個函式指標,接受char*和char**兩個參數並回傳char**的型態。

行文至此,把指標和參考的常見問題與混淆大致地提了一些。希望能讓使用C/C++的人在面對或使用指標、參考、或取址時,不再有疙瘩在心中。文中若有不足或錯誤之處,也請高手不吝指教囉。:-)