Friday, February 27, 2009

Grammy 2009

如果要說今年Grammy最大卡司陣容的表演 大概就屬Swagga Like Us這場表演了吧
表演者之眾多再加上全部都是大牌陣容 看起來真的很過癮精彩
但我個人覺得是少了點什麼東西..

Swagga Like Us:


接著介紹的這場據說是臨時加場的 Chris Brown毆打Rihanna的事件而加場的
Al Green、Boyz II Men、Justin這場也是蠻精彩的一場表演 有點復古的感覺 很有feel



最後要介紹的則是這首Dead and Gone 精彩程度絕對不下於前兩首
我個人覺得這場演出是今年Grammy最有看頭的一場演出
Justin的鋼琴搭配上TI緊湊的Flow 再加上整個樂團營造出來的氛圍
可稱得上是整場Grammy看下來最精彩的一場表演

Dead and Gone:


附上Dead and Gone的MV:

Thursday, February 19, 2009

Dev C++ Dynamic-Link Library

因為朋友詢問如何利用Dev C++的環境去Build一個DLL出來,所以就開始動手試試看,也在Google上爬了一些文,有了一點點心得,以下是我測試出來的結果:

在一開始動手,我們使用Dev C++去開啟一個DLL的專案,而開啟的這個專案裡面就會有基本的Hello World DLL版本如下:

dll.h:
#ifndef _DLL_H_
#define _DLL_H_

#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else
# define DLLIMPORT __declspec (dllimport)
#endif

DLLIMPORT void HelloWorld (void);

#endif

dllmain.c:
#include "dll.h"
#include < windows.h >
#include < stdio.h >
#include < stdlib.h >

DLLIMPORT void HelloWorld ()
{
MessageBox (0, "Hello World from DLL!\n", "Hi", MB_ICONINFORMATION);
}


BOOL APIENTRY DllMain (HINSTANCE hInst ,
DWORD reason ,
LPVOID reserved )
{
switch (reason)
{
case DLL_PROCESS_ATTACH:
break;

case DLL_PROCESS_DETACH:
break;

case DLL_THREAD_ATTACH:
break;

case DLL_THREAD_DETACH:
break;
}

return TRUE;
}

上面的程式碼即是屬於DLL的部份,當然我們要Build DLL出來就是為了要使用他,所以我們再實作一個測試這個DLL的程式

test.c:
#include < stdio.h >
#include < stdlib.h >
#include "windows.h"

int main()
{
HMODULE hInst;
void (*CallDll)(void);

hInst = LoadLibrary("testDLL.dll");

(FARPROC*)( CallDll)=GetProcAddress(hInst,"HelloWorld");

CallDll();
FreeLibrary(hInst);

return 0;
}


test.c主要就是先去將我們Build出來的DLL Load到Memory裡,再使用函數指標(CallDLL)去指向我們想要呼叫的函數(利用GetProcAddress),這樣就可以達到函數呼叫的功能,並且可以達到函式庫的動態載入

從以上的例子可以知道,如果想要新增一個函數在DLL裡的話,只需要在想要新增的函數前面加上一個DLLIMPORT的宣告即可。以一個整數相加的函數為例子:


DLLIMPORT int add(int x, int y)
{
return x+y;
}


HelloWorld的例子是一個沒有參數傳遞的例子,但是如果我們寫的函數是有參數的怎麼辦呢?我們只需要在函數指標(此例為CallDll)上做修改即可。以上面整數相加函數(add)為例子


#include
#include

//windows head file
#include "windows.h"

int main()
{
int result;
HMODULE hInst;
int (*CallDll)(int, int);

hInst = LoadLibrary("testDLL.dll");

(FARPROC*)(CallDll)=GetProcAddress(hInst,"add");

result = CallDll(2, 3);
printf("%d", result);
FreeLibrary(hInst);

return 0;
}


在宣告函數指標(CallDll)的地方,我們將它修改為回傳int並有兩個int參數,在GetProcAddress的地方我們指定函數名稱add,接著就像一般我們呼叫函數一樣。這樣就達到我們的目標了

Reference:
DEV-CPP中生成和使用DLL的方法

Tuesday, February 10, 2009

電子零件相關介紹 - 電阻

根據構造,電阻可分為以下幾類:

定值電阻:以帶電阻物質或線圈構成、且不會因任何環境或人為因素而變量的電阻。現時常見的定值電阻有顏色條紋用以識別電阻值、誤差等資料。定值電阻兩端多帶有連接線,以方便裝嵌;部份在集成電路中的定值電阻屬鑲嵌形式。
可變電阻:泛指所有可以手動改變電阻值的電阻器。根據使用的場合,可變電阻有電壓分配器、變阻器等別稱。常見的可變電阻有三個連接端。不同的連接配置可使該種電阻以可變電阻、分壓計,或定值電阻的方式運作。
光敏電阻:跟隨光線的強弱而改變電阻值。
熱敏電阻:跟隨溫度的高低而改變電阻值。
壓敏陶瓷:一種跟隨電壓的高低而改變電阻值的配件。
一種以半導體製成的電阻器擁有負數的溫度係數,能紓緩電子線路中的溫度影響。
除超導體以外的所有導電體均帶有一定電阻。


電阻色環標示法:


Reference:
Wiki 電阻器

電子零件相關介紹 - 電容

電容器的代表字母是C﹝capacitor﹞,單位為法拉﹝farad﹞,但是因為法拉的額度太大並不符合電容實際使用容量大小的標示需要,所以又有較小的微法拉μF﹝micro farad﹞相當於10^-6法拉,以及更小的微微法拉pF﹝pico farad﹞相當於10^-12法拉,以及介於兩者之間的nF﹝nano farad﹞,相當於10^-9法拉。

電容的標示主要有下列幾項,先簡單的來介紹一下:

1. 電容容量:標示著這一個電容的容量大小
2. 電容耐壓:表示此一電容所能承受的最高峰值電壓
3. 電容極性:除了無極性金屬膜電容與陶瓷電容,雲母電容外,一般電容都有極性的分別
4. 容量誤差:容量誤差代表此一型號電容的容量誤差值,誤差值越低代表您買到的電容容量與標示值越相近
5. 電容耐溫:表示電容能承受的工作溫度極限,超過此一限制,電解液可能乾涸或減短壽命。

標示方法

1‧電容容量

(1)以uF為單位:電容容量1uF以上者,直接以數值標示容量,例如10000uF,3300uF。
(2)以pF為單位:第一位數與第二位數代表電容數值,第三個數字代表10的次方,亦即數值後面0的個數。例如電容容量標示為104者,代表10後面有四個0,亦即100000pF。
(3)以nF為單位:電容容量標示為100n代表100x10-9=10-7法拉,亦等於0.1x10-6法拉,所以等於0.1uF。

以上關係可以表示為1uF=102nF=105pF

2‧電容耐壓

電容耐壓以伏特v表示,直接標示在電容外殼或印在套膜上,選用電容時應注意電路電壓峰值並預留餘裕。

3‧電容極性

電容極性一般印刷在電容外殼或套膜上,或以較短的接腳代表負極。

4‧電容誤差:

電容誤差以字母標示如下  
≦10pF
≧10pF




Reference:
零件認識與辨識-電容

Saturday, February 7, 2009

Touch Screen & Future

我們所常說的觸控螢幕其實是包含了兩個部份─Touch Panel、Touch Screen Controller(以下簡稱TSC),Touch Panel就是我們所看到的觸控螢幕,觸控螢幕較細節的原理則是當我們手去觸摸到Touch Panel上時 TSC會偵測並送出中斷訊號(PENIRQ)給MCU,而MCU在接到中斷訊號時 可以知道觸控螢幕被Touch到 但並不知道是在螢幕上的那一個點被觸碰到的,所以接著MCU必須要對TSC送出Command 去抓出X Y的座標值

Linux底下Touch Screen的Device名稱為ts,所以我們可以在/dev底下找到一個ts的device,而/dev/ts又為一個區塊設備 並非像RS232(/dev/ttySX)等是字元設備,所以在處理/dev/ts時需要先了解區塊內有包含了那些訊息

typedef struct {
unsigned short pressure;
unsigned short x;
unsigned short y;
unsigned short pad;
} TS_EVENT;


而/dev/ts包含的訊息就如上述所示,包含x,y等等的訊息。所以我們了解了這些之後 就可以寫程式來測試一下Touch Screen讀出來的訊息囉!程式碼如下:

#include < stdio.h >

typedef struct {
unsigned short pressure;
unsigned short x;
unsigned short y;
unsigned short pad;
} TS_EVENT;

static TS_EVENT ts_event;
static int ts;

int main()
{
ts = open ("/dev/ts", 0);
if (ts < 0) {
fprintf (stderr, "/dev/ts: Can not open touch screen!\n");
return 0;
}

while(1)
{
if(read(ts,&ts_event,sizeof(TS_EVENT)))
{
printf("X=%d,Y=%d,Pressure=%d \n",ts_event.x,ts_event.y,ts_event.pressure);
}

}

return 0;
}


一般我們見到的觸控面板大多都是電阻式的觸控面板,因為成本便宜,技術也算成熟。而像是iPhone的多重觸控方面其實原理就有點不一樣了,它是使用電容式的觸控面板,成本也較電阻式面板高。而像是iPhone的多點觸控操作對程式來說也是去抓取點的位置,你可以透過手的縮小、放大去計算兩指之間的距離,達到縮小放大的功能

關鍵報告式的未來空間操作系統Oblong G-Speak

g-speak overview 1828121108 from john underkoffler on Vimeo.

又一個未來科幻操作的影片,是有關於建築的系統的未來短片,此未來短片由Bruce Branit所拍攝並做後製,故事蠻感人的,有興趣的朋友可以去看看。Bruce Branit也有自己的工作室Branit VFX

World Builder from Bruce Branit on Vimeo.

不知道這些操作系統何時才會真正的普及於我們一般的生活當中..

Reference:
Touch Panel校正Screen
TouchLight: An Imaging Touch Screen and Display for Gesture-Based Interaction
觸摸屏技術發展介紹
Oblong G-Speak
Branit VFX
World Builder