2010年12月26日 星期日

如何恢復bat檔案的關聯性

有時候,在編輯器可以設定哪一些副檔名要由這一個編輯器預設開啟。

但是,像是bat檔案,就不要設定由預設編輯器開啟,因為,這樣就沒有辦法執行一般的bat檔。

開啟→執行
用使用者權限輸入CMD
再輸入assoc.bat=batfile
再按Enter就可以恢復預設值了

參考資料:
如何恢复bat文件关联为默认形式打开?

2010年12月14日 星期二

[轉錄] 阿基師,我的人生像一碗酸辣湯

<曾經為了荷包蛋老是煎不好,一個晚上吃掉十幾個蛋>

網友「江江」 問:什麼時候開始學料理?學料理途中,遇到挫折會有想放棄的念頭嗎?如果沒做廚師的話想做什麼呢?阿基師: 我不做廚師應該會一事無成吧!我性子很急,也不適合開計程車。我會選擇廚師這一行是因為我沒有讀書,加上父親當過五月花酒家的大廚,以前家裡開小吃麵店,我就很喜歡站在廚房看爸媽炒菜。

開小吃店很累,下午兩點到五點之間父親習慣午睡,這時段偶爾會有客人來點個湯麵、炒飯、糖醋排骨等,因為捨不得把爸爸叫起來煮給客人吃,我就會跑進廚房站在板凳上模仿父親的做法開始炒菜。

吃完了客人會跟媽媽說這小孩的功夫不輸你老公喔,成就感就在這裡開始萌芽,所以我在11、12歲的時候就發現自己適合走廚師這一條路。

每當我煮飯的時候,就會感到全身精神都來了,那是一種莫名其妙的喜歡。我曾經為了荷包蛋老是煎不好,一個晚上吃掉十幾個蛋,煎不好照樣吃掉不然浪費,就算吃到不想吃了,還是一定要把蛋煎好。

選工作要選擇自己有熱情的,有熱情就會主動,主動去做就會有想法,有想法就會不斷激發出新的創意。

儘管有時候炒菜會燙到、切得雙手血淋淋的,但是因為我有熱情,手多痛都沒關係,心裡只想著如何不斷的去延續工作生命。

<不要只看到我的光環,在人前露臉就要在背後受罪>

網友「冰塊」問:每次看到阿基師炒菜,用心專注的在每個步驟上面,我就覺得台灣還是有希望的@@請問阿基師,你對於現代社會人,有沒有什麼可以加強 用心 的好建議?阿基師:人生的學問只有「用心」兩個字,學問就是「想學就要問」,像電視錄影啦、公播權的問題啦、怎麼訂合約啦,當廚師怎麼可能知道這些?都是我去用心去問、用心觀察出來的。

老祖宗有句話講得好,「不禁一番寒澈骨,焉得梅花撲鼻香」,我只希望每一個網友都能很踏實的去做,天底下沒有白吃的午餐,在人前露臉就要在背後受罪。

我能成功是因為老師傅很笨,因為老師傅笨又懶惰,他懶得做的我都撿來做,才讓我這種勤快又機靈的小孩有機可趁。

或許現在新新人類網友會覺得這些話老掉牙,但是它是很真實的,不要只看到我阿基師的光環,要去了解阿基師也很努力才有今天的。

<人生再怎麼絕望,也不可以開車往海裡衝!>

網友「勤安」問:您的為人、處事態度大家都讚賞有佳,我想請問您,您是如何面對自己低潮,或者是假使有天您不幸陷入低潮了,那您會如何面對及如何的重新再站起來,謝謝。阿基師: 我知道現在很多年輕人在廚房工作,一個月只有兩、三萬塊,就覺得人生看不到未來。年紀輕輕就說看不到未來很悲哀,人生不要太早下定論比較好。

我老婆嫁給我的時候很風光,那時我有兩棟房子還開了餐廳,又兼任一家飯店的主廚,夠有未來吧!

可是我碰到家道中落,媽媽給人家作保賠了七百多萬,一夕之間債主都找上門,父親無力償還,沒交代清楚就突然病逝了,媽媽也因此中風。我本來幸福美滿的生活突然變調,還差一點離婚。

我是家中長子,所以一肩扛起債務問題。當時,我一天接四份工作,早上到餐廳上班,空班時間到企業門口賣玩具,賣完玩具回來以後再上班,晚上九點下班後跑去地下酒家做火鍋和幾個小菜,凌晨一點鐘打烊後再跑去萬大路的魚貨市場幫忙搬箱子,一箱50塊、80塊這樣賺,一個晚上賺個幾百塊,快要白天了才全身髒兮兮地踩著腳踏車回家。

因為魚腥味太重了,回家也不敢睡太太旁邊,簡單沖洗後就躺在大廳的地板上一覺到天亮,8、9點再進餐廳繼續工作。

為了還債,我把自己的2棟房子給賣了,我太太就不高興,我就跟太太說這只是暫時的委屈請妳忍一忍,結果半夜她生悶氣一個人喝掉半瓶威士忌,我還幽默地說,當時結婚在敬酒時怎麼沒發現妳這麼會喝啊~那一晚我們兩個在床上抱著痛哭。

早上時發現太太又不見了,不知道又跑去哪,結果她去外面買早點回來給我吃。

然後跟我說,下午空班時去幫她拿點東西回來,原來她找了報紙,要做家庭代工一起幫忙還債。天呀!多感性呀!

像這種從有到沒有的經歷,就像現在社會版會報的新聞,遇到不如意,就開著車子衝入海邊,或是在房間裡面燒炭,這樣都不對嘛。

人最怕的就是沒有責任感!我也是從什麼都有突然失去一切,再從什麼都沒有一點一點賺回來的,人世間有太多無常了,活著為的就是一份責任,要懂得將它承擔起來。

<做菜可以偷呷步,但是做人和吃苦都不能偷呷步>

網友「港男」 問:從燒菜中是否有體悟一些道理是可以用在人生中的呢?阿基師: 做菜可以偷吃步,但是做人和吃苦都不能偷吃步,做人不是要做給長官和長輩看的,是自己要負責的。

我曾到基隆某個高工演講,我跟學生們說「不要抱著六十分哲學,可以做到九十分就要做到九十分」。

人難免會犯錯,如果把自己的分數拉高,偶爾犯錯了人家會願意再給機會。如果習慣只做六十分,不小心犯一個錯就變成不及格了!而且如果我有生意,我寧可交給想做九十分的人,不會交給只想做六十分的人。

不必埋怨沒有機會,應該要問自己做了哪些準備等待機會來敲門。所以說年輕朋友們光拿到博士、碩士學位是不夠的,有一個笑話說:「讀到博士,你會跌死;讀到碩士,你會摔死;你要跌死還是摔死(台語)」。

務實又用心的工作經驗最重要,因為你可以從中領略做事的方法和做人的竅門。

<我的人生是酸辣湯>

網友「追」 問:您不只料理成功,感覺上待人處世也很成功,想請問您待人處世最大的原則是什麼?阿基師: 我的人生是酸辣湯,酸甜苦辣通通都在裡面,是酸辣湯不是糖醋魚喔!糖醋魚有帶甜,酸辣湯是酸、辣、鹹五味雜陳,辣過頭會有苦,白胡椒加太多也會苦。

如果把酸辣湯調和出很和諧的口味,端出來賞心悅目又很美味。

我常常跟我太太分享一句話,賺很多錢是生辰八字好,不希罕,能守得住錢才厲害。

我這幾年有機會上電視出書,確實賺了很多錢,我還是省吃儉用、騎摩托車趕通告,一個月只花兩三千塊,人要懂得不要被物質誘惑影響。

待人的部分,我常常勸人要結善緣,生氣1分鐘會失去60秒的幸福。

現在人家發脾氣的時候,我不會跟著發脾氣,我會看著人家發脾氣醜陋的樣子,想想自己發脾氣是不是也一樣醜陋,脾氣就會收斂了。

一個社會是佛與魔共有的,沒有魔哪裡來的佛呢?結善緣是最好的撇步,我到哪演講都勸人要有善心,人有百百種,我們可以選擇從佛不要從魔,很自然人間就是一面淨土。

2010年11月28日 星期日

SoftEther設定教學

在大陸出差通常會遇到一個問題,那就是有一些網路被擋掉~
這個時候,通常會使用到網路無國界的軟體~

但是,我們並不知道這一些封包如何被對方使用,所以,最好還是自己來架一個VPN比較安全。

2004年左右,在日本有一位大學生研發了一個虛擬軟體,它可以虛擬一個網卡,而這一張虛擬網卡可以連到某一台電腦(Server),而這一台電腦(Server端)的網路並沒有被限制,這個時候,我們就會把封包傳送到這一個虛擬網卡,而虛擬網卡再把資料送到Server端,並且由Server端把要求送出去。

如此一來,我們上網也不會有所限制了。

但是,在當時,日本有提供一個Server當作一個預設的Hub,讓所有的使用者可以連到這一個Server並且再連出去,但是,現在那一個Server已經停用了。所以,我們必需自己建立一個Server。

在設定User的設定時,請按照下面的設定
Virtual HUB ID : 0
You can set user's Security Option. Enter Y or 1 to enable option. Enter N or 0 to disable option.
Press only Enter key to no change. Deny Connect (Off) :0
Disable Session Reconnect (Off) :0
Force to use IP Addess allocated by DHCP Server (Off) :0
Limit to 1 IP Address to use. (Off) :0
Limit to 1 MAC Address to use. (Off) :0
Do not use existing IP Address (Off) :1
Do not use existing MAC Address (Off) :1
Do not send Broadcast Packet (Off) :0
Do not send DHCP ACK Packet (Off) :1
Filter ALL DHCP Packets (Off) :1


詳細的設定以後有空再寫,先參照以下的參考資料吧~

參考資料:
SoftEther 安裝與設定。Virtual HUB & Virtual Lan,Server 端 & Clinet端
SoftEther Server端與Client端之設定
SoftEther - 好用的虛擬HUB
Softether 英文版下載 | 連線教學

2010年11月7日 星期日

BAT大補帖 - 測驗 (07)

下面兩個指令,請直接在指令列上練習~~
ECHO Hello World!!>file.txt
Hello World!!存到file.txt中;若檔案不存在,則會產生這一個file.txt檔案;若檔案已經存在,則把這一個檔案的內容清除。並且把Hello World!!存到檔案中

ECHO Hello BAT!!>>file2.txt
Hello World!!存到file2.txt中;若檔案不存在,則會產生這一個file2.txt檔案;若檔案已經存在,則在這一個檔案的內容最後加入Hello BAT!!

========== 測驗開始 ==========

1. 印出目前所在資料夾的名稱,例如,目前在C:\windows\newfile,則印出newfile
提示: GOTO, ECHO, FOR, %CD%

解答:
exercise_a.bat

@ECHO OFF
SET MYPATH=%CD%
:Search
FOR /F "tokens=1,* delims=\ " %%p IN ("%MYPATH%") DO (
SET MYPATH=%%~q
SET Current=%%~p
)
IF "%MYPATH%" NEQ "" GOTO :Search
ECHO %Current%
PAUSE


2. 若有一個設定檔為setting.ini,內容為
; This is setting file for test
; When ShowMoneyFlag is ON, the system will show money string
ShowMoneyFlag=OFF
; When ShowYou in ON, the system will show the username
ShowYou=ON


讓使用者透過修改setting.ini可以改變顯示的文字~並且把結果存到result.txt
提示: ECHO, FOR, IF, SET

解答:
exercise_b.bat
@ECHO OFF
FOR /F "eol=; tokens=1-2 delims==" %%i IN (setting.ini) DO (
SET %%~i=%%~j
)

IF /I "%ShowMoneyFlag%" EQU "ON" (
ECHO Show money!!
ECHO Show money!!>result.txt
) ELSE (
ECHO NoMoney!!
ECHO NoMoney!!>result.txt
)

IF /I "%ShowYou%" EQU "ON" (
ECHO Hello %UserName%
ECHO Hello %UserName%>>result.txt
)
PAUSE

BAT大補帖 - Call (06)

若要寫大型的BAT程式,CALL這一個指令就絕對不可以忽略~

它可以提高程式的reuse,可以讓程式更精簡!

CALLGOTO最大的不同在於
GOTO是直接跳到設定的LABEL,並且不會跳回來。
CALLGOTO :EOF配合,當被跳到目的的程式執行完時(執行到GOTO :EOF),會跳回執行CALL的程式的下一行。

例:
call_a.bat

@ECHO OFF
ECHO Hello World!!

CALL :Money

ECHO Good Morning!!

CALL :Money

GOTO :END

:Money
ECHO Hello Money!!
GOTO :EOF

:END
PAUSE

大家想像一下,若:Money這一段的程式有到一百行,你執行兩次CALL :Money不就節省了一百行的指令嗎?
若有寫過C語言的話,那就把GOTO :EOF當作return這一個關鍵字吧~

同時,call指令後面可以接傳入的參數。
例:
call_b.bat
@ECHO OFF
ECHO Hello World!!

CALL :Money 100 "300 - 200"

ECHO Good Morning!!

CALL :Money 200 "400 - 200"

GOTO :END

:Money
ECHO Hello %1 Money!!
ECHO The procedure is %~2
GOTO :EOF

:END
PAUSE


第一個CALL後面會接兩個參數,分別是100"300 - 200",而為什麼要用雙引號把它括起來哩~因為,BAT是以空白當作參數的區隔,所以,若你傳入的參數中內含空白的話,就必需要用雙引號把它括起來。

%1分別%~2分別就是代表傳進來的參數,另外,為什麼%1不需要加~
%~2中間確需要加入~這一個符號哩,有加~符號的,會把參數的值的雙引號移除掉,當然,若他本身沒有雙引號的話,~這一個就沒有效果~

平常在執行BAT檔後面也可以輸入參數~
例:
call_c.bat
@ECHO OFF
IF /I "%~1" EQU "ccd9527" (
ECHO HELLO CCD9527!!
) ELSE (
ECHO HELLO EVERYONE!!
)
PAUSE


執行的時候,請用以下兩個方式分別執行
%> call_c.bat ccd9527

%> call_c.bat
透過這一個方式,可以讓使用者決定要使用哪一個流程~非常之好用~

另外,要善用說明檔~
help印出目前系統可以使用的指令
CALL /?
通常裡面會有很多解釋和例子,值的參考!!

[總結]
在這裡,你應該學會了以下指令或關鍵字的用法
CALL

BAT大補帖 - goto(05)

有時候程式的流程不是一定由上面執行下來的,若可以又上面執行下來,同時也可以由下面跳到上面執行,這樣程式是不是會更彈性哩~

GOTO這一個指令,就可以做到這樣的事情。它可以讓程式流程跳到這一個程式碼中的某一個LABEL

LABEL就是在程式碼的某一點加上一個代號,這樣,就可以讓程式跳到這一個程式碥這一點。

例:
Jump.bat

@ECHO OFF
GOTO :Start

:Money
ECHO Momey
GOTO :END

:Start
ECHO Hello World!!
GOTO :Money

:END
PAUSE

以上的例子,程式的流程就不是由上依序往下跑的~

另外,要善用說明檔~
help印出目前系統可以使用的指令
GOTO /?
通常裡面會有很多解釋和例子,值的參考!!

[總結]
在這裡,你應該學會了以下指令或關鍵字的用法
GOTO

2010年11月4日 星期四

BAT大補帖 - for(04)

接下來要介紹的是For的這一個指令。

FOR的這一個指令功能之多,有一些非迴圈的功能都隱藏在FOR這一個指令裡面。

列印1,3,5,7,9

@ECHO OFF
FOR /L %%P IN (1,2,10) DO (
echo %%P
)
PAUSE

這裡要注意,如果要在批次程式中使用FOR命令,請指定%%p,而不要指定%%P。 變數名稱有大小寫的區分,所以%%p不同於%%P

若有一個檔案,myfile.txt,內容如下
; This is sample code start
a1,a2,a3,a4,a5,a6
b1,b2,b3,b4,b5,b6
c1,c2,c3,c4,c5,c6
d1,d2,d3,d4,d5,d6
; This is sample code end

file.bat
@ECHO OFF
FOR /F "eol=; tokens=2,3* delims=, " %%i in (myfile.txt) do (
echo first: %%i
echo second: %%j
echo other: %%k
)

eol表示當我是由;開頭的行,我就不去分析它。
因為,FOR這一個指令在讀取檔案,並且去分析的時候,是以一行為單位。
由第一行開始讀取時,發現是由;開頭的,程式就會直接忽略第一行
; This is sample code start
繼續分析下一行。

FOR的檔案分析,其實就是把每一行的內容分成許多欄位,而delims就是設定由哪一些符號當作分格符號。例如這一個例子中,我們是以,空白字元當作分格符號。因此,第二行就會被分割成以下欄位。
第一欄: a1
第二欄: a2
第三欄: a3
第四欄: a4
第五欄: a5
第六欄: a6

而我們把這一行分成這麼多欄位,我們不一定會每一個欄位都拿來使用。而tokens就是表示說,我只要拿哪一些欄位。
若我只設定tokens=2-4
那這一個意思是說,我只會拿出欄位2欄位4來做處理。

那拿出來的數值,會被存放在哪一個檔數中呢?
這就取決於我們設定於後面的%%i
所以,我們選用的第一的欄位會被放在%%i,而選用的第二個欄位會被放在%%j
所以,在我們file.bat的這一個例子中,在分析第二行(非註解的第一行)時,%%i裡面的內容就會是a2,而%%j的內容就會是a3

相信你應該有注意到(指)
那tokens=2,3後面接的*是什麼意思呢?
而我只有選用兩個欄位而已(2與3),怎麼%%k裡面會有內容哩?

沒有錯,若你在tokens最後面有加*的話,那麼在這一行沒有被選用的剩於的部分,會被存放在你還沒有使用的下一個變數中,這一個例子中,%%i存放a2%%j存放a3,所以,%%k就會存放a4,a5,a6

我們可以對檔案內容分析之外,我們也可以對變數做分析
例如:我們對PATH這一個變數做分析~
我們把PATH裡面第一個欄位與第三個欄位印出來
variable.bat
@ECHO OFF
ECHO Original: %PATH%
FOR /F "tokens=1,3 delims=;" %%I IN ("%PATH%") DO (
ECHO first: %%I
ECHO third: %%J
)
PAUSE


另外,也可以分析執行完指令後的結果~
result.bat
@ECHO OFF
type myfile.txt
ECHO.
ECHO.
FOR /F "eol=; tokens=2,3* delims=," %%i IN ('type myfile.txt') DO (
echo first: %%i
echo second: %%j
echo other: %%k
)
PAUSE

這裡用到一個新的指令,type,這一個指令會把後面接的檔案的內容顯示在終端機上~

另外,要善用說明檔~
help印出目前系統可以使用的指令
FOR /?
TYPE /?
通常裡面會有很多解釋和例子,值的參考!!

[總結]
在這裡,你應該學會了以下指令或關鍵字的用法
FOR
TYPE

2010年11月3日 星期三

BAT大補帖 - IF (03)

在Script中,我們並不會希望每一行指令被執行,而是當目前的情況符合某一些情況時,就去執行某一部分的程式碼。

這個時候就要用到IF這一個關鍵字。

判斷使用者是否為CCD9527,若是,就跟CCD9527打招呼~若不是就跟大家打招呼~
if01.bat

@ECHO OFF
IF "%USERNAME%" EQU "CCD9527" (
ECHO HELLO CCD9527
) ELSE (
ECHO HELLO EVERYBODY
)
PAUSE

這裡要注意的是,在變數與要比較的數值最好都用雙引號括號起來,避免變數的內容值有空白字元,會造成判斷錯誤。

判斷file.txt是否存在
@ECHO OFF
IF EXIST "file.txt" (
ECHO THE file.txt EXIST
) ELSE (
ECHO THE file.txt DOES NOT EXIST
)
PAUSE


若要忽略大小寫字元的比較,要加個/I,如下的範例
@ECHO OFF
IF "A" EQU "a" (
ECHO A EQUAL a
)
IF /I "B" EQU "b" (
ECHO B EQUAL b
)
PAUSE


如何判斷%VALUE%這一個變數是否有被設定過?
@ECHO OFF
IF "%VALUE% EQU "" (
ECHO THE VALUE DOES NOT SET.
) ELSE (
ECHO THE VALUE IS %VALUE%
)
PAUSE


另外,要善用說明檔~
help印出目前系統可以使用的指令
IF /?
通常裡面會有很多解釋和例子,值的參考!!

[總結]
在這裡,你應該學會了以下指令或關鍵字的用法
IF

2010年11月2日 星期二

BAT大補帖 - SET (02)

這裡要介紹的是SET指令。若ECHO是輸出指令,那麼SET就是設定與輸入指令。

以下的例子就是設定YourName變數的內容為ccd9527,那麼要如何確認YourName變數內容是正確的哩?當然就是使用ECHO來確認囉~
yourname.bat

@ECHO OFF
SET YourName=ccd9527
ECHO Your Name is %YourName%
PAUSE


在與使用者的互動中,除了可以印出字串給使用者看的ECHO指令,用來接收使用者的輸入指令SET也是另一個重要的角色。
SET後面加一個/P的參數,後面可以提示使用者輸入的提示,當使用者輸入,則會被存到前面的變數!
yourname.bat
@ECHO OFF
SET /P YourName="Please input your name: "
ECHO Your Name is %YourName%
PAUSE


在BAT中,預設是把所有的變數內容當作字串來使用,若要把內容當作數字作加減運算時,必需要加上/A的參數。
add.bat
@ECHO OFF
SET VALUE=1
ECHO %VALUE%
SET /A VALUE=%VALUE%+1
ECHO %VALUE%
PAUSE


若單單只有打SET指令,後面沒有接任何參數,則會列出目前所有環境變數的資料。
若能善用這一些環境變數,將會大大簡化程式碼的大小,而且也會更彈性喔~
env.bat
@ECHO OFF
SET
PAUSE

有幾個動態環境變數會被展開但是不會出現在SET所顯示的環境變數列表中
%CD% - 展開為含目前目錄的字串。
%DATE% - 展開為與 DATE 命令格式相同的目前日期字串。
%TIME% - 展開為與 TIME 命令格式相同的目前時間字串。
%RANDOM% - 展開為一個在 0 和 32767 之間的整數亂數值。
%ERRORLEVEL% - 展開為目前的 ERRORLEVEL 值
%CMDEXTVERSION% - 展開為目前的命令處理擴充功能的版本號碼。
%CMDCMDLINE% - 展開為執行命令處理器前的原始命令列。

只有在bat檔案有用的環境變數
%~dp0 - 表示被執行的bat檔的所在位置

另外,要善用說明檔~
help印出目前系統可以使用的指令
SET /?
通常裡面會有很多解釋和例子,值的參考!!

進階用法
Q: 若有一個變數VALUE的內容值為12 34,如何把空白填成0
A:
switch.bat
@ECHO OFF
SET VALUE=12 34
ECHO %VALUE%
ECHO %VALUE: =0%
PAUSE

[2010.11.06 補充]
這裡的意思是說,把變數裡面的空白字元0這一個字元來取代~
我所知道在處理%time%這一個變數會用到!
請在晚上十二點過後到早上十點之前執行ShowTime.bat這一個檔案,很恐怖,請做好心理準備後在服用~
ShowTime.bat

因為,在bat檔中,空白字元是當作分格參數的特殊字元,有時候很讓人討厭(會造成程式流程錯誤),所有,有時候,我們必需有以上的處理!

@ECHO OFF
Set Now=%TIME%
ECHO %Now%
ECHO %Now: =0%
PAUSE


Q: 如何印出字串,但是,確不換行,再輸入第一筆資料?
A:
NotTurnLine.bat
@ECHO OFF
SET /P=First<NUL
SET /P=Second<NUL
PAUSE


[總結]
在這裡,你應該學會了以下指令或關鍵字的用法
SET

2010年10月31日 星期日

BAT大補帖 - First BAT (01)

在Linux下與Windows下,都有一個script的東西。
script顧名思義就是一個腳本。
就是原本要執行的二十個指令,寫在一個script中,系統由檔案中,逐行執行~
為什麼要這麼做呢?
如果常常使用指令模式在操作電腦,常常會輸入不同的指令與不同的參數,而其中可能會有許多重覆的部分,正所謂,「做重複的事情是罪惡的」,所以,我們才要把寫在一個script檔案中,讓之後可以重複利用,結省所謂的時間。

而makefile也是另一種script,但是,他算是比較進階且較我們要討論的script嚴謹。在某一些情況,要達到一樣的結果,在makefile要寫好幾行,而在script只需要寫一行。所以,我認為makefile與script都需要去學習,因為,它們都是節省重複動作的工具,值的學習!

而這一個script在windows下,就稱為bat file。

寫第一個bat程式
hello.bat

REM show message
ECHO "Hello Bat!!"
PAUSE

1. 以REM開頭的就是註解,就像C語言中的//
註解後面的東西是不會被執行的。
2. ECHO這一個指令是非常重要的,就像printf一樣,我們可以在程式中途插入一個echo,印出我們想了解某一個變數目前的數值,看是不是我們想要的數值。
3. 當script執行到PAUSE時,會停在PAUSE的地方,等待使用者輸入任意鍵再繼續。這一個指令在BAT檔中,debug是非常需要的。在bat的debug是非常弱的,他不會跟你說你第幾行出現錯誤,必需要使用PAUSE來下斷點,了解在執行哪一行後,才出現錯誤。

當執行完後,你會發現,怎麼程式碼每一行指令都被印出來啊?
我們可以在檔案的最上面透過ECHO OFF關掉這一個功能。
嗯,確實有效,但是還是會出現ECHO OFF這一個字串還是會被顯示出現。
這個時候在ECHO OFF前面加入@,表示不顯示目前這一行程式。
再執行,結果看起來清爽多了~
另外,ECHO後面也可以印出變數的內容,目前就是把USERNAME的內容印出來,要提取變數內容,必需要透過%,把變數名稱夾起來~
hello.bat
@ECHO OFF
REM show message
ECHO "Hello %USERNAME%!!"
PAUSE


另外,要善用說明檔~
help印出目前系統可以使用的指令
ECHO /?
PAUSE /?
CMD /?
通常裡面會有很多解釋和例子,值的參考!!

進階用法
Q: 為了排版,如何印出一個空白行?
A: ECHO.

[總結]
在這裡,你應該學會了以下指令或關鍵字的用法
ECHO
PAUSE
HELP
REM
@

2010年10月29日 星期五

依檔名設定filetype

在vim中,會自動判斷副檔名或是檔案內容決定這是何種檔案~

但是,有時候會有一些新的副檔名沒有辦法被vim判斷出來!

這個時候,就要在filetype.vim修改,當什麼副檔名的時候,自動設定filetype特定的filetype。

例如要把*.dsc設定與*.c的配色相同,則在filetype.vim最下面加入以下的內容

augroup filetypedetect
au! BufRead,BufNewFile *.dsc setfiletype c
augroup END


如此一來,所有的dsc檔的配色都會與c的相同

[2014.05.08 補充]
若想知道目前vim的環境變數為何,
直接輸入
:set

而若想知道filetype這一個環境變數值為何,
直接輸入
: set filetype

參考資料:
Vim Tips

2010年10月10日 星期日

加入註解

好的編輯器送你上天堂,不好的編輯器送你住套房。

但是,有好的編輯器還是要有好的設定,才能送你上天堂。

同時註解多行
用virtual mode的方式選取多行
:'<,'>s/^/\/\//g

把暫存器a的內的東西貼出來
"ap

一般來說 :g 的運作方式是根據一行一行來做的,當你用下面指令的時候,
:g/pattern/y a
這代表的意思其實只是把每次比對到的那行都 yank 複製到"a這裡面去。所以這就會造成我們最後只會拿到最後一行的結果,而不是每個比對到的都會進入到"a去。所以就必須告訴 vim 我們指定的內容是要做附加而不是覆蓋:
:g/pattern/y A

刪除選取的行數,並且存到暫存器a
"aD

:'<,'>d a

取得目前檔案的目錄
:echo fnamemodify("%", ":p:h")
%表示current file name

取得目前檔案的名稱
:echo expand("%")

若執行的指令很可能會出現錯誤訊息,但仍不想要顯示錯誤訊息的話,可以使用silent,例:
:silent! exe "normal /path\<CR>"

:silent! /xxxfdafd

在目前位置加入時間
::map <F2> a<C-R>=strftime("%c")<CR><ESC>


流程
1. 把目前的時間存到暫存器a
//[-start-strftime("%y%m%d")-CCD9527-remove]//
SET @a=time()

2. 註解掉目前選取的所有行數
:'<,'>s/^/\/\//g

3. 把選取的部分附加到暫存器a
"AD

4. 把目前的時間存到暫存器a
//[-end-strftime("%y%m%d")-CCD9527-remove]//
SET @A=time()

5. 把暫存器a貼到目前的位置
"ap


line
append
cursor
getline
mode
confirm
repeat

一行一行讀出來(getline)
加工(substitute)
加到list(add)
刪除原本的資料

_vimrc_utils

" Decide comment symbol
function CommentSymbol ()
"
" Set the default comment
"
let markid_start='//'
let markid_end='//'

"
" Set the comment by the different file type
"
if exists("&filetype") != 0
if (&filetype == "asm") || (&filetype == "pov")
let markid_start=';'
let markid_end=';'
elseif (&filetype == "make") || (&filetype == "inform") || (&filetype == "conf")
let markid_start='#'
let markid_end='#'
elseif &filetype == "dosbatch"
let markid_start='rem '
let markid_end='//'
endif
endif

return [escape(markid_start, ' /'), markid_start, markid_end]
endfunction

"Mark from N to M
function MarkN2MbyComment (N, M, Comment)
let ln = a:N
while ln <= a:M
call MarkByLine (ln, a:Comment)
let ln = ln + 1
endwhile
let @/=''
endfunction

" Remove Mark from N to M
function RemoveMarkN2MbyComment (N, M, Comment)
let ln = a:N
while ln <= a:M
call RemoveMarkByLine (ln, a:Comment)
let ln = ln + 1
endwhile
let @/=''
endfunction

" Set UserID from user input
function SetUserID ()
if exists("g:UserID") == 0

let g:UserID = inputdialog("Set Comment Symbol : (EX:IB06920001)")

if g:UserID == ""
let g:UserID = "TempUser"
endif

endif
endfunction

" Clear UserID
function ClearUserID ()

if exists("g:UserID") != 0
unlet g:UserID
endif

endfunction

" Add ceiling and floor comment
function CeilFloorComment (lnL, lnF, markid_start, markid_end, type)

exe append(a:lnL, a:markid_start . "[-end-" . strftime("%y%m%d"). "-" . g:UserID . "-" . a:type . "]" . a:markid_end)
exe append(a:lnF - 1, a:markid_start . "[-start-" . strftime("%y%m%d"). "-" . g:UserID . "-" . a:type . "]" . a:markid_end)
exe "normal " . (a:lnL + 2) . "G"

endfunction

" AddCommentBlock (F9)
function AddCommentBlock (lnF, lnL)
if line(".") == a:lnL

call SetUserID ()

let [comment, markid_start, markid_end] = CommentSymbol ()

call CeilFloorComment (a:lnL, a:lnF, markid_start, markid_end, "add")

endif
endfunction

" ModifyCommentBlock (F10)
function ModifyCommentBlock (lnF, lnL)
if line(".") == a:lnL

call SetUserID ()

let [comment, markid_start, markid_end] = CommentSymbol ()

call CeilFloorComment (a:lnL, a:lnF, markid_start, markid_end, "modify")

endif
endfunction

" RemoveCommentBlock (F11)
function RemoveCommentBlock (lnF, lnL)
if line(".") == a:lnL

call SetUserID ()

let [comment, markid_start, markid_end] = CommentSymbol ()

call MarkN2MbyComment (a:lnF, a:lnL, comment)

call CeilFloorComment (a:lnL, a:lnF, markid_start, markid_end, "remove")

endif
endfunction

function VisualAddCommentBlock ()
let lnF = line("'<")
let lnL = line("'>")
call AddCommentBlock (lnF, lnL)
endfunction

function NormalAddCommentBlock ()
let lnF = line(".")
let lnL = line(".")
call AddCommentBlock (lnF, lnL)
endfunction

function VisualModifyCommentBlock ()
let lnF = line("'<")
let lnL = line("'>")
call ModifyCommentBlock (lnF, lnL)
endfunction

function NormalModifyCommentBlock ()
let lnF = line(".")
let lnL = line(".")
call ModifyCommentBlock (lnF, lnL)
endfunction

function VisualRemoveCommentBlock ()
let lnF = line("'<")
let lnL = line("'>")
call RemoveCommentBlock (lnF, lnL)
endfunction

function NormalRemoveCommentBlock ()
let lnF = line(".")
let lnL = line(".")
call RemoveCommentBlock (lnF, lnL)
endfunction

function VisualAddSelectionComment ()
let lnF = line("'<")
let lnL = line("'>")

call AddSelectionComment (lnF, lnL)

endfunction

function NormalAddSelectionComment ()

let lnF = line(".")
let lnL = line(".")

call AddSelectionComment (lnF, lnL)

endfunction

function AddSelectionComment (lnF, lnL)
if line(".") == a:lnL

let [comment, markid_start, markid_end] = CommentSymbol ()

call MarkN2MbyComment (a:lnF, a:lnL, comment)

endif
endfunction

function RemoveSelectionComment (lnF, lnL)
if line(".") == a:lnL

let [comment, markid_start, markid_end] = CommentSymbol ()

call RemoveMarkN2MbyComment (a:lnF, a:lnL, comment)

endif
endfunction

function NormalRemoveSelectionComment ()

let lnF = line(".")
let lnL = line(".")

call RemoveSelectionComment (lnF, lnL)

endfunction

function VisualRemoveSelectionComment ()

let lnF = line ("'<")
let lnL = line ("'>")

call RemoveSelectionComment (lnF, lnL)

endfunction

function MarkByLine (CurrentLine, comment)
let TempContent = getline(a:CurrentLine)
let TempContent = substitute (TempContent, '^', a:comment,'g')
exe a:CurrentLine . "d"
exe append (a:CurrentLine - 1, TempContent)
exe "normal " . a:CurrentLine . "G"
endfunction

function RemoveMarkByLine (CurrentLine, comment)
let TempContent = getline(a:CurrentLine)
let TempContent = substitute (TempContent, '^\(\s*\)' . a:comment, '\1', 'g')
exe a:CurrentLine . "d"
exe append (a:CurrentLine - 1, TempContent)
exe "normal " . a:CurrentLine . "G"
endfunction

"AddSelectionComment
nmap <F3> :call NormalAddSelectionComment ()<CR>
vmap <F3> :call VisualAddSelectionComment ()<CR>
"RemoveSelectionComment
nmap <F4> :call NormalRemoveSelectionComment ()<CR>
vmap <F4> :call VisualRemoveSelectionComment ()<CR>

" 移除每一行最後多餘的空白
nmap <F6> :silent! %s/ \+$//gc<CR>

" 把tab轉換成空白
nmap <F7> :silent! %s/\t/ /gc<CR>

nmap <F8> :call ClearUserID ()<CR>
vmap <F8> :call ClearUserID ()<CR>
vmap <F9> :call VisualAddCommentBlock ()<CR>
nmap <F9> :call NormalAddCommentBlock ()<CR>
vmap <F10> :call VisualModifyCommentBlock ()<CR>
nmap <F10> :call NormalModifyCommentBlock ()<CR>
vmap <F11> :call VisualRemoveCommentBlock ()<CR>
nmap <F11> :call NormalRemoveCommentBlock ()<CR>


參考資料:
vim 的選擇模式 (visual mode)
有多少種方式可以在vim中插入行號
我的 VIM 整理
vim 提供的函數
vim 選擇模式下的熱鍵( Key mapping )

2010年9月2日 星期四

建立空白檔案

在Linux下,要透過指令建立一個空白檔案,很簡單,透過touch指令就可以了~

%> touch FileName.txt

而在Windows下要建立空白檔案就比較難一點了~
最後想到一個辦法~
%> createnewfile 1>FileName.txt 2>NUL
1:是表示Standard Output
2:是表示Error Output
上面的意思是說,把Standard Output放到FileName.txt這一個檔案中,而把Error Output放到NUL設備中,NUL就像一個黑洞~東西都會被吸進去~
換句話說,我們本來就沒有createnewfile這一個指令,所以,它不會有Standard Output,所以產生的FileName.txt裡面就不會有內容!而本來應該顯示的錯誤訊息就被黑洞吸走,所以也不會顯示在螢幕上!

2010年8月14日 星期六

在Windows下使用內建的ftp server

其實在Windows下都會有內建的FTP Server

Windows XP


Windows 7


參考資料:
FTP Publishing Service: 檔案交流的基礎服務

2010年8月10日 星期二

Windows的環境變數

若可以好好利用環境變數的話,在寫程式的時候,就會變的非常的方便!

目前的例子是,在編譯的時候,需要設定編譯的thread number,在一開始的時候的設定是需要手動設定,也就是說工程師必需要先知道目前是幾個thread的機器,然後再手動設定thread的個數。

但是,事情上,環境變數NUMBER_OF_PROCESSORS就是表示目前的機器是多少thread的,而在不同編譯的機器中,也不需要變更程式碼,仍然可以好好利用電腦的多個thread。

[2010.10.10 補充]
在windows下,若需要知道所有的環境變數,可以使用以下指令,若善用環境變數,會讓許多程式更加簡潔~
% set

參考資料:
Windows 的環境變數列表
Windows XP 環境變數
漫談Windows XP環境變數

2010年7月15日 星期四

信用卡

我有的每一張信用卡的優惠
第一銀行 - UUONE悠遊聯名卡 VISA 白金卡

花旗銀行 - 花旗饗樂生活卡 VISA 白金卡

中國信託 - 中油VIP感應聯名卡 VISA 白金卡
1. (任何一家Visa信用卡或中國信託中油MasterCard聯名卡)在中油自助加油每一公升降0.8元
2. 在中油加油,紅利兩倍送,等於在中油加15塊就集一點紅利,每30元可集一點,當月帳單新增消費金額需滿3,000元(含)以上申請電子帳單及自動扣繳者不在此限

總結:
1. 出國刷第一銀行的悠遊聯名白金卡
(1).旅遊平安險:2000萬元,喪葬費用:(未滿14歲)200萬元,移靈費用:3萬元。
(2).傷害醫療保險:100萬元。
(3).旅遊不便險:班機延誤1萬元、行李延誤1萬元、行李遺失3萬元。
2. 買東西刷花旗卡 - 45天內因意外毀損、意外遺失、失竊、強盜、或搶劫等原因所致之損失,都可得到適當的賠償。
3. 坐捷運或到全家買東西刷悠遊聯名卡 - 金額不夠,自動加值,在過捷運站時,少於一百會自動加值;而在四大便利商店時,不足額便會自動加值500元,但仍不足額,就沒有辦法自動加值!
4. 加油優惠
(1).中油VIP感應聯名卡 VISA 白金卡 - 加油到中油直營自助加油 - 不限機車、汽車,每一公升降0.8元且15塊就集一點中信紅利
(1).中油VIP感應聯名卡 VISA 白金卡 - 至「台灣優力」或「山隆加油站」,單筆加油超過201元,並加入汽車油箱,降1.8元/升(不含MasterCard)
(2).第一銀行信用卡 - 全台之全國加油站加油滿1公升(含)以上始可享有降價優惠,汽油每公升降1.8元
(3) 花旗信用卡 - 「台亞」與「鯨世界」不限機車、汽車每一降1.8元/升
5. 年費
(1). 電話費刷花旗自動扣繳 - 年刷12次,免年費 - 有申請電子帳單,年刷一次免年費
(2). 中壽保險費刷中信卡朝陽(興農)還本型保險(老爸買的,預定利率現在看起來不錯,只要不解約都還可以) - 年刷超過1萬2,免年費
(3). 悠遊卡刷第一 - 年刷1次,免年費

參考:
卡優新聞網

2010年7月9日 星期五

x86暫存器

EAX (Accumulator Register) (32 bit)
EBX (Base Register) (32 bit)
ECX (Count Register) (32 bit)
EDX (Data Register) (32 bit)
ESP (Stack Pointer) (32 bit)
EBP (Base Pointer) (32 bit)
ESI (Source Index) (32bit)
EDI (Destination Index) (32bit)
FS
GS
SS (Stack Segment) (16 bit)
DS (Data Segment) (16 bit)
ES (Extra Segment) (16 bit)
CS (Code Segment) (16 bit)
EIP (Instruction Pointer) (32 bit)

RAX (EAX 64 Bit Version) (64 bit)
RBX (EBX 64 Bit Version) (64 bit)
RCX (ECX 64 Bit Version) (64 bit)
RDX (EDX 64 Bit Version) (64 bit)
RSP (ESP 64 Bit Version) (64 bit)
RBP (EBP 64 Bit Version) (64 bit)
RSI (ESI 64 Bit Version) (64 bit)
RDI (EDI 64 Bit Version) (64 bit)
RIP (EIP 64 Bit Version) (64 bit)


Flag
Over flow Flag (OF) OV(1) NV(0)
Direction Flag (DF) DN(1) UP(0)
Interrupt Flag (IF) EI(1) DI(0)
Sign Flag (SF) NG(1) PL(0)
Zero Flag (ZF) ZR(1) NZ(0)
Auxiliary Flag (AF) AC(1) NA(0)
Parity Flag (PF) PE(1) PO(0)
Carry Flag (CF) CY(1) NC(0)


整理如下圖:


參考資料:
BIOS研發技術剖析
微算機原理與接口技術
64位元微處理器應用編程

2010年7月4日 星期日

[組語] 架構

start:
程式碼區段開始,這裏有一個標記,start:,和在 DOS 時候一樣

end:
在程式的最後一行有一個end假指令,表示整個原始擋到此結束,end後面所接的標記表示這個程式的進入點

[組語] 指標的使用方式 Ptr

指標的觀念我還蠻熟的~
在C語言中,對於使用指標相關的方式,有一定的了解~

但是,在組語中,對於指標的使用方式就還不是很了解~
剛好這個時候可以整理一下這一方面的資料~

在組語中,使用Ptr有一定的格式
資料長度 PTR [記憶體位址]
資料長度可以是BYTE, WORD, DWORD
例子:
MOV AL, BYTE PTR [0A02B000190008400h]

include Irvine32.inc
.data ; 以下開始為資料區段
x1 QWORD 0A02B000190008400h ; 在目前這一個位置存放一個QWORD的資料,內容為0A02B000190008400h
x2 QWORD 800187008000A904h ; 在目前這一個位置存放一個QWORD的資料,內容為800187008000A904h
sum BYTE 9 DUP(0) ; 所以申請9個Byte的記憶體空間
; sum是一個存放記憶體位址的變數

.code ; 程式碼區段
main PROC ; 宣告一個名為main的function
xor eAX,eAX ; 清除AX=0
mov eDI,0 ; 目的索引暫存器(EDX)亦清除
mov eCX,9 ; 累加暫存器(ECX)亦清除
CLC ; 清除進位旗標(CLear Carry flag)
L1:
jnc L2 ; 若CF=0則跳到 L2:
adc BYTE PTR [sum+eDI],0 ; 否則 sum[下一個Byte]=sum[下一個Byte]+1
CLC ; 清除進位旗標 CF=0
L2:
mov AL,BYTE PTR [x1+eDI] ; 把x1+eDI記憶體的位址開始,長度為BYTE的資料存放到AL的暫存器中
add AL,BYTE PTR [x2+eDI] ; 把x2+eDI記憶體的位址開始,長度為BYTE的資料存與AL做相加的動作
; 並且把結果放到AL中
add BYTE PTR [sum+eDI],AL ; 結果放到 sum
inc eDI ; 做下一個Byte
loop L1

; 傾印記憶體內容
mov eSI,offset sum ; 把sum位址傳給ESI
mov CX,9
call DumpMem ; 呼叫DumpMem函式
call DumpRegs ; 呼叫DumpRegs函式
exit
main ENDP ; 宣告的main函式的結束
END main


參考資料:
指令分類與指令集
組合語言的問題?
addr 與 offset

[組語] LEA和MOV

就我的理解,MOV是把變數的值復製給另一個變數。
在C語言的表示方式如下:
int x=1;
int *ptr;
int y;
y = x;


在asm中,把x的值直接傳給y,則是直接以下面的方式表示
MOV y, x

而LEA則是把變數的位址復製給另一個變數
在C語言的表示方式如下:
int x=1;
int *ptr;
int y;
ptr = &x;


在asm中,把x的位址傳給y,則是直接以下面的方式表示
LEA y, x

參考資料:
組語基礎篇-Lea與Mov
組合語言

瘦小腹

在很小的時候,我好像就一直有在使用這一個方法~
像是在睡覺的時候,肚子還是保持在收小腹的動作!
那個時候就真的是變成習慣,
不過,最後好像因為太懶,就沒有這一個習慣了~
最近再把這一個習慣建立起來吧!

作者:若曦

以前我常常也是為了小腹而苦惱!!
現在的我小腹平的要命!!~
說不是運動也有點算是運動!!~
比仰臥起坐不做以後小復會比以前更大的壞處好太多嚕!!
既使不成功也不會有變更大的顧慮!!
而且痛恨運動的我!!甚至還有腹肌喔>/////<
方法>>>
平常小腹只要呈現在用力的情況下~
那種感覺有點像是被搔癢以後肚子會用力的感覺~
也有點像是用力縮小腹的感覺...
一定要把用力的小腹變成習慣喔!!
習慣以後無時無刻你都會呈現在用力縮小腹的情形下!!
所以就變成不自主的運動小腹啦!!
剛開始會覺得很不習慣!!
但是當你習慣以後成功就在不遠的地方嚕!!
希望大家一起變漂亮吧!!

有任何問題都可以提出來唷!!
因為畢竟用寫低可能不會很清楚^^~
加油嚕!!
各位一起邁向沒小腹的世界吧~

參考資料:
瘦小腹的私人獨門絕招!!討厭運動的懶人看這邊

2010年6月29日 星期二

王品牛排

最近申請了花旗信用卡,申辦首年,送王品牛排買一送一,在這個高價位的餐點中,當然要計劃一下~

王品牛排有個最棒的服務,就是如果先用電話預約說明要慶生的話,
出完餐後,會再加送一份慶生小蛋糕喔!
好像也會送小禮物哩~
不過,就不知道是不是一定要當天才叫做慶生?!

台塑牛排,紐澳的,當然也有美國牛可以選擇,服務生會幫你將牛排去骨後,切成兩半。

我的終級菜單
餐前酒
麵包
沙拉:「義式油醋鮭魚捲」
湯:「酥皮牛尾清湯 」或「法式麵包玉米濃湯」
主餐:百烤豬大排
酸梅湯
配菜
水果:什錦鮮果
甜點:芒果金字塔
飲料:蘋果冰醋

王品食記
慶生!來去吃王品
【王品牛排】台塑牛排套餐(中山店)
台塑王品~台北中山店
2010-02-09軟體工程實驗室尾牙在王品
[食記] 台南 ─ 王品台塑牛排
【台中】王品~我好像開始喜歡上牛肉了
王品台塑牛排~第12年西洋情人節
【食記】年終公司聚餐──王品台塑牛排 [桃園市]
王品
2010高雄食記-王品台塑牛排-令人難忘的美食饗宴
2010高雄食記-王品台塑牛排-令人難忘的美食饗Part II
慶生大餐-王品南門路
=喀喀食記= 王品慶生part1
=喀喀食記= 王品慶生part2
201003王品牛排 (19)
〈台中〉 王品 (文心店)
食記-王品牛排(文心店)@ 台中市近文華高中

2010年6月24日 星期四

合法的延長Windows 7的測試時間

最近透過Velocity Test Suite軟體測試Windows的開機時間時,每一次進入到Windows後,都會跳出一個Genuine的程式(因為,離安裝時間超過三十天了)。
這個時候電腦會在這個地方等很久,除非按ESC,但是,這樣就要把精神放一部分在這個上面,不能專心做其它事情!

「做重覆的事情是罪惡的」。是的,與其花那麼時間做重覆的事情(按ESC),不如花多一點時間去解決這一個問題。

如何延長試用期?
使用管理者權限開啟「命令提示字元」,並且在「命令提示字元」輸入「slmgr -rearm」,會出現命令已成功完成,重開機後即會恢復剩於30天。這樣的指令總共可以使用三次,加上原本的試用30天,就可以有120的試用天數。

當上述的「slmgr -rearm」指令執行三次無效之後,或是執行時出現無權限時,我們就必需先修改錄檔才能再執行「slmgr -rearm」的指令,首先開始功能表的搜尋欄輸入「regedit」進入編輯表。

進入到HKEY_LOCAL_MACHINE→SOFTWARE→Microsoft→Windows NT→CurrentVersion→SoftwareProtectionPlatfrom中,找到『SkipRearm』你會發現值是0,雙擊之後改成1按下確認,然後重新開機就可以再回頭執行「slmgr -rearm」的指令,繼續延長試用期,使用的次數及延長計算請往下看。

360天的使用順序如下

1. 第一次安裝,試用30天
2. 執行「slmgr -rearm」指令三次,共90天
3. 修改登錄檔SkipRearm數值為1,再回頭執行「slmgr -rearm」指令,一共可操作8次,共240天

所以總共30+90+240=360天。

記得試用天數剩下一天時再執行指令,否則可是白白浪費次數哦,另外如果360天就重灌一次,其實就等於無限天數啦!

參考資料:
Windows 7 暗黑破解密技,免費使用360天

2010年6月16日 星期三

Unlocker 「解鎖」無法移動、刪除、重新命名的檔案和資料夾

在用電腦的時候,在移除隨身碟時,常常會遇到不知名的程式仍然在使用某一個檔案~
但是,明明都把所有的應用程式都關掉啦~
系統還是會跟你說,某一個檔案還被使用中~

這個時候Unlocker就派上用場啦~
他可以把應用程式與檔案之間的Link移除掉,這個時候就可以解鎖啦~

Unlocker
Unlocker其它下載點

參考資料:
nlocker 「解鎖」無法移動、刪除、重新命名的檔案和資料夾

提醒自己的眼睛該休息了

身為一個程式設計師~常常會忘記自己看電腦看了多久了~
EyeDenfender可以依使用者的設定跳出來提示使用者該休息啦~

Eterlab EyeDefender 1.0 (Freeware)
官方網站
下載點

中國時報【黃文博/台南報導】

才廿歲出頭的林姓男子,年初突然覺得視力模糊,到醫院求診後,才知道自己得了「眼睛過勞死」。這種俗稱中老人視力殺手的黃斑部病變,近年來因電腦愈來普及,有逐漸年輕化的趨勢,僅奇美醫院,平均每個月就接到四、五個病例。

林先生是電子工程師,一天有十多個小時緊盯電腦螢幕,長時間用眼過度造成視力模糊,到奇美醫院眼科求診,才確診是黃斑部病變,還好這位年輕工程師及時就醫,只要調整作息,幾個月即可回復正常。

黃斑部病變 導致視力模糊

四十二歲李先生也是電子工程師,去年金融海嘯期間,為避免自己遭公司裁員,長時間熬夜加班,加上壓力大,發生左眼視力模糊,四個多月後才求診,求診時已達看物體會變昏暗、變形、兩眼無法對焦情況,醫師發現他是「中心漿液性脈絡膜視網膜病變」。

五十五歲張先生,是一位成功小型企業家,發現右眼有一黑影,原先也以為是單純的飛蚊症,到奇美醫院求診,才被診斷出是「溼性老年黃斑部病變」。

拖延就診治療 有失明之虞

以上都是眼科俗稱的「眼睛過勞死」,均是眼睛黃斑部病變,如能發現即時就診,只要依照醫師指示,讓眼睛多休息,就會自然變回原狀,如果拖太久,恐怕會有失明情況;不過現在也有一種比較先進的雷射強度減半的光動力療法,照一次不到兩分鐘,老人再配合眼睛玻璃體內注射,還是可以治療,不過也不能讓病情拖太久才求醫。

奇美醫院眼科主治醫師柳景 說,預防眼睛過勞死,一定要每隔一小時就讓眼睛休息幾分鐘,還要有充分休息,不能有太大壓力。美國國家衛生研究院臨床研究,初期預防證實葉黃素搭配玉米黃素五比一,另須添加綜合維他命和維生素A、C、E、B群及稀有元素硒、鋅、銅和錳,才能達到預防視網膜黃斑病變的實質效果。

參考資料:
長時間盯著螢幕,眼睛疲勞嗎?快讓EyeDenfender來保護你的眼睛吧!

重新設定TortoiseSVN的登入帳號密碼

這個星期因為同事放連假~所以,請我幫他commit svn,
但是,原本的這一個Project,我只有read的權限,沒有write的權限~
而且,我原本的帳號密碼已經記憶在電腦裡面了,要怎麼改哩~

最後總算找到要把原本的帳號刪掉~並且在commit時,會跳出一個輸入帳號密碼的動作,這個時候,就可以重新輸入同事給我的帳號密碼了~

步驟如下:
C:\Documents and Settings\[登入電腦的帳號]\Application Data\Subversion\auth
這邊每個檔案都是登入的資訊,你只要刪掉檔案他就會請你再輸入一次了。

[2010.07.28 補充]
在Win 7下的路徑如下
C:\Users\[登入電腦的帳號]\AppData\Roaming\Subversion\auth\

參考資料:
Subversion重新登入的方法
win7 svn 密碼位置

2010年6月14日 星期一

如何設定SVN的Externals

trunk: Main line of development(主幹, 主要開發都由在 trunk)
tags: Release (當發展到一個固定的階段, 可以放 Release 版本的東西)
branches: Preparation of release, bug fixing(放一些正在修改的分支, 稍後會合併的工作副本)

今天研究了一下,如何在透過svn去設定Externals Link,
Externals Link的意思主要是在下載目前指定的目錄的時候,同時下載另一個Repositories。
這一個的好處就是,當一套Code是分成許多部分,而每一個部分是由不同的單位來maintain,如果沒有使用Externals Link,那就必需要對Code的每一個部分做Update或CheckOut的動作!
而透過Externals Link,則只需要設定完後,對一整個Code做Update的動作,這個時候,它會同時對所有的Externals Link做Update的動作。

目前在Server端有Main與Secondary這兩個Repositories。
每一個的根目錄裡面都有一個ReadMe.txt


對Main資料夾按右鍵,選擇內容,再選擇Subversion這一個Tab

再選擇Properties選擇New

則會跳出Add Properties視窗~
1. 在Property name的部分設定為svn:externals
2. 設定Property value分為兩個部分,第一個部分設定Externals Link在這個部分就是我的數值是https://LocalHost/svn/Secondary/trunk
因為,在測試的環境中,我的server與client是在同一台電腦中,所以,我的網址設定為LocalHost
接下來是設定放置的Folder這一個部分我的設定是Secondary
所以,最後的結果就是https://LocalHost/svn/Secondary/trunk Secondary

按下OK之後,就會出現如下圖~


這個時候對Main資料夾做Commit的動作,會發現Main的這一個資料夾有被修改過~


Commit完之後,再對Main資料夾做Update的動作,就可以完成時,就可以看到以下畫面,它把Secondary的Repositories下載到Secondary這一個資料夾~


當之後任何人對Secondary Repositories做更新的動作之後,Update Main資料夾,可以同時Update到Main資料夾裡面的Secondary資料夾的內容~

指令的方式可能是透過,因為,我還沒有試過,所以不確定
svn propset svn:externals –F external_def.txt Secondary
聽說還有另一個指令svn:propedit,讓你輸入多行你要Externals的資訊
執行命令後會執行編輯器編輯屬性。
在編輯器打開的文件中,每行代表一個你要從那裡取得Code的不同的外部svn Repositories。
一行中的第一段代表你想讓取回Code存放的目錄,最後一部分是取得Code的svn版本的URL。
中間你還可以用一些可選配置參數來決定要取回的版本。以下是一些例子:
取得Zend Framework倉庫的當前版本(head):
framework http://framework.zend.com/svn/framework/trunk
取得Zend Framework倉庫的版本2616:
framework -r2616 http://framework.zend.com/svn/framework/trunk

參考資料:
TortoiseSVN Help Menu
[程式設計] SVN 如何建立一個 branch
[程式設計] 為你的程式加上版本控制 -- SVN
Version Control with Subversion
學會使用svn:externals

2010年5月25日 星期二

SETLOCAL指令

在bat檔中,常常會遇到在IF或是FOR裡面做完運算之後,
直接在下一行確沒有辦法讀到上一行的結果~

例如:

@echo off
set Val=1
echo %Val%
(
set Val=2
echo %Val%
set Val=3
echo %Val%
)
echo %Val%
pause


我哩!我明明有在裡面變更Val的值,都是為啥印出來確都沒有變哩~
而是只有執行到括號的結束之後,整個值才有變。
那這樣有啥用啊~

今天在網路上,不小心看到一個新指令SETLOCAL

說明如下:
SETLOCAL 批次命令現在可接受一個選項引數,這個引數可為:
ENABLEEXTENSIONS / DISABLEEXTENSIONS
啟用或停用命令處理擴充功能。
請用 CMD /? 來查看說明。
ENABLEDELAYEDEXPANSION / DISABLEDELAYEDEXPANSION
啟用或停用延遲環境變數擴充功能。
請用 SET /? 來查看說明。
這些修正命令作用會持續到對應 ENDLOCAL 命令為止,而不管
它們的設定是否在 SETLOCAL 命令之前。


範例程式如下:
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set Val=1
echo %Val% !Val!
(
set Val=2
echo %Val% !Val!
set Val=3
echo %Val% !Val!
)
echo %Val% !Val!
pause

輸出結果如下:
1 1
1 2
1 3
3 3
請按任意鍵繼續 . . .


喔耶,這樣就可以在IF或是FOR做運算的動作,同時,也可以在括號裡面做判斷啦~

批次檔 有沒有類似 IF...THEN....ELSE 跟 OR的語法呢??
以上聯結的重點
在 %xxx% 的使用是在 執行 指令時...將 %xxx% 的 值 取代(展開) %xxx% 到指令句中
而在 if for 和 ( ) 指令 執行 時...這扯到指令處理的方式
在我寫的範疇中... 在處理 ( ) 時... 是將 ( ) 其中的指令一起處理
因此 ( ) 中在實際執行時...就把 %Val% 取代了... 而執行 ( ) 之前 Val 是 =1
set Val=1
(
set Val=2
echo 1 !Val!
set Val=3
echo 1 !Val!
)

即 ( ) 是將 %Val% 一次 展開
所以 !xxx! 的意思和 %xxx% 不一樣
!xxx! 是使用時 (該指令執行時) 才取代(展開)
這就是 "延遲"環境變數展開功能

簡單說就是 %xxxx% !xxxx! 展開 的 時間點 不同

( ) 是 CMD 本身的 指令區段 的寫法
而 if for 使用時也是有 指令區段 ...只不過如果只有一行...可以省略不打 ( ) 而以
不過也是要看情況...例如 if
if "a"=="b" echo 1
等於
if "a"=="b" (echo 1)

if "a"=="b" echo 1 else echo 2
等於
if "a"=="b" (echo 1 else echo 2)
所以正常要用 else 要打成
if "a"=="b" (echo 1) else (echo 2)

而基本上...每行指令...本身就有一個指令區段

set a=1
set a=2&echo %a%



結果是顯示 1
因為實際上等於是
(set a=1)
(set a=2&echo %a%)
而這等同
(set a=1)
(
set a=2
echo %a%
)

也就是 ( ) 視為一個指令(指令區段)
而 %xxxx% 展開 是在 執行 指令(指令區段) 時就先展開
而 !xxxx! 是在執行 指令區段 中的 單行指令 時才展開

參考資料:
批次檔 有沒有類似 IF...THEN....ELSE 跟 OR的語法呢??

2010年5月13日 星期四

抽小版的Script

這一個bat script必需要搭配Beyond Compare才能使用

進化版本
sg.bat

@ECHO OFF

REM ========== ----------------------- ==========
REM ========== Solution Generator (sg) ==========
REM ========== ----------------------- ==========

REM ========== INPUT NEW CODE PATH (DO NOT MODIFY) ==========

:TryGetNewPath
SET NEW_CODE_PATH=
SET /P NEW_CODE_PATH=Please input the new(modified) code path (default: %SOURCE_ROOT%\%PROJECT_NAME%):
IF "%NEW_CODE_PATH%" EQU "" SET NEW_CODE_PATH=%SOURCE_ROOT%\%PROJECT_NAME%
IF EXIST %NEW_CODE_PATH% GOTO NewPathOk
ECHO THE PATH DO NOT EXIST, PLEASE INPUT AGAIN
GOTO TryGetNewPath
:NewPathOk

REM ========== INPUT OLD CODE PATH (DO NOT MODIFY) ==========
:TryGetOldPath
SET /P OLD_CODE_PATH=Please input the old(original) code path (ex: d:\work\old\ or d:\work\old.zip):
IF EXIST %OLD_CODE_PATH% GOTO OldPathOk
ECHO THE PATH DO NOT EXIST, PLEASE INPUT AGAIN
GOTO TryGetOldPath
:OldPathOk


REM ======== GET DATE AND TIME (DO NOT MODIFY) ========
FOR /F "tokens=1-4 delims=/ " %%a IN ("%date%") DO (
SET SYS_DATE=%%a.%%b.%%c
)
FOR /F "tokens=1-4 delims=:." %%e IN ("%time%") DO (
SET SYS_TIME=%%e%%f%%g
)

REM ========== INPUT MINI-SOLUTION PATH (DO NOT MODIFY) ==========
SET SOLUTION_PATH=
SET /P SOLUTION_PATH=Please input mini-solution path (default: %SOURCE_ROOT%\%SYS_DATE%-%SYS_TIME%-mini-solution):
IF "%SOLUTION_PATH%" EQU "" SET SOLUTION_PATH=%SOURCE_ROOT%\%SYS_DATE%-%SYS_TIME%-mini-solution

REM ===========================================================
REM User must modify the setting of this block.
REM GENERATE_MODE : SEPARATE_MODE or MERGE_MODE
REM NEW_CODE_PATH : new revision code path
REM OLD_CODE_PATH : old revision code path
REM TARGET_PATH : little version code path
REM SCRIPT_PATH : script file path (solution_generator.script and solution_generator.bat)

SET GENERATE_MODE=SEPARATE_MODE
SET NEW_CODE_PATH=%NEW_CODE_PATH%
SET OLD_CODE_PATH=%OLD_CODE_PATH%
SET TARGET_PATH=%SOLUTION_PATH%
SET SCRIPT_PATH=D:\DEVTLS\BAT

REM ===========================================================
REM Internel path setting , use default path.
REM User can modify these if need.

SET BC2_PATH="C:\Program Files\Beyond Compare 2"
SET TEMP_PATH=C:\TEMP_CODE
IF /I "%GENERATE_MODE%" == "SEPARATE_MODE" SET GENERATE_NEW_CODE=%TARGET_PATH%\NEW
IF /I "%GENERATE_MODE%" == "SEPARATE_MODE" SET GENERATE_OLD_CODE=%TARGET_PATH%\OLD

REM ===========================================================
MKDIR %TARGET_PATH%
IF /I "%GENERATE_MODE%" == "MERGE_MODE" MKDIR %TEMP_PATH%
IF /I "%GENERATE_MODE%" == "SEPARATE_MODE" MKDIR %GENERATE_NEW_CODE%
IF /I "%GENERATE_MODE%" == "SEPARATE_MODE" MKDIR %GENERATE_OLD_CODE%
SET ORIGIN_PATH=%PATH%
SET PATH=%PATH%;%BC2_PATH%
IF /I "%GENERATE_MODE%" == "MERGE_MODE" bc2.exe @%SCRIPT_PATH%\solution_generator.script %NEW_CODE_PATH% %OLD_CODE_PATH% %TARGET_PATH% %TEMP_PATH%
IF /I "%GENERATE_MODE%" == "SEPARATE_MODE" bc2.exe @%SCRIPT_PATH%\solution_generator.script %NEW_CODE_PATH% %OLD_CODE_PATH% %GENERATE_NEW_CODE% %GENERATE_OLD_CODE%
IF /I "%GENERATE_MODE%" == "MERGE_MODE" FOR /R %TEMP_PATH% %%I IN (*.*) DO MOVE /Y %%~fnxI %%~fnxI_
IF /I "%GENERATE_MODE%" == "MERGE_MODE" XCOPY %TEMP_PATH% %TARGET_PATH% /E /K /Y
IF /I "%GENERATE_MODE%" == "MERGE_MODE" RMDIR /S /Q %TEMP_PATH%
SET %PATH%=%ORIGIN_PATH%

REM ========== CREATE NOTE FILE (DO NOT MODIFY) ==========
SET %NoteFile%=%SOLUTION_PATH%\History.txt
ECHO NEW_CODE_PATH: %NEW_CODE_PATH% > %NoteFile%
ECHO OLD_CODE_PATH: %OLD_CODE_PATH% >> %NoteFile%
ECHO MINI-SOLUTION PATH: %SOLUTION_PATH% >> %NoteFile%
ECHO ============================= >> %NoteFile%
ECHO #; Tag: >> %NoteFile%
ECHO #; Issue: >> %NoteFile%
ECHO #; Category: >> %NoteFile%
ECHO #; Symptom: >> %NoteFile%
ECHO #; RootCause: >> %NoteFile%
ECHO #; Solution: >> %NoteFile%
ECHO #; Description: >> %NoteFile%
ECHO #; >> %NoteFile%
ECHO #; Related Files: >> %NoteFile%
ECHO #; Added: > %NoteFile%
ECHO #; Deleted: >> %NoteFile%
ECHO #; Modified: >> %NoteFile%
ECHO #; >> %NoteFile%

PAUSE
REM ===========================================================

solution_generator.script
criteria rules-based
filter "-.svn\";"-uefi64\";"-uefi32\";"-X64\";"-*.Dep";"-_svn\";"-uefi64ddt\"
load "%1" "%2"
expand all
select lt.diff.files lt.orphan.files
copyto lt path:base "%3"
select rt.diff.files rt.orphan.files
copyto rt path:base "%4"


顯示目前目錄底下的所有檔案
% dir /s /b


參考資料:
Eric's Webspace Windows 95 / DOS 7 Batch Programming

透過Bat計算編譯的時間

以下的程式碼,可以協助使用者編譯程式,像是原本要打nmake uefi64
只要直接打
% vb
就可以啦,vb是variable build的簡稱啦~
若要執行nmake clean,可以打
% vb clean

這裡要注意的是,在bat中,%是轉換為其它進位,真正餘數運算元是%%

以下是程式碼
vb.bat

@ECHO OFF

REM ========== GET THE START TIME (DO NOT MODIFY) ==========
SET StartTime=%time%
FOR /F "delims=:. tokens=1-3" %%p IN ("%StartTime%") DO (
SET /A StartTotalTime=%%p*60*60+%%q*60+%%r
)

REM ========== SET THE DEFAULT VALUE (DO NOT MODIFY) ==========
IF "%1" EQU "" (
SET TARGET=uefi64
) ELSE (
SET TARGET=%1
)

REM ========== EXECUTE NMAKE (DO NOT MODIFY) ==========
ECHO NMAKE %TARGET%
CALL NMAKE %TARGET%
@ECHO OFF
GOTO END

:END

REM ========== GET THE END TIME (DO NOT MODIFY) ==========
SET EndTime=%time%
FOR /F "delims=:. tokens=1-3" %%p IN ("%EndTime%") DO (
SET /A EndTotalTime=%%p*60*60+%%q*60+%%r
)

REM ========== Summary (DO NOT MODIFY) ==========
SET /A TotalTime=%EndTotalTime%-%StartTotalTime%
SET /A Hour=%TotalTime%/3600
SET /A Second=(%TotalTime%)%%60
SET /A Minute=(%TotalTime%-%Hour%*3600-%Second%)/60
ECHO Total: %Hour%:%Minute%:%Second% (From %StartTime% to %EndTime%)

REM ========== Jump the Hint Window (DO NOT MODIFY) ==========
cscript D:\Devtls\Bat\CompilerDoneMsg.vbs %TARGET% //Nologo


CompilerDoneMsg.vbs
If WScript.Arguments.Count() = 0 Then
MsgBox " CompilerDone ", vbSystemModal
Else
'
'Display first Argument only.
'
MsgBox " CompilerDone ", vbSystemModal, WScript.Arguments(0)
End If


參考資料:
如何用批處理求餘數

2010年5月3日 星期一

[組語] PROC & ENDP

; Caspar-comment - PROC用來定義程序,以ENDP表示結束
; Caspar-comment - 若sub function與main function在同一段Code則使用NEAR, 主程式的Stack只會存入ip
; Caspar-comment - 若sub function與main function不在同一段Code則使用FAR, 主程式的Stack會存入cs, ip的值

FooStart         PROC NEAR C PUBLIC


CALL 指令

用來呼叫副程式的指令,語法是

CALL 副程式名

RET 指令

RET 指令是在副程式中返回主程式的指令,其語法是:

RET n
RETN n
RETF n

n 是位元組數,此位元組數表示自副程式返回時還要再使 SP 加上幾個位元組。常用於高階語言呼叫副程式,見第 31 章。RETN、RETF 見 PROC/ENDP 假指令的說明。
PROC/ENDP 假指令

PROC 並非 80x86 指令而是假指令,它是用來定義副程式,它指出副程式由此開始,必須和 EDNP 搭配使用,否則組譯器會出錯。語法是:

標號名 proc [near/far]
;副程式碼
ret
標號名 endp

標號名就是這個副程式的名稱,例如當 CPU 執行到

CALL my_subroutine

指令時,就會跳到名為 my_subroutne 的副程式執行。

若 PROC 後接 near 表示副程式與主程式在同一區段內,稱為近程呼叫;若接 far,表示副程式與主程式在不同區段內,稱為遠程呼叫。若省略 near 和 far,組譯器能自動判斷副程式與主程式是否在同一區段內。近程呼叫或遠程呼叫會影響返回位址的大小。很明顯的,近程呼叫,只要把下一指令的偏移位址推入堆疊即可而偏移位址只有一個字組的大小;如果是遠程呼叫,就要把區段位址及偏移位址,共兩個字組推入堆疊。

這也影響到返回時要自堆疊取出一個或兩個字組,因此分別用 RETN、RETF 來表示。但是如果用 RET,也沒關係,組譯器也能自動判斷。


可多參考INTEL和AMD在CPU指令手册

下面有一個例子
;------------------------------------------------------------------------------
; VOID
; IoOutput32 (
; IN UINT16 Port,
; IN UINT32 Data
; )
;------------------------------------------------------------------------------
IoOutput32 PROC PUBLIC Port:UINT16, Data:UINT32
pushad
mov eax, Data
mov dx, Port
out dx, eax
popad
ret
IoOutput32 ENDP

參考資料:
asm - 副程式

[組語] ALIGN

; Caspar-comment - 以下的程式碼以4 byte為單位在排列
align 4

[組語] SEGMENT

之前已經提過 SEGMENT 假指令了,事實上 SEGMENT 後面有許多選項可供選擇,當您寫副程式製作成程式庫,或是寫很大的程式把它切割成數個小程式再合併時,要注意這些選項。其語法是:

區段名 segment 排列型式 合併型式 類別名

排列型式 (align type) 是告訴連結程式該區段由那一種位址開始,或者說此區段排在前一區段後的那一種位址開始。可以選擇的位址種類有下面幾種:

1. byte:由某一位元組開始,也就是任意位址開始,視載入 DOS 驅動程式多寡以及前面區段大小決定。
2. word:由某一字組開始,也就是從偶數位址開始。
3. dword:由某個雙字組開始,一個雙字組是 4 個位元組。
4. para:由某一節開始,節的英文是 paragraph,一節的大小是 10H 個位元組,也就是十進位的 16 個位元組。
5. page:由某一頁 (page) 開始,一頁是 100H 個位元組。

前面幾章的例子中,都省略排列形式,則連結器自動用 para 選項,也就是說沒有排列形式時,MASM 內定選項是 para。

合併型式 (combine type) 是告訴連結器該區段和程式庫內或其他目的檔內的那一個區段連結在一起成為一個區段。可以用的選項有:

1. none:不與其他區段合併。
2. public:具有相同名稱且相同類別名的區段合併成一個區段。
3. common:具有相同名稱的區段合併成一個區段。
4. at 位址:區段被置於特定位址。
5. stack:表示此區段為堆疊區段。
6. memory:使區段置於最高位址。

雖然 segment 的用法很複雜,但是最常用的還是『stack』、『public』。因為在主程式中要使用程式庫,或者要把某個副程式加入程式庫都必須宣告『public』及類別名,使連結程式 (LINK.EXE) 能順利把各區段正確連結。
參考資料:
SEGMENT 假指令

[組語] .module

tiny  用於成立 .com 檔,程式段、資料段、額外段及堆疊段等四個區共用在同一個區段(64Kb)中,檔案最大僅能64Kb。
small 程式段及資料段,各有64Kb的空間。為一般最常用的 .exe 檔的模式,建議使用。
medium 程式段可超過64Kb,而資料段只有64Kb的空間。
compact 資料段可超過64Kb,而程式段只有64Kb的空間。
large 程式段與資料段,皆可大於 64 Kb。
huge 同上,但更強的是,連同資料段中的任意某陣列,也可大於 64Kb 的範圍。
flat ???? 用於 OS/2 系統。用途不詳......


MODEL SMALL, C 就指定要和C 語言聯結
參考資料:
組合語言假指令

[組語] INCLUDE

跟C語言中的#include是一樣的意思~
就是把後面的這一個檔案,整個把它貼到目前的這一個位置

INCLUDE function.inc

以上的程式就是把function.inc整個貼到目前的這一個位置

2010年4月29日 星期四

郵件的儲存位置

之前都一直使用Outlook Express,這裡記錄下之前的經驗

========== Outlook Express ==========
在Outlook Express的郵件儲存位置
是在C:\Documents and Settings\使用者名稱\Local Settings\Application Data\Identities\{亂數}\Microsoft\Outlook Express
其中在大括號中間的是一個亂數
也可以直接到
Outlook Express→工具→選項→維護→郵件檔資料夾
取得目前郵件檔資料夾的位置

通常為了備份的安全性,我會把郵件的儲存位置改到C槽以外的地方~
直接開啟Outlook Express→工具→選項→維護→郵件檔資料夾→變更
這個時候就可以選擇新的位置~
但是,若這個新的位置有另外的郵件設定檔~
這個時候若選擇(N)則會使用這一個位置的郵件~(會不會把原本位置的郵件刪掉,我並不清楚~)
若選(Y)的話,會把這一個位置的郵件刪掉,並且把原本位置的郵件移到此處~

以上的動作要非常小心,不然可能會導致整個郵件的資料不見~

壓縮所有資料夾
在Outlook Express的郵件檔會越來越大~
當你在收到的時候會變大~
但是,當你把信刪掉的時候,並不會變小~
這個時候要使用壓縮的功能~
檔案→資料夾→壓縮所有資料夾
這樣就會把空間清出來了~

附加檔案可能沒有辦法打開
在Outlook Express 6之後,會有一個選項預設是開啟的~會導致附加檔案可能沒有辦法打開~
工具→選項→安全性→在附件有可能有病毒時不允許儲存或開啟

要求收件者回傳回條
設定當收件者收到信,可以要求收件者回傳回條~
工具→選項→回條→所有傳送的郵件都要讀取回條

分割傳送
有一些Mail Server會限制傳送郵件的大小~但是,有時候,你的檔案就是那麼大,那麼要如何做呢?
在「工具」→「帳戶」→「郵件」→「內容」→「進階」在傳送的部分設定成當郵件大於幾KB時,就切割~
但是,這裡要注意的是,收件者必需也要使用Outlook Express才可以把它組合起來~若是用IE介面的,會看到很多一樣標題的郵件~


預設不直接開啟信件
在預設的情況下,當你一點到你的其中一封郵件時,右下的視窗就會幫你打開它~若它是有毒的信,可能你的電腦就中毒了~
因為,為了安全性,我把以下的設定不勾選~
檢視→版面配置→顯示預覽窗格

在伺服器保留郵件備份
「工具」→「帳戶」→「郵件」→「內容」→「進階」→「遞送」
勾選「在伺服器保留郵件備份」

因為公司政策的關係,全面改用Exchange,所以就必需使用Office Outlook
若有任何心得,會在這裡做一下記錄~

========== Office Outlook ==========
在Office Outlook的郵件儲存位置
是在C:\Documents and Settings\使用者名稱\Local Settings\Application Data\Microsoft\Outlook\Outlook.pst

在信件的網路空間不足
先選擇要封存的資料夾,並且在「檔案」功能表中按一下封存。
然後再到原本的資料夾中,把資料夾刪掉,再跟網路的信箱同步之後,就會把網路上的空間清出來啦~
可以參考手動封存資料夾

參考資料:
如何備份你的Outlook郵件?
手動封存資料夾

2010年4月28日 星期三

組合語言語法

MARCO
就是把MACROENDM這兩個夾起來的部分用另一個名稱來取代
Ex:

FOO  MACRO
MOV AL, 0x32
ADD AL, 0x01
ENDM

之後的程式碼就可以使用以下的方式
  FOO
ADD AL, AL

最後AL的結果就會0x66
===================PUBLIC=====EXTRN=============================
PUBLIC 假指令是宣告副程式、標記或變數為『公用』的,編譯器看到這個假指令,便會把相關資料寫進目的檔,讓 Linker 能夠連結,使得其他程式能夠使用被宣告為公用的副程式或變數。所以 PUBLIC 應該用在被呼叫的程式中。

PUBLIC 常常和EXTRN配合使用。EXTRN 的意思是『外部』的,當 cl.exe 看到被宣告外部的變數、副程式或標記時,雖然在程式中找不到,也不會出現錯誤,而會把相關資訊寫進目的檔,等到連結時會尋找被連結的程式庫或目的檔,如果找到就不會產生錯誤。因為使用外部的『東東』是變數、標記還是副程式的處理方式不同,所以必須在 EXTRN 後面告訴 cl.exe 是那一種。

EXTRN 的語法是:

EXTRN 副程式名:呼叫方式

呼叫方式可以用 near 或 far。
========================EQU=============================
把某一個變數設定為常數!
以下這一個例子是把PEI設定為3這一個常數
PEI EQU 3



參考資料:
小木偶的網頁 - Ch10 程式庫

2010年4月18日 星期日

[Live-MAN] #pragma 預處理指令

#pragma asm
表示後面寫的是組合語言 (加速)

#pragma small
表示小記憶體模式 (DOS朝代memory很珍貴)

#pragma registerbank(0)
表示使用bank0 (別的CPU沒有這種東西)

#pragma code
表示const 資料放在ROM裡面 (節省RAM)

在所有的預處理指令中,#Pragma 指令可能是最複雜的了,它的作用是設定編譯器的狀態或者是指示編譯器完成一些特定的動作。#pragma指令對每個編譯器給出了一個方法,在保持與C和 C++語言完全相容的情況下,給出主機或作業系統專有的特徵。依據定義,編譯指示是機器或作業系統專有的,且對於每個編譯器都是不同的。
其格式一般為: #Pragma Para
其中Para 為參數,下面來看一些常用的參數。

(1)message 參數。 Message 參數是我最喜歡的一個參數,它能夠在編譯資訊輸出窗
口中輸出相應的資訊,這對於源代碼資訊的控制是非常重要的。其使用方法為:
#Pragma message(“消息文本”)
當編譯器遇到這條指令時就在編譯輸出窗口中將消息文本列印出來。
當我們在程式中定義了許多宏來控制源代碼版本的時候,我們自己有可能都會忘記有沒有正確的設置這些宏,此時我們可以用這條指令在編譯的時候就進行檢查。假設我們希望判斷自己有沒有在源代碼的什麼地方定義了_X86這個宏可以用下面的方法
#ifdef _X86
#Pragma message(“_X86 macro activated!”)
#endif
當我們定義了_X86這個宏以後,應用程式在編譯時就會在編譯輸出窗口裏顯示“_
X86 macro activated!”。我們就不會因為不記得自己定義的一些特定的宏而抓耳撓腮了


(2)另一個使用得比較多的pragma參數是code_seg。格式如:
#pragma code_seg( ["section-name"][,"section-class"] ] )
它能夠設置程式中函數代碼存放的代碼段,當我們開發驅動程式的時候就會使用到它。

(3)#pragma once (比較常用)
只要在頭文件的最開始加入這條指令就能夠保證頭文件被編譯一次,這條指令實際上在VC6中就已經有了,但是考慮到相容性並沒有太多的使用它。

(4)#pragma hdrstop表示預編譯頭文件到此為止,後面的頭文件不進行預編譯。BCB可以預編譯頭文件以加快鏈結的速度,但如果所有頭文件都進行預編譯又可能佔太多磁片空間,所以使用這個選項排除一些頭文件。
有時單元之間有依賴關係,比如單元A依賴單元B,所以單元B要先於單元A編譯。你可以用#pragma startup指定編譯優先級,如果使用了#pragma package(smart_init) ,BCB就會根據優先級的大小先後編譯。

(5)#pragma resource "*.dfm"表示把*.dfm文件中的資源加入工程。*.dfm中包括表單
外觀的定義。

(6)#pragma warning( disable : 4507 34; once : 4385; error : 164 )
等價於:
#pragma warning(disable:4507 34) // 不顯示4507和34號警告資訊
#pragma warning(once:4385) // 4385號警告資訊僅報告一次
#pragma warning(error:164) // 把164號警告資訊作為一個錯誤。
同時這個pragma warning 也支援如下格式:
#pragma warning( push [ ,n ] )
#pragma warning( pop )
這裡n代表一個警告等級(1---4)。
#pragma warning( push )保存所有警告資訊的現有的警告狀態。
#pragma warning( push, n)保存所有警告資訊的現有的警告狀態,並且把全局警告
等級設定為n。
#pragma warning( pop )向棧中彈出最後一個警告資訊,在入棧和出棧之間所作的
一切改動取消。例如:
#pragma warning( push )
#pragma warning( disable : 4705 )
#pragma warning( disable : 4706 )
#pragma warning( disable : 4707 )
//.......
#pragma warning( pop )
在這段代碼的最後,重新保存所有的警告資訊(包括4705,4706和4707)。
(7)pragma comment(...)
該指令將一個註釋記錄放入一個對象文件或可執行文件中。
常用的lib關鍵字,可以幫我們連入一個庫文件。


每個編譯程式可以用#pragma指令激活或終止該編譯程式支援的一些編譯功能。例如,對迴圈優化功能:
#pragma loop_opt(on) // 激活
#pragma loop_opt(off) // 終止
有時,程式中會有些函數會使編譯器發出你熟知而想忽略的警告,如“Parameter xxx is never used in function xxx”,可以這樣:
#pragma warn —100 // Turn off the warning message for warning #100
int insert_record(REC *r)
{ /* function body */ }
#pragma warn +100 // Turn the warning message for warning #100 back on
函數會產生一條有唯一特徵碼100的警告資訊,如此可暫時終止該警告。
每個編譯器對#pragma的實現不同,在一個編譯器中有效在別的編譯器中幾乎無效。可從編譯器的文檔中查看。

[2011.01.28 補充]

#pragma pack(4)
typedef struct {
char Type;
long Offset;
long Size;
char Access;
} FLASH_REGION;
#pragma pack()

32Bits 系統預設是 #pragma pack(4) ,而 FLASH_REGION這個結構的長度為 10 Bytes,為了達到預設對齊的結果,編譯器會將 FLASH_REGION的長度拉長成 12 Bytes (4 的倍數)

而在宣告結束後,重設為預設值︰
#pragma pack()

=> 在 pack() 的括號中不給值,即會重設回預設值。

如此一來,由於 12 為 4 的倍數,因此 FLASH_REGION 的結構就不會再受到影響。

參考資料:
#pragma 預處理指令
Struct Alignment
解析#pragma指令
#pragma pack(1) "是表示什麼意思呢?!

用眼太多全身累 眼睛過勞牽動五臟六腑

電腦已經成為很多人生活中不可或缺的必要,但是專家說,眼睛長期聚焦在電腦螢幕上,一天下來會覺得全身疲憊,甚至頭痛、失眠等現象,從中醫角度看,眼睛與身體經脈相互連通,眼睛過於勞累就會牽連五臟六腑。

中新網報導,眼睛聚焦需要眼部、頸部和肩部不同肌肉和神經的相互協調。研究顯示,眼睛長時間聚焦時,肌肉的緊張度會降低,影響大腦皮層調節肌肉運動的區域,從而使其對頸部、肩部肌肉運動的控制失調,引起肌肉張力增高。當這種緊張長期不能緩解時,相應部位就會出現慢性疼痛。

所以,眼睛可說是最容易受到疲勞侵襲的源頭,當雙眼疲勞時,眼眶周圍會難受、疼痛,眉心酸脹,出現怕光、流淚等症狀,還會頭暈眼花、頸肩酸痛、全身疲乏等情況。

專家說,要想避免這種情況,就不要長時間高強度用眼,看電腦、電視不要超2小時,每隔45分鐘休息10分鐘,可以看看遠處、喝點水或活動一下眼睛。另外,電腦最好調低一點,座位稍微調高一些,這樣可以讓眼睛睜得小一點,比較能保持眼部濕潤。

運動後1小時勿進食?醫師:觀念錯誤

不少人以為運動流汗才有減肥效果,甚至以為運動後1小時內進食會變胖;醫師今天表示,這些都是錯誤的觀念。其實運動後可以先吃點麵包等高升糖指數食物,不要一下子吃太多。

美兆健康管理機構發表錯誤運動習慣調查,針對北區健檢會員進行簡單的問卷調查,回收1010份。結果發現,有53%認為運動時一定要流很多汗才能達到減肥效果;42.5%認為運動後1小時內進食會變胖;37%認為運動後肌肉酸痛代表肌肉拉傷。

美兆健康管理機構院長朱大維表示,流很多汗不代表減肥,就像時下流行包著保鮮膜減肥,但這只是排掉水分,運動完一喝水,體重又回來了。一般來說,要達到減肥效果,每個星期至少要運動3次,且每次超過20到30分鐘。

國泰醫院物理治療師簡文仁受訪表示,運動減肥主要關鍵是心跳及呼吸,過去有人提出「333」的標準,即每周至少運動3次、每次30分鐘,運動後每分鐘心跳達130下。

另外,不少瑜珈、運動老師會告訴學員,運動後1小時內不能進食。朱大維說,其實運動後可以補充一些高升糖指數食物,例如米、麥、麵包等。簡文仁認為,運動後30分鐘內吃東西要溫和,不能吃太多,或者可以多喝點水;運動1小時後吃東西比較沒有禁忌。

還有些人認為騎腳踏車、短跑腿會變粗,簡文仁建議可拉筋或做弓箭步,舒緩小腿肌肉。

Bat To Exe Converter

這一個是不錯的軟體~可以直接把Bat檔案轉換成exe
好處我現在只有想到兩點
1. 如果把它當作預先載入的檔案,就不會有黑色的執行畫面
2. 原始碼不會外流

下載處Bat To Exe Converter

操作方式
先將壓縮檔解壓縮,再雙擊軟體執行檔「Bat_To_Exe_Converter.exe」
接著依序:
1. 於視窗上方選擇 批次檔路徑/名稱(Batch file)和 轉換後的執行檔路徑/名稱(Save as)
2. 在「Options」選單內將 Visible application 更改為 Invisible application
3. (Visible application 選項是指於DOS模式下運行執行檔)

4. 在「Versioninformations」選單內設定圖像檔(*.ico)與填入該執行檔的名稱、版號、說明
5. 與作者名字…等資料(可忽略此步驟)

6. 在「Include」選單內加入想伴隨該執行檔一起運行的程式(可忽略此步驟)

7. 全部設定完成之後,點擊左下角的「Compile」按鈕
8. 便可將 批次檔(*.bat)轉換成 執行檔(*.exe)囉~

註:您亦可視需要,於「Options」選單內設定 工作路徑(Work directory)、是否刪除暫存檔
註:(temporary files)、執行密碼(Encrypt the program)…等選項

參考資料:
免費軟體下載||Bat To Exe Converter-輕鬆將批次檔轉成執行檔

聰明人拚節稅 可三管齊下

工商時報【記者魏喬怡/台北報導】

5月報稅季又即將來到!雖然上班族領薪水的節稅空間有限,但是如果精打細算多利用合法節稅管道的話,還是可省下不少錢,會計師建議,可從降低所得、讓扣除額極大化、扣抵稅額極大化來著手!

資誠會計師許祺昌指出,所得愈少自然繳的稅就愈少,因此第1招就是想辦法降低所得。不過,有些降低所得的方式是平常就要規劃,像是讓所得變成非綜合所得,例如投資海外商品,包括金融商品、房地產;或是將課稅所得變為免稅所得,由於證交所得、期交所得都免稅,因此可透過投資股票、期貨來達成。

另外,就是讓所得可扣除的成本費用極大化。例如包租公、包租婆會有「租賃所得」,可扣除的成本費用有2種,一是採「實際支出成本」或是「房屋出租必要費用標準43%成本扣除」,那麼就可選擇成本算起來較大的來扣除。

第2招則是讓扣除額極大化。勤業眾信會計師林宜信指出,在報稅前一定要算一下到底是「標準扣除額」算出來的扣除額較大,還是用「列舉扣除額」算出來較大。一般來說,列舉扣除額不外乎是捐贈、保險費、醫療及生育、災害損失、購屋借款利息、房租費用等。

因此,像如果是有自用住宅購屋貸款的人,或是有租房子的人採用列舉扣除額就會省很大。因為像單身者的標準扣除額才76,000元,但是購屋借款利息每申報戶最高可有30萬元,而房租費用每戶最高可有12萬元的扣除額。

但林宜信提醒,購屋借款利息只能用原始購屋借款金額的利息來做抵減,例如:原始貸款200萬元、還清本金50萬元,後來又再用房子抵押借款80萬元的話,就只能用150萬元(200萬-50萬)所產生的利息來抵減,而不是用230萬(150萬+80萬)的利息來抵減。

另外,過去教育學費是「每戶」可扣抵2萬5千元,但自97年起已改成「每人」,因此如果家中有2名孩子在就讀大專院校(但空中大學、專校及五專前3年,及已接受政府補助者除外)的話,最多可抵5萬元,而不是只有2萬5千元了。

第3招則是讓扣抵稅額極大化。許祺昌表示,這部份指的是「投資抵減」,也就是說,如果投資於受獎勵企業一定期間可就投資額的一定比例享受抵繳綜所稅,例如投資100萬元在生技公司,可有10萬元的抵稅權。不過,若是最低稅負算出來繳納的稅較少,就不要浪費使用投資抵減的權利,因為,投資抵減可在4年內使用。

2010年4月17日 星期六

透過bat分析目前的路徑

%cd%
當前目錄

%~dp0
目前正在運行的批次檔的所在目錄

%~sdp0
目前正在運行的批次檔的所在的目錄的短名稱

main.bat

@echo off 
SET MYPATHCOPY=%CD%
:search
for /f "delims=\ tokens=1,*" %%p in ("%MYPATHCOPY%") do (
@echo %%~p
SET MYPATHCOPY=%%~q\
)
if "%MYPATHCOPY%"=="\" goto done
goto search
:done
pause

可以把目前的路徑以"\"為分隔,把每一個目錄列出來

可以得知目前所在的資料夾,與目前所在的資料夾的路徑
main.bat
@echo off 
SET Count=0
SET MYPATHCOPY=%cd%
:search
for /f "delims=\ tokens=1,*" %%p in ("%MYPATHCOPY%") do (
@echo %%~p
set /A Count=%Count%+1
SET MYPATHCOPY=%%~q\
)
if "%MYPATHCOPY%"=="\" goto done
goto search
:done
echo %Count%
set /A PreCount=%Count%-1

SET MYPATHCOPY=%cd%
SET index=0
:search1
for /f "delims=\ tokens=1,*" %%p in ("%MYPATHCOPY%") do (
set /a index=%index%+1
echo %index%
if %index% LSS %PreCount% (
if %index% EQU 0 (
SET SOURCE_ROOT=%%~p
) ELSE (
SET SOURCE_ROOT=%SOURCE_ROOT%\%%~p
)
) ELSE (
SET PROJECT_NAME=%%~p
)
SET MYPATHCOPY=%%~q\
)
if "%MYPATHCOPY%"=="\" goto done1
goto search1
:done1
echo %SOURCE_ROOT%
echo %PROJECT_NAME%

pause


最後可以整合成以下的精簡的程式碼
main.bat
@ECHO OFF

REM ===========================================================================
REM ==== GET THE SOURCE_ROOT, PROJECT_NAME AND BUILD_TIP ======================
SET MYPATHCOPY=%CD%
SET TEMP_SOURCE_ROOT=.\
SET TEMP_PROJECT_NAME=.\
SET TEMP_BUILD_TIP1=.\
SET TEMP_BUILD_TIP2=.\
SET TEMP_BUILD_TIP3=.\
:SEARCH
FOR /F "delims=\ tokens=1,*" %%p IN ("%MYPATHCOPY%") DO (
SET TEMP_BUILD_TIP1=%TEMP_BUILD_TIP2%
SET TEMP_BUILD_TIP2=%TEMP_BUILD_TIP3%
SET TEMP_BUILD_TIP3=%%~p
IF "%TEMP_BUILD_TIP1%" NEQ ".\" (
IF "%TEMP_PROJECT_NAME%"==".\" (
SET TEMP_PROJECT_NAME=%TEMP_BUILD_TIP1%
) ELSE (
IF "%TEMP_SOURCE_ROOT%"==".\" (
SET TEMP_SOURCE_ROOT=%TEMP_PROJECT_NAME%
) ELSE (
SET TEMP_SOURCE_ROOT=%TEMP_SOURCE_ROOT%\%TEMP_PROJECT_NAME%
)
SET TEMP_PROJECT_NAME=%TEMP_BUILD_TIP1%
)
)
SET MYPATHCOPY=%%~q\
)
IF "%MYPATHCOPY%"=="\" GOTO DONE
GOTO SEARCH
:DONE
ECHO %TEMP_SOURCE_ROOT%
ECHO %TEMP_PROJECT_NAME%
ECHO %TEMP_BUILD_TIP1%
ECHO %TEMP_BUILD_TIP2%
ECHO %TEMP_BUILD_TIP3%
PAUSE


[2011.12.15 補充]
在BAT可以透過IF DEFINED判斷某一個環境變數是否有被定義
IF NOT DEFINED VALUE echo VALUE does not define

參考資料:
How to check if directory exists in %PATH%?
如何檢查是否存在%的目錄路徑%?
如何在batch文件中取得該文件的路徑

2010年4月14日 星期三

Address Bus與Data Bus的觀念

在電腦中,假設要把資料(0xaa)寫到某一個記憶體位址(0xbb),
則把10111011(0xbb)送到位址線(address bus),因為在硬體中,還是有先後順序(由高位元到低位元依序送出),而什麼時候確定所有的資料都送到哩?
分別有一個R/W的訊號線,當W的這一個bit被拉起來的時候,則表示位址線的資料ready了,這個時候就可以由cpu開始讀取了~

當確定要讀取的位址之後,再來就是傳送把資料放到資料線(data bus),運作的情況也是跟把address bus填滿的方式是一樣的!

在硬體中傳送資料的時間是有差異的,但是,對於軟體的眼光中,傳送資料是同一時間的

2010年4月11日 星期日

聰明媽媽 輕鬆煮(白飯)

1. 快快洗
快速沖洗,養分不流失

2. 一比一
食米:水 = 1:1 ~ 1.2倍
水量影響烹煮米飯的軟硬度,請視偏好決定加水量

3. 泡15分
浸泡約15分鐘,讓米粒飽吸水分。

4. 輕輕翻
米飯煮好後,從底部輕輕翻鬆,讓溼氣散發,蒸發多餘水分

5. 燜10分
翻鬆後再燜10-15分鐘,平衡米飯保溼度。

6. 開飯了

我在軍中的奮鬥史-台大電機所之路

我老弟分享的資料~
=====================================================
作者: fallmanalan (秋人) 看板: Militarylife
標題: [哈拉] 我在軍中的奮鬥史-台大電機所之路
時間: Sat Mar 27 23:31:40 2010

我在軍中的奮鬥史-台大電機所之路
03/19,這天早晨,和往常一樣,做例行性的車輛保養,此時,手機鈴響,電話的那一頭傳來,明儒!你上了!台大電機所正取4!真的假的?〈我道〉核對準考證號碼確認無誤後眼淚便不聽使喚的湧出。

我的名字是鍾明儒,大學唸的是土木,大四那一年,毅然決然的轉考電機所,朋友都說我「跨很大」,由於電機類的考科我還是第一次接觸,記得一開始連接地符號都不懂,想當然爾,結果是出師不利,為了不延遲一年,理想的情況是邊當兵邊應考,若能取得入學資格,那退伍後剛好來的及就讀,當然這只是理想,就像高中化學的理想氣體方程式,需要許多前提與外在條件下的苛刻,而且,十個朋友,會有十一人說:這是不可能的!那第十一個就是聽完前面十人否定後信心動搖的自己,此時,回想起某位老師曾經說過:天下沒有做不到的事,只有想不到的事。誰說當兵不能唸書,心中激起了一股推翻這說法的鬥志。

新訓之後的二階段訓是「射擊兵」,頂著科目學習不易以及教官所言,若沒有拿到結業證書很可能被派去擔任較辛苦的「砲手」的壓力下,要找到閒暇時間準備研究所考試,真的是「狹縫中求生存」,為了騰出可用時間,教官上課時專注聽講以求課後能達到快速複習才能有額外時間準備研考,遠離所謂的「時間小偷」,再來,早上比別人早起一~ 二小時,此時,手電筒便是很好的照明工具,我想,古人鑿壁偷光的心情我能體會了,下課十~二十分鐘也是能應用的時間,通車時間(如坐客運、捷運、火車),放假,部隊休息時間,其運用技巧在於完整時間〈大於一小時〉做大事,如章節理論的複習、模擬考試;瑣碎時間〈小於一小時〉做小事,比如拿張空白紙抄上幾個題目或一些概念性的內容隨身攜帶,下課休息時便可拿出來寫,沒辦法書寫時也能深入思考反芻所學,特別注意的是絕對不要熬夜,早上3小時完成一天工作一書提及:清晨時間足以抵過夜晚2~3倍的時間。榜首這樣K書的一書也指出:你以為榜首常常熬夜?錯!榜首從來不熬夜。早晨,腦袋是最清醒的,邏輯思考也最為順暢,熬夜的結果就是造成隔日的學習效果不佳,導致惡性循環,日復一日,所以,若你習慣當夜貓子,請調整你的作息,如此這般,當拿到射擊兵合格證書的同時也完成複習進度的50%了,下部隊後在盡好自己業務本分的前提下依然遵循此法。

有一位銀行的副理曾說過,一位成功的企業家必須要有迅速的果決力與運動員的意志力,不用懷疑,唸書亦是如此,透過體能上的鍛鍊可以增強意志力,國外研究也指出適量的運動可以活化腦內細胞,使頭腦清醒且變的更聰明,因此,除了平日在部隊例行性的體訓,只要是放假我都會保持一天慢跑5000~10000m以及基本重訓的量,這也讓我從新訓開始在連隊上體能一直名列前矛,早上3小時完成一天工作也指出:武術、運動、樂器、語文是培養意志力的良好途徑。榜首這樣K書的也指出:你的運動量跟你的成績大概是一個正比的關係。因此,保持適量的運動均衡的飲食充足的睡眠積極的態度樂觀的心情養成良好的生活習慣,那不論是從軍、準備考試、亦或是出社會、甚至將來創業,必能卓越而非凡。

我不是個聰明的學生,自認天資平庸、資質駑鈍,但曾有一位老師說過:到羅馬有一萬條路,最快那條叫做「方法」,多吸取前人的經驗與知識,不難發現,其實,高手的思維,在大方向上是雷同的,因襲成功者的做法是必要的,當我複習時我採用樹狀統整型複習法,這是一個將複雜資料分類、條理化、結構重組、提高邏輯性、降低重複性、簡化、有助記憶的方法,很多方面,別想大腦優於電腦,對於記憶性的內容,大腦是沒有太多的Memory的,大腦是拿來當成CPU做中央處理器使用,有位企業家就說:out of sight, out of the mind,不在眼前的事物是很容易忘記的,所以他習慣用筆記本做備忘,唸書亦是如此,再來,活用80/20重點分析法則,他的原意是這世上80%的錢都被社會金字塔頂端20%的人賺走,剩下20%的錢才分佈於其餘80%的人,用於讀書上就變成一份考卷〈假設滿分是100 分〉,那80分會從你所學的20%出,剩下20分就是分布於你所學的80%,這在講,只要你抓住那重點的20%,你就能用最少的時間達到最大的效益。更進階的說法即做好時間管理,推薦大家閱讀幾本書:K書高手-出自呂宗昕教授、早上3小時完成一天工作-出自箱田忠昭、榜首這樣K書的。畢竟,大量的閱讀能促使腦力激盪〈by SONY總裁出井伸之〉。

最後,連上士官長說過一句話:感恩源自於感動,在服役的這段期間,我遇到許多貴人,我獲得的比我付出的還要多,何德何能,這份榮譽是屬於大家的,特別感謝在砲校認識幫了我很多忙的吳彬誠、連長、士官長、幫我求了關聖帝君必勝文具的林振宇,以及連隊上弟兄的連署簽名支持,要感謝的人太多了,無法備載,11個月的服役時間很短,生命中的感謝卻沒有期限。

銘記恩師所言:
天才做得到的事,努力就做得到;天才做不到的事,只要努力,還是做得到。
當別人說我不行時,我說我還可以,當我自己說我不行時,那就真的不行了,今天的自己要勝過昨天的自己!

特別感謝電子學的啟蒙老師 劉明彰老師的30堂電子學的精華把繁複的電子學變的輕鬆有趣且學習容易,以及自動控制 詹森老師,讓我一路走來對控制學始終興趣滿滿,附記:今年報考了台大電機所甲組、台大電子所ICS組兩間,台大電機所正取 4,電子所已過一階段,等待面試結果。

附上成績 得分   核算
英文〈A〉70.00 14.00
工數〈C〉55.00 82.50
電子學〈乙〉51.00 51.00
控制〈C〉73.00 109.50
總分257.00 最低錄取222.90

PS. 由於放假的時間很短,需要的話再找時間補上專業科目的準備細節。

2010年4月4日 星期日

清明節記錄

在台南(台灣?!)有一個習俗,當一個家族有生小男孩的時候,必需要連續掃墓三年,告知祖先我們家族又添丁啦~

因為二年多前,三叔公多了一個孫子,因為,今年是第三年到「安南區第一示範公墓」掃墓啦~不過,值得注意的是,當每一次要找我們的墓地時,因為都忘記了,所以,都要找很久~

因此,就在這裡留下一個記錄吧~

我們主要分為三個墓地~

太祖父(爺爺的爺爺,我是玄孫)在17-3巷

曾祖父(爺爺的爸爸,我是曾孫)在10巷

爺爺和伯父合葬在22巷

要去掃墓要記得帶的東西~
除草用具:手套、鐮刀
遮陽用具:帽子、雨傘
拜拜用具:打火機
滅火用具:水桶(通常會有消防隊在墓地提供水和水袋)

2010年3月28日 星期日

偽嘸蝦米的設定

由之前一直到剛剛,在用偽嘸米的時候,在某一些視窗沒有辦法送出字。

剛剛隨便測試的結果,發現,可能是送字的方式有問題。

把它們改成「使用替代方式」就可以解決這一個問題啦~

NotePad++

在寫程式的時候,面對一堆程式碼,這個時候編輯就非常重要啦~
像是vim,Source Insight、PSPad、Notepad++,每一個都有各的優點~
就好像是Windows與Linux各有各的優點~

今天要介紹的就是Notepad++,主要的網站是.:: NOTEPAD++ ::.:

有一個不錯的功能,叫做支援多重視窗同步編輯

蠻不錯的,而且有Portable的軟體,蠻不錯的軟體

參考資料:
好用的Notepad++

2010年3月19日 星期五

嘸蝦米符號表




2010年3月16日 星期二

設定XP的I386的路徑

設定XP的I386的路徑
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SourcePath

2010年3月13日 星期六

如何快速刪除 Subversion 專用的隱藏目錄

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN]
@="Delete SVN Folders"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN\command]
@="cmd.exe /k \"TITLE Removing SVN Folders in %1 && FOR /r \"%1\" %%f IN (.svn _svn) DO RD /s /q \"%%f\" \""

你只要將以上的註冊檔內容複製下來,並儲存成 DeleteSVN.reg 檔,在雙擊這個檔就可以安裝完成了。

不過這是個很危險的動作,因為這會將所有修訂的紀錄、版本資訊全部都給刪除掉喔,你最好知道你在做什麼,否則不要亂試。

[2010.07.08 補充]
呼~用刪除資料的方式,還是會讓人覺得膽顫心驚的~因此,我們透過dos的xcopy指令,就可以簡單的達到同樣的目的~
xcopy source_directory destination_directory /E
這一個指令會復製所有檔案,包含子目錄下的所有檔案,但是,並不包含系統檔隱藏檔!
可以參考Dos指令 - 複製指令
如此一來,就會產生一個destination_directory的資料夾,是跟原本的svn的資料夾內容是相同的,但是,不會有svn的產物!

參考資料:
如何快速刪除 Subversion 專用的隱藏目錄
Wiki - Windows Registry

記憶力訓練

據意大利《晚郵報》報導,意大利一所大學三名教授進行了這樣的一項實驗:他們挑選了一位記憶中等的青年學生,讓他每星期接受三至五天,每天一小時,背誦由三個數至四個數組成的數字訓練。每次訓練前,他如果能一字不差地背誦前次所記的訓練。就讓他再增加一組數字。經過二十個月約二百三十小時的訓練,他起初能熟記七個數,以後增加到八十個互不相關的數,而且在每次練習時幾乎能記住80%的新數字,使得他的記憶力能同一些具有特殊記憶力的專家媲美。

可見,記憶力通過訓練的確可以提高。事實上,古今中外的許多名人學者都通過各種方法來鍛鍊自己的記憶力。馬克思從少年時代開始,堅持不斷地用一種自己不太熟悉的外語去背誦詩歌,有意識地鍛鍊記憶力;列夫.托爾斯泰也是採用背誦的方式鍛鍊記憶力。他說:"背誦是記憶力的體操。"每天早晨,他都嚴格要求自己強記一些單詞或其他方面的東西,以增強記憶力。宋代詞人李清照採用與丈夫比賽競猜某典故出自某書的方式,在興趣盎然的娛樂中,鞏固了知識,增強了記憶。

專門研究鍛鍊記憶力方法的美國學者布魯諾.弗斯特說:"要具備一個可靠的記憶力,必須每天一刻鐘到半個小時的時間,做一套有計劃的腦力練習,複雜的或簡單的均可,只要能迫使你去動腦筋。"

下面給大家介紹幾種行之有效的記憶力訓練方法:

(1) 積極暗示法

許多人之所以記憶力不佳,是由於對自己的記憶力缺乏自信。在面對一個要記的材料時,這些人常常想:"多難記啊!","這麼多,我能記住嗎?"這種想法是提高記憶力的最大障礙。

美國心理學家胡德華說:"凡是記憶力強的人,都必須對自己的記憶充滿信心。"要想樹立起這種信心就要進行積極的自我暗示,經常在心中默念:"我一定能記住!"。當你對能否記住缺乏信心時,也可以回憶自己過去的成功經驗,如"我曾在全班各科考試成績排前五名""我幾歲的時候就能背許多唐詩"。當這些過去良好的記憶形象再次浮現時,會增強你"一定能記住"的信心。
(2) 精細回憶法

我們在平時的學習和生活中,識記了很多東西,卻很少去回憶。識記和回憶之間的不平衡,使我們的記憶變得十分模糊。

經常回憶,回憶得儘可能精細,是鍛鍊記憶力的好方法。比如:

回憶一間你非常熟悉的房間,想一想房間裡都有什麼?門窗朝哪開?家具都擺放在哪裡?牆上掛有哪些裝飾品?暖氣片和電燈開關在什麼地方?等等。要回憶得儘量完整無缺。當你再次回到到間時,檢查一下你遺漏了什麼。

想一想一小時前你在做什麼?你在哪裡?和什麼人在一起?你們在一起都說了什麼?那個人長得什麼樣?你如何向別人描述他的長相?

回憶一下你最近看過的電影,電影裡都有哪些主要人物?發生了什麼事?他們都做了什麼?結局如何?要儘可能回想電影中每一個鏡頭。

回憶一下你童年的夥伴,你們在一起都做過什麼?還能記起他們的名字嗎?他們的家都住在什麼地方?

(3) 奇特聯想法

聯想是促進記憶的一種方式。比如,我們遇到一個生字:咩。該字由口和羊組成,口即嘴,羊的嘴,除了吃草,還會叫。羊怎麼叫"咩……"字義出來了,字音也知道。咩,羊叫之聲,讀MIE。

奇特聯想是聯想的一種則將要記的東西在頭腦中人為地形成一定衡奇古怪的聯想,從而幫助記憶。比如,要想記住"狗--自行車"這對詞,我們可以想像"狗騎著自行車在馬路上逛來逛去"。有人要記"火車、河流、風箏、大砲、鴨梨、黃狗、閃電、街道、松樹、高粱"共十個詞,他形成如下奇特聯想:一個人登上了高速的火車,火車在河流上奔馳,河流上飄來一個大風箏,風箏上架著一門大砲,大砲的炮筒裡打出來一個大風箏,風箏上架著陸門大砲,大砲的炮筒裡打出來一隻鴨梨,鴨梨打進黃狗的嘴裡,黃狗像一道閃電,迅速地路過街道,爬上一棵老松樹,咬住了老松樹上長著的一棵高粱。

(4) 限時強記法

在規定的時間裡去背誦一些數字、人名、單詞等等,可以鍛鍊博聞強記的能力。比如:

在3分鐘內,背誦圓周率()小數點後30位數字:3.141592653589793238462643383279;

在2分鐘內,背誦十個陌生的人名;

在10分鐘內,背誦十個外文生詞。

(5) 記憶保健操

在頭頸後部找到"天柱"、"風池"二穴,將兩手交凡於腦後,用拇指的指腹腔按壓這兩個穴位,每次按壓5秒鐘,突然加壓,然後將拇指移開,按壓5至10次後,會感到頭腦清醒。

參考資料:
多吃什麼可以加強記憶力,有什麼方法可以鍛練。

vim自動補齊功能

在寫程式的時候,最好希望編輯器在我們打完了部分的字之後,它可以列出讓我們可以選擇的候選字。

像是Source Inside與Visual C++和QTCreate都有這一個功能~沒有錯~vim也可以有這一個功能~

開最一篇文章,是希望最後可以把這一篇文章補成完成像是Source Inside的功能(遠望~)

目前還沒有很多時間去研究,不過,其實,一開始它就有一部分很簡單的自動補齊功能啦~

自動補齊(Auto-completion) (在Insert Mode中使用)
Ctrl-N 自動補齊檔案內的下一個可能字(word)
Ctrl-P 自動補齊檔案內的上一個可能字(word)
Ctrl-X Ctrl-F 自動補齊檔名

參考資料:
給程式設計師的Vim入門圖解說明
在linux下用vim取代source insight (vim 6.4)
用vim替代source insight
使用了盜版source insight慣了,不知道linux有什麼好的編輯軟件
linux下有沒有像source insight 一樣的源程序查看工具阿?

FreeCommander & MDIE

在Windows下面,通常要開很多視窗~

所以,之前有介紹資料夾分頁工具 - QT Tab Bar

它算是把功能加在微軟的檔案視窗上面。

而今天要介紹的兩個軟體是,自己建立一個視窗來管理這一台電腦的檔案系統。

FreeCommander
其實,我一開始會使用它,並不是用來瀏覽檔案,而是它有其中一個功能,就是同步的功能~
瀏覽多個視窗我還是使用QT Tab Bar這一個軟體~
它有一個缺點就是一次只能開啟二個視窗~不過,它可以記錄你之前開的視窗,算是非常好用~又是免費的~
具有「壓縮/解壓縮ZIP、CAB檔」,「解壓縮RAR檔」,以及「檔案分割」的功能、還有「檔案同步」的功能~

[2010.04.22 補充]
列出多個分頁
雜項→設定→顯示→資料夾分頁→也對單分頁顯示分頁欄

把FreeCommander加入右鍵選單
雜項→設定→殼層功能表→加入"FreeCommander"項目到內文功能表予→"資料夾"和"檔案"

[2010.06.10 補充-start]
雜項→設定→程式→編輯程式(F4)可以設定哪一種副檔名,可以指定由特定的編輯器開啟
以下是我設定的例子,我設定所有檔案都是由vim開啟
D:\Portable\PortableApps\gVimPortable\gVimPortable.exe -p --remote-tab-silent
另外一提,後面接的參數是讓當有第一個vim視窗存在時,要開啟第二個檔案的時候,會在第一個vim視窗中開啟一個tab,並且把第二個檔案放入其中,這樣才不會讓整個視窗操作環境變的很雜亂!
[2010.06.10 補充-end]
[2010.08.15 補充]
設定目前在使用的分頁在tab特別的明顯
雜項→設定→顯示→資料夾分頁→顏色→水平漸層色彩

MDIE
這一個就可以同時開啟多個視窗,而且,它跟QT Tab Bar我覺得對我來說有一個最大的優點,就是當ctrl + f時,MDIE會自動跳出另一個tab,不會影響到原先的視窗~
但是,目前中文化還不是很完全~
繁體版下載點

參考資料:
MDIE - 像瀏覽器的「檔案總管」
檔案總管替代軟體 FreeCommander