2009年12月13日 星期日

[鐵馬戰記] 板橋<->關渡

今天約了小居和同梯的朋友股神一起去騎鐵馬
小居騎了避震超軟Q的美利達來 股神則是用機車載著他的美利達不知名副牌小折
約了十點準時在我家集合 大家都很準時 就先騎去家附近吃早餐
沒想到這一出門 卻是連環事件的開始

上路不到五分鐘 股神的小折開始出現卡鏈的情形
幫他看了一下 估計是剛剛把小折攤開時手賤去轉到了變速器調整螺絲
於是繼續吃早餐不管他

吃完早餐後便準備上路 結果一出發 股神的小折後變速器整個彈掉出來
我們三個人一起在研究到底是從哪裡彈的 隔壁早餐店老闆也很熱心的拿工具借我們
(可是我們剛是在隔壁家吃的 真不好意思 推一下老闆人超好)

裝變速器對一個 不 是三個超新手來說是非常困難的XD
修完大家都累的半死 回到家喝口水低頭一看已經十二點多了 果然集合時間和出發時間意義是不同的....

到此時股神對他的小折已經失去信任感了 
我只好出借前天才跟鄰居要到的 小孩子專用14吋生灰塵捷安特
一行人就開始出發 時間是十二點半

一開始先走光復橋左側的自行車道(右側在施工中上不去)
騎著騎著看到有個可以搬下去直接到堤外道路自行車道
在累個半死的扛車下樓梯後 便沿著自行車道上一路往大稻埕前進

由於三個人都是沒經驗的 所以到了洲美快速道路附近有點小迷路
後來靠著路標總算是走上正道 上了洲美快速道路的自行車道
下了橋之後沿著環狀自行車道一直騎 算是順利的看到關渡宮 看一下錶大約快三點

在觀光集中小攤吃飽喝足了 便上關渡宮走走 休息片刻
關渡宮蠻大的 裡面的動線也不簡單
從幾個不同的角度觀景之後 怕夜色太黑 在四點半左右準備從關渡橋橫越到三重繞一圈回家

沒想到天還是黑的比想像中的快
小居也在這時候出狀況了 不小心摔車
好在受傷不嚴重 不過下次還是早點出發 天黑真的是危險很多

慢慢的一路問路 終於在將近八點的時候回到家
大夥肚子都餓了 就走路到我家附近的中庸吃晚餐

雖然狀況不斷 不過我覺得騎單車還是漫有趣的
只是路況人況和車況都要再加強XD

2009年11月27日 星期五

gcc 參數 筆記

## -c
只生成 obj 檔,並沒有產生執行檔。
例:gcc -c hello.c

## -o
生成執行檔,file name 沒指定時,預設檔名為 a.out。
例:gcc -o hello hello.c

## -llibrary
設定 link 時需便用的 library。
例:gcc -o hello -lhell hello.c,需要的 library 為 libhello.a。

## -Ldir
設定 link 時,查找 library 的路徑。
例:gcc -o hello -lhell -L. hello.c,會在源碼目錄內找尋 libhello.a 。

## -Idir
設定 compile 時,查找 include 的路徑。
例:gcc -o hello -I. hello.c,會在源碼目錄內找尋 include 檔 。

## -I-
取消前面所有 -Idir 的設定。

## -g
在執行檔中,加入 debug 訊息。

## -traditional
試圖讓編譯器支援傳統的C語言特性。

## -static
禁止使用動態 library。

## -share
儘量使用動態 library。

##
聯結數個 object 成可執行檔。
例:gcc test1.o test2.o -o test
將 'test1.o'、'test2.o' 和程式庫聯結後成為可執行檔 test。

=========== 最佳化參數 ================
## -O0
不作最佳化;然而若是之前有指定其它 LEVEL 的參數,將不會受到本參數的影響。

## -O1
初步最佳化,作最佳化的編譯當然會花費更多的時間和記憶體;未使用本參數前 GCC編譯的原則是減少編譯成本,而且各個階段的編連是各自獨立的--可以在任一階段停下來,重新指定變數內容,且各階段的結果和一般的狀況相同,完全符合正常的程序,然而本參數會以整體四個階段一起考慮,且本參數包含許多其它參數,目的就是要減少程式大小及執行時間;使用本參數同時會將-fthread-jumps和-fdelayed-branch開啟。

## -O2
更進一步最佳化,本參數可直接使用不需配合上一個參數,在本參數下除了「大小--速度」需犧牲一方的演算法外其於都會用來作最佳化處理,也就是除了 frame pointer elimination 和 loop unrolling 外其餘將會利用上;和上一個參數比起來本參數在編連時間和執行碼效能都更優越。

============================
接下來是許多和 CPU 構造有關的參數,它們的型態為 -fFLAG,大部份有相反詞,而相反詞為 FLAG 之前加上 no- 所形成。
============================
## -ffloat-store
"不要"將浮點變數儲存在暫存器中,而且抑制其它會改變從暫存器或記憶體所得浮點數之值的參數功能;本參數避免了一個現象,即浮點數的值無緣無故的加了好幾位小數出來,本來若將變數內容放在暫存器中,會比在記憶體中快上許多,這也是一般最佳化的方法之一,然而對許多主機例如 68000 來說其浮點暫存器所能容納的長度比 double 還長,這對一般程式來說無可厚非,然而對數值計算程式或是利 IEEE 浮點數的程式而言卻是"窩裡反"的行為,本參數就是避免這種情況發生。

## -fno-inline
忽略關鍵字inline的作用。

## -fno-default-inline
inline 這個關鍵字的作用是在呼叫此類函數的地方有著這個函數的程式碼存在,如此雖然程式變大了但執行速度也加快許多,當使用 -O 時物件中定義在 class 區域中的每一個成員函數都是以 inline 的型態處理,而本參數便是限定不要將這些成員函數視為 inline。

## -finline-functions
整合所有「簡單」的函數到呼叫它們的函數內,而「簡單」的標準由 GCC自行判斷;假如一個函數被整合到其它函數中,且其型態為 static,此函數當然不會有自己本身的輸出。

## -fkeep-inline-functions
本參數要和上一參數對照;縱然一 static 函數被整合到其它函數內,仍輸出執行時期可供呼叫的version。

## -fno-defer-pop
函數呼叫時其間傳入值和傳回值的傳遞是靠堆疊來完成的,一般情況下編譯程式會在堆疊之中累積一些argument後再一起 pop出去,這是為了速率著想,而本參數的作用便是不要作堆積,進一個便彈一個出去。

## -fforce-mem
強制 memory operands 在作運算前先 copy 到暫存器中以加快運算速度。

## -fforce-addr
強制 memory address 之內容在作運算前先 copy 到暫存器中以加快運算速度。本參數對於程式整體效率的提升比 -fforce-mem 還好,但這兩個參數並不適合任一機種。

## -fomit-frame-pointer
當函數用不到 frame pointer 時將它從暫存器中清除,本參數同時抑制了任何儲存、設定或回存frame pointer 的動作,這將使得更多的函數可利用暫存器以提升執行效率。

## -fno-function-cse
不要將函數所在位址放在暫存器中,這將使得每個呼叫函數的指令包含了函數位址,這會產生較沒效率的程式碼,但對於某些會改變 assembler 輸出的 hacks 來說,最佳化的過程會擾亂程式的行為,那時便需使用本參數。

## -ffast-math
本參數允許 GCC 違反某些 ANSI 或 IEEE 規則來作運算,這將使得執行速度加快,但對於運算程式等需依賴數值精密度作計算者則本參數不應和任何-O 參數共同使用,因為很有可能產生錯誤結果。

==============
前置處理器參數
==============
直觀來說前置處理器的作用為處理程式之中以 # 開頭的命令,這些命令於常見的有標頭檔的引入和定義常數及巨集等,可以說是在編譯之前的準備動作,有時也可用依某常數定義與否來決定那些程式片段是否要編譯,這對移植的工作有很大的助益,例如同樣要作到印出檔案名稱,在不同的 OS 和檔案格式上所得的結果就有蠻大的差異,在此就可分別寫不同的處理碼,然後再利用 #ifdef 等命令適機編連,不僅節省程式碼,還能加快速度;以下的參數,便是和前置處理時期有關者,而且許多參數需和 -E 配合使用。

## -include FILE
在編譯目標程式之前先編譯 FILE,而且 FILE 並無只能為標頭檔的限定,若是和 -D 及 -U 合併使用時以本參數為優先處理,當參數列中不只一個本參數及 -imacros 時依其順序執行。

## -imacros FILE
本參數和上一個參數幾乎相同,同樣都是在編譯目標程式之前先編譯 FILE ,所不同的是本參數會捨棄 FILE 的輸出,這使得FILE中唯有放置巨集定義才有作用。

## -idirafter DIR
將 DIR 內的路徑加至第二包含路徑中,當在主要包含路徑中找不到標頭檔時便可到第二來尋找,而主要包含路徑便是由 -I 所指定。

## -iprefix PREFIX
設定 PREFIX 之內容為 -iwithprefix 中之 prefix 預設值。

## -iwithprefix DIR
增加一個路徑到第二包含路徑中去,而這個路徑由 DIR 和 -iprefix 中的 PREFIX 之內容聯合組成。

## -iwithprefixbefore DIR
增加一個路徑到主要包含路徑中去,而這個路徑由 DIR 和 -iprefix 中的 PREFIX 之內容聯合組成。

## -nostdinc
不要在標準系統目錄下尋找標頭檔,只在目前目錄和 -I 所指定的目錄下尋找,因此這對於自行建立程式庫有幫助。

## -undef
不要預先定義任何非標準的巨集。相當於取消所有代碼中 #define。

## -E
作用為令 GCC 完成前置處理後便停止。展開程式中的巨集以便了解巨集是否依照預期方式展開,之後輸出到 stdout。
例:gcc -E test1.c > test1.c.ext

## -C
命令前置處理器不要捨棄註解部份,本參數需和 -E 共用。

## -P
命令前置處理器不要產生 #line 命令,本參數需和 -E 共用。

## -M
命令前置處理器輸出給 make 程式用的規則,內容為每個目的檔的依存規則,對於每個 source,前置處理器會將其 target 定為目的檔 (object),而其中所使用到的標頭檔便成為依存檔,有關本參數的最佳參考為 ~/linux下 Makefile 中 depend 這項依存規則的內容;另外一個如本參數功能的方法為設定環境變數 "DEPENDENICS_OUTPUT"。

## -MM
本參數唯一和 -M 不同之處在於輸出的規則中唯有使用者自定標頭檔(#include "FILE" 部份)才會列入,而系統標頭檔(#include 部份)並不會列入。

## -MD
作用如同-M一樣,然而在本參數會將規則輸出到和 .o 檔同檔名的 .d 檔中( -M 要用重新導向的方法),而 Mach utility 中的 "md" 可將各別的 .d 檔集合成可供 make 使用的依存檔。

## -MMD
為 -MM和 -MD功能的交集。

## -H
印出所使用的標頭檔。

## -DMARCO
定義巨集 MARCO 為字串 "1"; 相當於在代碼中加入 #define macro。

## -DMARCO=DEFN
定義巨集 MARCO 為 DEFN;相當於在代碼中加入 #define macro=value。此時所有的 -D 參數將比 -U 參數優先執行。

## -UMARCO
取消 MARCO的定義; 相當於在代碼中加入 #undef macro。此時 -U 還是比 -D 後執行,但卻在 -include 和 -imarcos 之前。

## -dM
命令前置處理器在前置處理完畢後列出所有有效的巨集名稱,本參數需和-E共用。

## -dD
命令前置處理器輸出所有的巨集定義內容。

## -dN
命令前置處理器輸出所有內定之外的巨集定義。

## -trigraphs
支援ANSI C trigraphs,本參數包含於 -ansi。

========
警告參數
警告是在編譯的過程中所發出的建議訊息,警告並非是錯誤,編譯後的程式仍可執行,不過警告的目的為指出某段可能會出錯的宣告方式語法,因此不可因不影響程式執行而掉以輕心;警告參數的目的為對某種語法提出(或抑制)警告訊息,以方便除錯或是順利執行,通常是以 -W 為開頭,這些參數的相反詞為加 no- 所形成,而不管是那種類型,都不是 GCC 的內定值。
========

## -fsyntax-only
只檢查程式之語法有無錯誤而不作編譯。

## -w
抑制所有警告訊息。

## -Wno-import
抑制所有和使用 #import 有關之警告訊息。

## -pedantic
依嚴格的 ANSI C 的標準發出警告訊息,並駁回任使用不允許擴充函數的程式。

## -pedantic-errors
作用如同 -pedantic,但除了警告外還會產生錯誤訊息。

## -W
對下列情況提出警告:
○一個 nonvolatile自動變數將被改成 longjmp 時,這種情況唯有作最佳化時才會發生。
○當一個函數可能有傳回值,也可能不傳回任何值時,例子如下:
foo (a)
{ if (a > 0) return a; }
○沒任何作用的 expression 敘述。
○一個 unsigned 數值和零比較大小時。
○如 'x<=y<=z'的表示式,此表示式 GCC會將其處理成 '(x<=y?1:0)<=z'以便程式能順利執行,當然這樣和原來想表現的意思差蠻多的。
○當 storage-class specifiers 如 'static' 並不是所有宣告中最先執行之時。

## -Wimplicit
當某函數或某參數 implicitly 宣告時提出警告。

## -Wreturn-type
當一函數內定傳回值為 int 時卻作別種型態的宣告便提出警告,或是當一函數無傳回值 (void),然而其中的 return 接一傳回值時便發出對 return 的警告。

## -Wunused
對某一 local 變數自宣告後便沒再使用、declare 一 static 函數後但未先 define、還有一段敘述算出一個結果,這個結果接下來卻未再使用等以上三種情況提出警告。

## -Wswitch
使用一列舉 (enum) 形態的變數為 switch 的 index 時,接下來卻缺少一個或以上的case作配合,或者是 case 的 label 超出了enum 中的選項時,便發出警告訊息,若是沒有必要列出每個 case 時可用default 代替。

## -Wcomment
當 '/* '符號 "又" 出現在註解中時。

## -Wformat
檢查 printf、scanf... 等函數其中第二個以後的參數型態是否和第一個字串中所寫有符合。

## -Wchar-subscripts
當陣列的註標 (subscript) 之型態為 char 時便發出警告,因為在某些主機上 char 為 signed。

## -Wuninitialized
當一自動變數未給予初值便使用時;如下的例子
{
int x;
switch (y)
{
case 1: x = 1;
break;
case 2: x = 4;
break;
case 3: x = 5;
}
foo (x);
}
這個例子看起來沒錯,因為只要 y為 1、 2或 3則 x都會有初值,但 GCC 對於這樣的寫法並不夠聰明到能看出 x 會有初值這件事,因此對 foo(x) 而言其中的 x 就出問題了,然而當未使用最佳化編譯時並不會有本警告出現。

## -Wparentheses
當 parentheses 在以下這些敘述中省略時:當預期將為 true value 卻有 assignment 時,或是有令人頭昏眼花的 nest operators 時。

## -Wenum-clash
當兩個不同的 enum 型態作轉換時。(C++ only)

## -Wtemplate-debugging
若是在程式中使用了模版 (template) 但除錯功能未完全支援時。(C++ only)

## -Wall
本參數為以上所有 -W 參數的總集,且本參數為最推薦使用者,因為以上的情況便包含了一般情況下該警告的事項。

接下來的這些參數並不包含於 -Wall之中,這些參數所要警告的為一些結構上的問題。

## -Wtraditional
對傳統和 ANSI C 的一些結構上的差異提出警告:
○ switch 的 operand 型態為 long。
○函數在 block 中宣告為外部(external)而後在 block 結束後使用。
○巨集的參數是位於巨集本體的字串內容中,這種情況對傳統 C 是允許的,但對 ANSI C 會有不相容發生。

## -Wshadow
當一區域變數 shadow 另一區域變數時。

## -Wid-clash-LEN
當兩個以上的辨別字 (identifier) 在開頭和 LEN 相同時。

## -Wpointer-arith
當使用 size of 在函數時。

## -Werror
Make all warnings into errors.
將所有警告轉換成錯誤,這會讓編連停止。

參考文件:http://jyhshin.pixnet.net/blog/post/26588012

http://www.cmlab.csie.ntu.edu.tw/~daniel/linux/cman/gcc.html
http://gcc.gnu.org/onlinedocs/

2009年11月14日 星期六

[心得] 博士術後第二天

其實很早就想做雷射了
因為是高度近視 眼鏡一直是我鼻子上的負擔
即使眼鏡已經配很好了 還是很容易因為眼鏡的重量造成頭痛

上上週五和上週三做完檢查後 就約了昨天下午兩點
說實在剛開始去的時候覺得自己都做好心理建設了 不太緊張

可是等啊等啊 等了一兩個小時候 才被叫進去聽丁醫師做術前教育
丁醫師說話又很.... 嗯 不知道怎麼形容
總之整個被弄得緊張起來了 哈哈

不過進去手術室之後也躺蠻久的 讓我又恢復平靜
一開始是一圈很亮 閃到你會瞎的白光的機器
基本上專心的中間的黑洞就好了

之後又躺了一會兒 換到看紅光的機器
在紅光的機器上 醫生先替我裝上撐眼器 然後再打深層麻醉
打麻醉針那種感覺.... 很像睫毛插進眼睛那樣 痛痛的 但也還好可忍耐

打完等幾分鐘後就開始做雷射 做的時候紅光會時大時小
所以要很專心的看著它

我近視較深 所以雷射好像40秒吧
中間除了聽到機器啪啪啪和一點燒東西的味道
基本上沒啥感覺

不過雷射完 眼皮開始被撐到有點痛
後來到蓋回角膜到休息室眼睛都一直蠻不舒服的 有點像眼睛裡面有沙子那樣的刺痛
輕輕閉上不要亂動的話算還ok 不會說痛到你一直想動來動去

回家後就照指示點眼藥水 然後閉眼休息
這個時候我是建議放個音樂來聽 不然很無聊
因為必須閉著眼睛然後又痛到睡不著

今天早上起來自己測一下視力 已經都有0.8了
不過還不是那麼穩定 我每隔幾個小時再測一次 有時候會0.7 有時候有1.0

到了今天,大部分不舒服的感覺大部分都消退了,剩下的狀況大概是
1. 怕光(一直戴著太陽眼鏡就還好)
2. 點人工淚液或眼藥水的時候會刺痛
3. 我的右眼右半部整個是鮮紅色的.....(不誇張 我早上看鏡子還嚇到)

如果第三點不能恢復我應該還是一直戴著太陽眼鏡吧XD
希望這些狀況能趕快恢復囉

ps.
真的蠻感謝Laser_eye板友們的分享讓我有勇氣去做
另外丁醫師的技術和服務態度也好到沒話說 只是說話有點....該說直嗎
總之如果他說什麼不好聽的 你自動忽略就好了 不要太在意XDD

2009年11月9日 星期一

[開箱+心得] Microsoft Wireless Mobile Mouse 6000 vs Logitech VX Nano

話說我以前是個三百塊滑鼠可以用兩年的人,
自從來鍵鼠板光顧之後,半年就花了將近三千塊在滑鼠上
而且這種程度應該還算中毒淺的吧XD

由於最近開始滑鼠使用頻率升高,開始覺得手腕有點不舒服
主要是那隻三百塊的滑鼠dpi似乎過低,
指標移動速度調最大還是要拉很遠,
而且又常常被線卡住,常常必須得把滑鼠舉起來再拉第二次
終於忍不住去敗滑鼠

這次下手的是 MS 6000,至於 VX Nano 是前一陣子買來送人的,
想說就把兩支拿來做個比較

先介紹之前買的 Logitech VX Nano
(這裡沒有開箱,因為箱子已經不知道跑去哪了)

首先我覺得有附保護袋真是非常貼心


保護袋的另外一邊,那個橘色不知道有什麼作用,
不過遠看的時候黑中一點橘,多少增添了一份質感


滑鼠本身


滑鼠背面,那個畫有電池的是電池蓋的推桿,一推電池蓋就會彈開,非常方便


電池蓋打開,裡面是兩顆四號電池 + 接收器收納空間,紅色按鈕按下去接收器就會彈起來


接下來貼 MS 6000 的圖,先看外觀,等下再寫兩者的比較。

昨天剛買,所以有開箱


拆開的過程就大同小異(非常暴力,還是不要拍照留下我對他家暴的證據XD)
直接看內容,說明書、光碟有的沒的,那個接收器因為我看 Nano 習慣了,所以沒啥感覺


說實在的,他並不適合入鏡,身上鏡面太閃讓我糊調好幾張相片


背面照


開個藍光,他的藍光發光點漫裡面的



側面照


呼,傳圖有點累....
其實網路上很多拍的更好的照片,我想以我這麼糟的照相技術來說沒必要貼太多圖

接下來就來講講兩者的比較
以下用6000和nano代表 Microsoft Wireless Mobile Mouse 6000 、 Logitech VX Nano

首先,看外觀
6000的鏡面很容易有指紋,摸起來會油油的,另外他側邊的橡膠,感覺是很容易變黏的那種
nano相較之下外觀我是比較喜歡,主要是他旁邊的橡膠摸起來比較有質感,按鍵部分的霧面觸感也較好

另外就是nano有附保護袋,以搭配筆電來說,這個小舉動帶來非常大的便利性
尤其是那6000的鏡面外觀感覺隨便亂放在包包裡很容易全身刮痕

背面的比較上
nano的電池蓋是用推桿推開會自動彈出來
6000則是比較一般的電池蓋

nano的接收器收納處在電池蓋裡面,6000則是在外面,
兩者的接收器都是按鈕彈跳式的取出方式,很好拿

另外不得不提的就是,雖然兩者背面都有手動開關
但是nano在接收器收納進去會自動關閉電源,
6000則不會,我是覺得非常可惜,明明就是很簡單一個功能卻沒有做

6000吃一顆三號電池,nano吃兩顆四號
拿起來我個人覺得6000會略重一些,這個輕重可能就看個人喜好
我個人是喜歡輕巧一些的

接下來談他們所附的軟體,
我之前就有看人分享過說微軟滑鼠附的非常沒有誠意
那時候我還不太懂沒有誠意的意思
等我裝完之後,我瞬間明白了
微軟附的滑鼠軟體,
就只是在原本OS的滑鼠設定那邊多加了幾個東西而已....

因為我通常用不同滑鼠第一件事情就是會去調指標移動速度
結果他只是用作業系統裡面的那個而已,並沒有自己再多做一個XD

最後講一個比較重要的,精準度
再這裡我順便想問一個我長久以來的疑惑,
羅技的指標加速設定和微軟作業系統裡的增強指標的準確性設定,
到底各式什麼樣的機制?

nano這支我如果把指標移動速度調高,不勾增強指標的準確性,
會常常點不到我要的東西,不知道是不是我辦公桌有點光華的關係
有時候會飄,指標加速的話開低是還好,中高我就常常點不太到東西

6000相較來說,不太需要勾增強指標的準確性這項,
我覺得精準度相對上是比較高(在我辦公桌上實驗是如此)

6000我只要把指標移動速度調到最快,不勾增強指標的準確性
我就覺得很好用了
nano的話就必須多花一點時間調整,才會感覺比較順手
不過相對來說nano選項是比較多
因為他自己的軟體也有指標移動速度和指標加速
OS裡面又有指標移動速度和增強指標的準確性

整體比較的話,我覺得是兩種孑然不同的感覺
也不是說哪一支就比較好,畢竟價格也不一樣,我買的時間點也不太一樣
而且nano的後繼者也已經出來了 - Anywhere

不過兩支對我來說都已經是很不錯的滑鼠了
謝謝收看!

[開箱] TOUGH MR2

之前用的皮夾壞掉了,想說去西門町逛逛找尋適合的皮夾
突然看到一個我很喜歡的類型 TOUGH中間有可分離零錢袋的系列
問了一下價格 什麼!28xx!

皮夾價值比皮夾裡面現金還多絕對不是我的風格....
所以就放棄了

回家上網找了一下,發現有不少一張小朋友以內的TOUGH

最後挑了這款 MR2
為什麼呢?我想先看照片比較容易解釋這個問題

盒子


盒子高度


拿出來,嗯,很普通嘛!


打開來,也很普通....


上面有放鈔票的夾層和一個放零錢的大拉鍊層


拉鍊打開還漫大的


最後一張,尾巴照


整體外觀來說中規中矩,
除了裡面有一個放SD卡的地方是和其他品牌較為不同的部分

另外大拉鍊的零錢袋是還漫好拉的,只是有一個缺點
就是零錢會在裡面跑來跑去,
有時候剛好在中間的時候你皮夾可能闔不起來,要喬一下
(有人懂我在說什麼嗎....)

好,結束!

要是這樣結束的話,會被噓到爆吧....XD
沒什麼特色的東西也敢拿出來

既然是特地拿出來分享,當然有他不一樣的地方囉!
還記得他的正面嗎

其實這裡是暗藏玄機的,鈕扣打開有片東西可以拿下來


嗯,這是什麼?


整個把他拿出來(有點像皮包裡面藏暗器的感覺)


對照一下說明書


1. 可以凹折金屬線的洞
2. 開瓶器
3. 尺
4. 六角螺絲起子
5. 平口螺絲起子
6. 小鋸子
7. 小刀子
8. 開罐器
9. 我看不太懂....反射器?怎麼用?

另外照一下其他附件

說明書 + 商標卡 + 皮製的大Logo卡


其中大Logo卡背面有可以放記憶卡 sim卡之類的空間


買這個皮夾主要就是看上他有附暗器可以隨時殺人於無形(誤)
感謝收看!

2009年11月4日 星期三

[開箱] G-SHOCK GW-9200MBJ


以前曾經有一陣子非常喜歡金屬錶,覺得配戴起來閃閃亮亮的很炫,
不過當需要長時間在辦公室敲電腦之後,突然發現錶的重量真的是不小的負擔

前一陣子還發生邊走路邊戴錶(那時要從辦公室走出去吃午餐)
結果手錶不小心滑落,而且好死不死就這麼剛剛好掉在電梯縫裡面,
(沒錯,就是這麼剛好,同電梯的全部一起驚呼)
這一掉就是7樓掉到B3,雖然有拿回來,但想也知道結果只是幫他收屍而已 Orz

於是開始計畫要買新的表,網路上看了好幾天,
終於決定要買電子錶(重量輕功能又不少),
最後終於看上這款太陽能電波時計而且可以測溫度、高度、氣壓的卡西歐
(小弟平常假日會去爬山)

主要看上他62g且功能剛好符合我需求,決定之後,便前往板上推的兩大名店,
其中一家跟我說幫我調調看,但是要多久不知道,
另一家店在不知道打了多久的電話(不知道是問廠商還是其他店家?),
給我的答案竟然是,這是日本限定版,台灣買不到....

失望之餘,回家繼續翻網路購物和拍賣,終於找到有兩家有在賣的
雖然價格是偏高,不過有現貨,
而且還可以十二期免息分期(不過就幾千塊還分十二期XD),
加上我又很想要所以就敗了....

昨天終於收到了,於是拍了幾張照片(桌子很亂抱歉....)

左邊是紙盒,右邊是鐵盒子


打開後裡面包裝的還算穩固


這是還沒拆下保護膜的樣子(因為很難拍到畫面,所以亮度調的很暗)


好啦,幫你拍幾張帥一點的照片(認真)




最後來發表一下心得,整體帶起來重量還蠻輕的,
功能很多,除了剛剛提到的測量功能之外,
還有一個光線不夠時看錶他會自動冷光的功能(auto el),
我覺得漫實用的,

溫度、壓力和高度的測量方面,畢竟我也不是專業的,所以準不準我也看不出來,不過看起來似乎滿正常的
這隻錶是我有生以來買過最貴的錶,雖然跟板上的其他牌子相比,卡西歐只是入門款吧....

不過我有點衝動,再多等一點時間可能就可以更低價買到....
日本卡西歐官網是九月初的款,可是台灣卡西歐網站竟然在我訂了之後沒多久就有資料
(我星期一去某名店他就是當場翻給我看台灣卡西歐網站查不到,就跟我說這代表台灣沒進貨)

心得分享至此,感謝收看!

2009年10月22日 星期四

物件導向:封裝、繼承、多型

最近身邊很多人在找工作,漫多公司會有考試以及口試中會有技術問答的部分。
以不碰硬體的軟體工程師來說,技術問題我簡略的分成兩類:

偏硬的公司,比較會問記憶體位址相關的問題,如指標、參考等這些一般人比較容易搞不清楚的觀念。
偏軟的公司,比較會問物件導向相關的問題,如物件導向的優點、特性、以及實務上的一些問題。
當然除此之外一些共通的部分像是作業系統或計算機架構,這就看平常在學校有沒有好好學。

我為什麼把問題分成漲兩類呢?因為我發現身旁漫多人可能因為本身習慣的關係,兩種觀念比較無法同時記住。
通常平常很會用指標、參考的人,很可能會對物件導向比較不熟,例如c習慣使用者。
而平常慣用 oop language 的朋友,如 java、c#,則對指標參考等的觀念記憶稍微薄弱一些。

之前有寫過指標類的介紹了,不過似乎有點簡略,之後有空再補完。

今天介紹一下物件導向一些基本概念,這些同時也是找工作筆試面試常會遇到的一些問題。


封裝
我之前都是寫 c# 居多,即使如此,當面試時公司主管問我:物件導向為什麼要封裝?我卻回答的零零落落。
因為平常用的太習慣了,覺得封裝已經是在自然不過的事情,哪需要理由?
基本上這種問題你只要提到 keyword 就好了:
Information hiding, 避免程式各個物件互相干擾,降低程式的複雜度及維護上的困難度。

繼承
繼承的目的:一語概之就是為了 reuse。

多型
多型與超載 (Overloading)與重寫 (Overriding)相關,和上面的繼承更是息息相關。
一個物件如果你看待的方式不同,就可以發揮不同的功用。
這在現實生活中很合理,一個碗可以拿來當容器,也可以拿來盛土種花,當然要倒過來當蓋子也行,甚至,你要拿來砸碎當發聲的樂器也不犯法。
因此同一個物件,在不同的場合,不同的使用情境,就應該合理運作展現應有的效果,這也就是多型的精神。

參考資料:
http://www.ithome.com.tw/itadm/article.php?c=45903
http://140.134.26.7/wbemwiki/index.php/%E7%AC%AC%E4%B8%89%E7%AB%A0_%E7%89%A9%E4%BB%B6%E5%B0%8E%E5%90%91%E8%A8%AD%E8%A8%88

音樂術語

常見的速度術語:
Largo 最緩板 速度♩= 40~60
Larghetto 甚緩板 速度♩= 60~66
Adagio 慢板 速度♩= 66~76
Andante 行板 速度♩= 76~108
Moderato 中板 速度♩=108~120
Allegro 快板 速度♩= 120~168
Presto 急板 速度♩= 168~200
Prestissimo 最急板 速度♩= 200~208

速度漸慢 :
Allargando (allarg.)
Rallentando (rall.)
Ritardando (rit.)

速度漸快:
Accelerando (accel.)

速度還原:(回到正常的速度)
A tempo
Tempo primo

速度任意:(隨意,由演奏者或指揮者自定)
Ad libitum (ad lib.)
Tempo rubato

常見的力度術語:
Pianisissimo (ppp) 最弱
Pianissimo (pp) 甚弱
Piano (p) 弱
Mezzo piano (mp) 中弱
Mezzo forte (mf) 中強
Forte (f) 強
Fortissimo (ff) 甚強
Fortisissimo (fff) 最強

補充:fp 強後立即轉弱 sf.、sfz.、rf.、rfz.、rinf.皆為突強

漸強:
Crescendo (cresc.)

漸弱:
Decrescendo (decresc.)
Diminuendo (dim.)

拿Google Reader看PTT

1.
到 http://www.google.com/reader 登入


2.
左上角有個新增訂閱 按下去
填入你要看的看板
格式是 rss.ptt.cc/看板名稱.xml
例如笨版 就打 rss.ptt.cc/StupidClown.xml
注意大小寫要完全一樣


3.
完成 上班可以逛PTT了= =+



參考資料:http://ipluto.wordpress.com/2009/07/31/%E6%8B%BFgoogle-reader%E7%9C%8Bptt/

2009年10月21日 星期三

C++ 簡易速查

Virtual Function
虛擬函數


虛擬函數會以關鍵字 virtual 為首宣告在基底類別。用途為供其衍生類別各自實作所需的同名成員函數。

ex.

class MyClassVF {
public:
virtual int myfunc ()
{ return 0; }
};


Pure Virtual Function
單純虛擬函數


為虛擬函數的一種,其宣告方式為 virtual return_type function_declaration (parameter) = 0;

ex.

class MyClassPVF {
public:
virtual int myfunc (void) = 0;
};


Abstract Class
抽象類別


含有虛擬函數宣告的類別即為抽象類別,所以上述面舉的兩個例子中的 MyClassVF、MyClassPVF 都是。

Boxing and Unboxing
裝箱、拆箱


Boxing 將實值類別轉換成 object 類別。
Unboxing 將 object 類別轉換成實值類別。
參考資料:http://msdn.microsoft.com/zh-tw/library/yz2be5wk.aspx

ex.

int i = 123; // a value type
object o = i; // boxing
int j = (int)o; // unboxing


Tracking Handles
追蹤處理


Tracking Handle 有點像是指標,其內容也是存一個位址。
宣告方式為 type^ variable_name;
不過和指標不一樣的是,他的位址是由垃圾回收者自動更新。
換句話說,手動調整 Tracking Handle 的位址是不被允許的。
還有,和指標一樣,在宣告 Tracking Handle 時,他是不指向任何位址的。
因此,任何的參考前都必須先作指定初始位址的動作。

ex.

String^ sentence;
sentence = nullptr; // set handle to null
sentence = "This is a sentence.";

int^ value = 0; // initialization
*value = 100;


L"...."

將 "..." 轉換為 unicode。

stdafx.h

參考文件:http://zhidao.baidu.com/question/3711602.html

Using Enumerators as Flags

一個很實用的技巧,不過只有在 C++/CLI 底下才能用。ANSI C++ 並不支援。
參考資料:Beginning Visual C++ 2008[Ivor Horton]

ex.

[Flags] enum class FlagBits{ Ready = 1, ReadMode = 2, WriteMode = 4, EOF = 8, Disabled = 16};
FlagBits status = FlagBits::Ready | FlagBits::ReadMode | FlagBits::EOF;
Console::WriteLine(L”Current status: {0}”, status);


output:
Current status: Ready, ReadMode, EOF

2009年10月19日 星期一

winsck example

底下是一個簡單的winsck範例
之前雖然在linux上寫過不過為了測試這個也是花了不少時間
環境:win xp, visual studio express
基本上寫程式這種東西....幾個簡單的東西try通之後,靠的就是想像力和組織能力啦

雖說萬事起頭難,不過東拼西湊完之後的測試,花的時間也是不容小覷


#include
#include
#include
#include

#pragma comment(lib, "Wsock32.lib")

#define MAXLINE 1024


int main() {
SOCKET recv_sd, send_sd;
int cli_len, n, sendtoRet, bindRet, errno;
char str[MAXLINE];

struct sockaddr_in recv_addr, send_addr;

WSADATA wsadata;

if (WSAStartup(0x101, (LPWSADATA) &wsadata) != 0) {
fprintf(stderr, "echo_serv: can't use WinSock DLL\n");
exit(1);
}

if ( (recv_sd = socket(AF_INET, SOCK_RAW, 0)) == SOCKET_ERROR) {
fprintf(stderr, "echo_serv: can't open TCP socket\n");
exit(1);
}

if ( (send_sd = socket(AF_INET, SOCK_DGRAM, 0)) == SOCKET_ERROR) {
fprintf(stderr, "echo_serv: can't open UCP socket\n");
exit(1);
}

// set dst address to broadcast
memset(&send_addr, 0, sizeof send_addr);
send_addr.sin_family = AF_INET;
send_addr.sin_port = 1000;
bindRet = bind(send_sd, (struct sockaddr *)&send_addr, sizeof send_addr);

setsockopt( send_sd, SOL_SOCKET, SO_BROADCAST, "TRUE", 4 );

memset(&send_addr, 0, sizeof send_addr);
send_addr.sin_family = AF_INET;
send_addr.sin_port = 68;
send_addr.sin_addr.s_addr = inet_addr("255.255.255.255");

strcpy_s(str, 12, "Hello World");
//while(1)
sendtoRet = sendto(send_sd, str, 12, 0, (struct sockaddr *)&send_addr, sizeof send_addr);

printf("%d", WSAGetLastError());

closesocket(recv_sd);
closesocket(send_sd);

return 0;
}

2009年8月30日 星期日

C語言 指標(pointer)

每次一陣子沒用之後突然需要用到,總會忘記怎麼使用。


int x, *ip;
ip = &x;
x=10;


這時候如果把一些我們關心的值印出來,很快就可以釐清其中的關係


x = 10;
x = ox1001;

ip = ox1001;
*ip = 10;


舉個容易讓我困惑的例子:


int x = 10;
int *ip = &x;


第二行如果理解成


int *ip;
ip = &x;


就比較容易懂了

簡單的總結

int *ip;

ip是一個指向int的pointer,印出來會是位址
*ip則是被ip指向的int,印出來會是該位址的值

不過*ip = 10;這種直接操作該位址的值的方式是不被允許的

你可以這麼想,

int *ip = &x;

*ip其實就是*(&x),也就是x啦

2009年4月15日 星期三

Lex & Yacc

事實上網路上資料很多了,我這裡就不再次詳細說明
如果好好活用的話對於一些文件自動化分析是非常有幫助的
(可是前提是你要分析的文件必須具有Well Structure的特性....)

上次寫約莫也是將近五年前的事情了,好在還有點印象,很快就上手

http://ijdlt.nctu.edu.tw/cp09/index.php?option=com_content&task=view&id=18&Itemid=1

今天將由我負責向學弟妹們報告Lex和Yacc的用法,真是怕誤人子弟阿
裡面也舉了兩個簡單的例子
盡量用淺顯易懂的方式讓大家了解

希望今天報告可以順利幫助學弟妹們釐清觀念

2009年4月12日 星期日

行動商務作業 J2ME 萬年曆




這次作業一是要做一個萬年曆,完成了順手把他po上來

記得上次動手做萬年曆已經是六年前的事情了,那時候是大一修程式語言的時候用Pascal寫的
Pascal可以用的Resource相對於Java是少了很多,因此當時幾乎什麼都要自己寫

相對之下,用Java裡的Calendar API可以少掉一些對於日期上的計算
以前修Java課的時候也有用過Calendar這個抽象類別,所以本來以為很快就會搞定這個部分

不過寫完一個Java版本的時間計算的class後才發現,
J2me裡面的Calendar和Java中所定義的不太一樣
有些東西被精簡掉了,於是只好再寫一個J2me的版本

完成Calendar邏輯的部分,才知道原來UI的設計才是這個作業的困難之處!
原本以為table這種基本的UI應該是隨便new一下就有的東西
沒想到J2me的High-level UI這麼簡陋,雖然可以用StringItem排列達到相同的UI效果,
不過KeyPress Event的接收卻是個問題
中間試過很多方法,也發現很多好玩且可行的方法,
不過最後還是決定先自己用Canvas自己畫一個了,
順便熟悉一下Canvas這個Low-level UI,之後如果要設J2me Game才不會手忙腳亂

基於Open Source精神,此程式以GPL的形式發佈。

CalendarCanvas.java
CalendarWidget.java
Note.java

底下是Demo影片(臨時找不到錄影軟體,因而用未註冊的freeware,有未註冊字樣請見諒)
我簡單的操作一下它的新增和刪除的紀錄備忘功能
以及它可以跨月跨年任意跳躍時間的萬年曆功能



目前的版本已經完成的Features:

  • 萬年曆功能
  • 備忘新增和刪除功能
  • 動態計算長寬和網格大小,換成不同的螢幕大小程式不用重寫(參照最上面附圖)
  • 可以在Nokia S60或Sun WTK的模擬器上運行(後來發現MIDlet要能在S60上跑寫法要夠嚴謹)
  • 使用RMS當做資料儲存媒介,關機不會遺失內容
之後預計要做的Enhancements,標示Advanced是比較進階且難度高的:

  • 使用Third Party UI Library - 可以做出較為進階的特效或者和使用者主題結合
  • 增加跳躍日期功能 - 直接跳到指定日期
  • 增加週檢視 - 更精確的時間事件表,以兩小時為單位
  • 增加不同類別 - 不同欄位設計、不同圖示(Advanced)
  • 增加使用者自定類別功能(Advanced)

2009年4月8日 星期三

變數命名法則

Java命名慣例

套件
有點類似將網址倒過來的感覺,從大到小描述可能是一個登入名稱,部門,計畫,機器等等
範例 edu.nctu.cs.kdelab.justmaker

類別 介面
應該是名詞,由每個內部單字開頭字母皆為大寫的混和字組成。
範例 ArrayCalendar

方法
應該為動詞,混和第一個字母小寫和內部單字的第一個字母大寫的狀況。
範例 getMonth()

變數
混和第一個字母小寫和內部單字的第一個字母大寫的狀況。

常數
應該是以("_") 底線分隔的全大寫字。
範例 static final int Month_Of_Year= 12;

匈牙利命名法

在匈牙利命名法中,類型名在實際變數名前。
變數名稱 = 屬性+類型+描述

屬性
g_ 全域變數
c_ 常數
m_ 成員變數

類型
n int
l long
c char
b boolean
p pointer

描述
Custom 自訂
Src 來源
Dst 目的
Tmp 暫時

範例
g_nTmpCounter

Java Calendar的使用方法

以前大學修課Java的時候就曾經要用這個class
不過當時對於debug的能力和理解力比較弱

現在又遇到,花了一點時間弄懂這個class的使用方式
這裡紀錄幾個簡單的用法

http://java.sun.com/j2se/1.4.2/docs/api/java/util/Calendar.html

Calendar calendar = Calendar.getInstance();
// 取得一個calendar的Instance
// 預設會是系統的時間

calendar.set(int field, int value);
// 這個method可以讓你設定calendar的某一field為指定的value
// 舉例來說 calendar.set(Calendar.DATE, 1);
// 就是將calendar日期指定為1
// field的種類可以在api裡面都可以查到

calendar.get(int field, int value);
// 這個method可以讓你取得calendar的某一field的value
// 舉例來說 calendar.get(Calendar.DAY_OF_WEEK);
// 可以取得現在calendar的時間是一周裡面的哪一天
// 不過這裡要注意的是,星期天會回傳為1,為一周裡的第一天,星期一會回傳2,依此類推

這幾個方法會用就差不多了