2009年7月20日 星期一

懶人修片法:使用ACDsee Pro快速拯救你的相片

為什麼要用ACDsee? 只是因為他的看圖功能速度很快,
同時又是少數支援色彩管理的秀圖程式,
Pro版還附加短小精幹的修圖功能,介面也相當友善直覺。

事前準備:ACDsee Pro 2.5版,在這裡有官方的試用版。
啥? 英文版的看不懂?
中文版的介面我才看不懂咧…
選擇英文版還有另一個很重要的原因,有興趣使用這套軟體的可以msn問我。

如果你喜歡這個軟體,可以考慮試用後購買一個合法授權。
如果你不喜歡
要錢的軟體…嗯,可以考慮祖國同胞開發的「光影魔術手」,
功能更強,而且完全免費!

下面開始就是所有的步驟圖解,建議直接連點進相簿去看大張的圖,
因為說明文字都已經寫在圖上囉~

1.開啟ACDsee Pro之後
(注意不是ACDsee QuickView這個程式只能看圖,不能修圖)
(只要在ACDsee QV下面按ENTER鍵就會自動呼叫Pro)
找一張因為高反差而主題偏暗的相片,作為本次教學的實驗對像。
寄件者 ACDSee修圖教學
2.點選「陰影/高光」功能
寄件者 ACDSee修圖教學
3.把陰暗處加亮
寄件者 ACDSee修圖教學

4.把高光部份過曝偏死白的部份還原色彩
寄件者 ACDSee修圖教學

5.調完之後雖然亮部/暗部都有足夠的彩度,但是畫面整體的感覺
會稍微偏向灰暗,所以再選用「亮度」功能把整體亮度拉高
寄件者 ACDSee修圖教學

6.大約加個1/6~1/3格的EV就夠了,加太多的話天空的亮部又會死白
寄件者 ACDSee修圖教學

7.然後來用「裁切」修正一下構圖。
這張相片的在構圖上犯了兩個大忌:水平線中分畫面、天空留白太多
寄件者 ACDSee修圖教學

8.要怎麼裁是見人見志,不見得符合構圖法則的畫面就一定最好看
但是通常會「最穩定」,至少讓你的眼睛不會想離開畫面。
裁切功能會自動出現三等分比例線,非常實用,因為構圖上
最常用到的就是這四條三等分線。
寄件者 ACDSee修圖教學

9.另一個非常重要的構圖重點就是水平線沒有水平
(或是說該垂直的線有沒有垂直),一點點的歪斜(1度以內)
都有可能造成視覺上的不適而讓相片變得不耐看。
寄件者 ACDSee修圖教學

10.這個帶有格線的旋轉功能超好用的!
寄件者 ACDSee修圖教學

11.接下來就是懶人功能的介紹,一鍵搞定。
寄件者 ACDSee修圖教學

12.通常他一開始自動偵測的效果就是最適當的了,對比拉太強
有時候會造成畫面細節大量流失,所以通常我是把效果調弱,
也就是調到拉桿以0以下的負值。
寄件者 ACDSee修圖教學

13.來比較一下整形前後的效果吧
寄件者 ACDSee修圖教學

2009年7月15日 星期三

靜宜大學 = quiet and proper 的好地方…

Providence University 為什麼會叫靜宜大學?
其實是因為創辦人美藉修女Sister Marie Gratia Luking
的中文名字「陸靜宜」而來的。

providence這個字的本意有「神跡」的意思
an influence which is not human in origin and
is thought to control whether or not
people receive the things which they need
也就是指「某種高於人類的存在造就的事實或結果」
此字有時候也直翻譯作「神」,意義接近God但不完全相等。

至於台鐵的英文翻譯…
嗯,把cock翻成「考克」我還可以接受,至少音譯的部份是OK的,
靜+宜 = quiet + proper … 嗯,好像也不能說他有錯…
好啦,我知道,是外包商翻的,台鐵只是沒發現而已,
所以英語教育失敗的不是台鐵,是外包商,
台鐵只是找了英語程度不怎麼專業的廠商來翻譯英語,
英語很好的馬總統一定也覺得這只是小問題,
我國的英語教育還說不上失敗,大家太緊張了。
嗯,一定是這樣。

資料來源:靜宜大學官網、Yahoo!奇摩知識+

2009年7月13日 星期一

sim-panalyzer hack notes

1.定義在Makefile中的敘述:

CFLAGS = $(MFLAGS) $(FFLAGS) $(OFLAGS) $(BINUTILS_INC) $(BINUTILS_LIB) -DARMULATOR -DMODE32 -DMODET -DPANALYZER_H -DLV2_PANALYZER_H

(紅色部份對應到source code 中的 #ifdef敘述)

2.根據sim-panalyzer開頭的#include列表所包含的header檔
#ifdef LV2_PANALYZER_H
#include "./libpanalyzer/technology.h"
#include "./libpanalyzer/panalyzer.h"
#include "./libpanalyzer/clock_panalyzer.h"
----> #define CLOCK_PANALYZER_H
#include "./libpanalyzer/io_panalyzer.h"
----> #define IO_PANALYZER_H
#include "./libpanalyzer/memory_panalyzer.h"
----> #define MEMORY_PANALYZER_H
#include "./libpanalyzer/cache_panalyzer.h"
----> #define CACHE_PANALYZER_H
#include "./libpanalyzer/logic_panalyzer.h"
----> #define LOGIC_PANALYZER_H
#include "./libpanalyzer/uarch_panalyzer.h"
----> #define UARCH_PANALYZER_H

3.FP_PANALYZER_H 已定義,但目前找不到在哪定義的。

4.VANALYZER_H 已定義,但目前找不到在哪定義的。

make file 基本語法

1.主敘述

檔案A: 來源檔B(空格) 來源檔
檔C (換行)
(TAB鍵)產生檔案的命令
project.exe : main.obj io.obj
(tab鍵) tlink c0s main.obj io.obj, project.exe,, cs /Lf:\bc\lib
2.遞迴式副敘述

檔案B: 來源檔b (換行)
(TAB鍵) 產生檔案B之命令
main.obj : main.c
(tab鍵) bcc –ms –c main.c
3.遞迴式副敘述

檔案C: 來源檔c (換行)
(TAB鍵) 產生檔案B之命令

io.obj : io.c
(tab鍵) bcc –ms –c io.c

4.遞迴式副敘述

檔案B (空格) 檔案C : 參考檔h
main.obj io.obj : def.h

2009年7月7日 星期二

gdb常用功能筆記

參考資料來源:RMS's gdb Debugger Tutorial

1.命令列格式:
gdb --args sim-outorder -config ../sa1core.cfg test-math
說明:--args選項會讓gdb把sim-outorder後面跟的argv[]項目傳進被debug的程式sim-outorder

2.gdb常用指令:

run 將目前gdb載入的程式開始執行,直到遇見breakpoint或是觸發watch或是程式自已中斷/結束。
list 顯示程式停止處(breakpoint/watch/或程式本身造成的中止)附近的原始碼。
cont 讓被breakpoint/watch中斷的程式繼續執行。
step 執行1行指令,如果有function call則進入該函式第一行。
next 執行1行指令,如果有function call則完成該函式功能。
kill 將目前gdb載入的程式取消執行,將記憶體內容回復到尚未執行狀態。

break misc.c:20 在原始檔misc.c內的第20行放置breakpoint。
break ruu_fetch 在目前scope內的ruu_fetch()函式入口處放置breakpoint。
watch sim_cycle 在變數sim_cycle放置watch point,任何對該變數的「寫入」都會暫停程式執行。
rwatch 同上,但是觸發條件為「讀取」。
awatch 同上上,但是觸發條件為「讀取或寫入」。
info breakpoints 顯示出所有的breakpoint/watchpoint。
disable 2 關閉表列中的2號breakpoint/watchpoint。

info variables 列出目前scope所可見的global和local變數。
print sim_cycle 印出變數sim_cycle目前的值。
set sim_cycle = 0 將變數sim_cycle的值強制設定為0。
x/s name 以字串模式來顯示name變數的內容,假設name為一字串指標變數(char * name)
x/c name 顯示name指標所指向的第1個字元。
x/4c name 顯示name指標所指向的前4個字元。
x/a name 顯示name變數所內含的位址。
x指令的詳細用法在gdb中使用「help x」可以叫說明。

backtrace 將程式到達目前 breakpoint/watchpoint/或是自行中斷處 之前經過的數個函式呼叫印出來。
frame 2 退回在backtrace所列出來的tace中編號2的frame

2009年7月2日 星期四

ensemble 英語中的法語


ensemble的念法接近 " on-semble"
發音就不像英語,倒是很有法國味。
這個字在法語中的意思是 together
而在英語中是「一整套東西」的意思。

這一整套的有可能是衣服,也有可能是餐具
或是樂團、劇團,只要是滿足某種集團最小編制的都可以。

在講衣服的時候,suit是單純指衣服本身,例如上衣和裙子或褲子;
而如果用ensemble的話,除了衣服本身以外,
還包括了帽子鞋子飾品等「跟衣服搭配」而成就某種風格的週邊物品。

簡單的說ensemble的抽象意義比較接近 suite (注意多了一個e)
只是suite通常指套房、成套的家具,跟衣服沒關係。

資料來源:奇摩知識+、奇摩字典。

指標別亂用之型態轉換密室殺人案: sim-panalyzer 2.0.3 bug-fix log

拿到了新版的sim-panalyzer,但是BUG還是有的…
首先,參考 J.Whitham博士的網頁
把2.02版就存在的bug給修掉。

上述的BUG修完之後,還是會出現下面這個莫明奇妙的錯誤:

fatal: dio should be either odir or bidirBuffer type!

從字面上意思看來是說沒把 DIO 這個模組中 buffer type的參數設定好,
當然事情不會這麼簡單,不然全世界的工程師都回家種田了…

經過跟 GDB 一整個下午的搏鬥,發現:
出包的DIO這個資料結構所屬的 pspec->style 這個變數,
在程式剛開始時,是正確的的依照組態檔被設定成 bidir 列舉型態
但是程式開始執行沒多久(大約第三個指令)
就會被改成一個非常大的數字,大約就是 0xFFFFFFE8 這麼大…

程式一看已經超過列舉型態的上限,當然就吐了一行
dio should be either odir or bidirBuffer type!
的錯誤訊息,同時自動終止sim-panalyzer主程式。

但是原始碼中在讀入命令列參數去初始化pspec->style之後,
就沒有任何程式敘述會動到該變數了,
這不就是密室殺人案嗎?
現場沒兇器,但人死了,倒底是誰殺的?

進一步往回追,發現這個
pspec->style被不正常的篡改
很有可能是附近的另一個引數 pmwindex 因為某種緣故爆走的關係,
因為pspec->style被篡改的同時,
某個指標pmwindex為索引對某個記憶體位址作了寫入動作。
我們都知道指標是一種很恐怖的東西,
因為他賦予你在記憶體空間裡面隨地大小便、四處塗鴨的能力…
而有證人指出,案發當時的pmwindex
曾經從70左右的正常值爆增到 0xFFFFFFEF 這種天文數字,
很明顯的已經讓指標把位址指到某個他不該寫入的地方了

往回追 pmwindex的相關程式,
又發現另一個相關的變數 tstart也會有爆增的現像,
很好,兇手快出現了,仔細檢查tstart是怎麼被更改的,
終於,在 /libpanalyzer/io_panalyzer.c #273 附近,
發現了一個該打屁股的錯誤:

if((lat - plat - pspec->nctcycles) > 0)
tstart = now + lat - plat - pspec->nctcycles;

詐看之下很好很強大是吧? 沒什麼問題啊?
但是仔細的追查這些變數的資料型態,
發現lat, plat pspec->nctcycles這三個出現在IF敘述裡面的變數,
其型態都是 UNSIGNED !!

用減法比大小之前沒有作
型態轉換! 這就是兇手!
都已經是無號數了,不管怎麼作減法,都不會減出負數的!
所以這個if敘述就是 if(1) 永遠執行的意思…
吐血之餘把程式改成:

if(( (int)lat - (int)plat - (int)pspec->nctcycles) > 0)
tstart = now + lat - plat - pspec->nctcycles;

無厘頭錯誤消失,程式正常跑完…

奇妙的是同一個原始檔的另一處有一個一模一樣的錯誤,
但是被某位叫 Ludo的好心人修掉了:

#201
/* Ludo: added some casts here, since all variables are unsigned!
This solves some segmentation faults. */
if(((int)lat - (int)plat - (int)pspec->nctcycles) > 0)
// if((lat - plat - pspec->nctcycles) > 0)
tstart = now + lat - plat - pspec->nctcycles;

送佛也送上西天嘛~
還是這也是某種保護智財權的手段... 囧rz

結論:
1.使用c語言請隨時注意資料型態是否相容。
2.指標這東西威力強大,特別是在您需要密室殺人的時候,實為好用技倆。