2010年9月1日 星期三

在Linux(ubuntu) 中Eclipse 安裝Android ADT & SDK

我們已經裝好了Eclipse 在Linux (ubuntu)
要在Eclipse 寫Android 程式
還需要再安裝ADT (Android Development Tools)
還有Android SDK
首先要先裝ADT 才能裝Android SDK
Step1 安裝Android ADT (Android Development Tools) -Android 的開發工具
1. 點選Help -> Install New Software..
2. 在Available Software 下 按下 右邊的一個"Add" 按鈕
3. 跳出一個Add Repository 視窗,填入下列資訊
<<在線安裝>>
在"Name"的欄位填入: ADT

按下ok ,接著eclipse 就會搜尋合適的版本
下方會出現development Tools 的選項 ,請全選後按install 再按Next 就會開始安裝
如果在這時後有出現error
<<就要使用離線安裝的方法>>
下載後的ADT解壓縮,接著一樣的方法進入到 Add Repository視窗
這時後按旁邊的"Local"按鈕,選我們解完壓縮的ADT
一樣"Name" 填入 ADT, "Location" 已經自動填上了
之後的步驟就跟在線安裝是一樣的
Step 2. 下載安裝Android SDK
1. 先到Android 官網下載SDK,下載完後解壓縮
2. 接著進到Eclipse -> Window -> Preferences
3. 在跳出的Preferences 視窗左邊的欄位選擇Android
4. 接著在右邊的SDK Location 欄位按下"Browse", 選擇解壓縮完的SDK
5. 按下"Apply" 和 "OK" 就會開始安裝SDK
這樣就結束SDK 和ADT的安裝
可以開始寫Android 的程式了~

在Linux 中安裝Eclipse (for Android)

因為案子的需求需要將Eclipse安裝到Linux系統中

就順便筆記一下

其實很簡單就到 Eclipse的官方網站下載Linux 版本的Eclipse

背景環境: WINNDOWS XP 下使用Sun VirtualBox 進入Linux系統

Step1. 下載安裝JDK


在我的例子是選擇

Platform: Linux

下載完後到Linux系統裡執行安裝

會得到一個包含jdk的文件夾,名字會類似jdk1.5 (會依下載版本不同而不一樣,在此處以jdk1.5版為例)

接著打開終端機 用root的身份 依序輸入下列指令

mv jdk1.5 /usr/local/lib ln
-sf /usr/local/lib/jdk1.5/bin/java /usr/bin/java ln 
-sf /usr/local/lib/jdk1.5/bin/javac /usr/bin/javac
p.s root 的身份就是指在 jdk1.5存放的路徑執行

Step2. 下載Eclipse


下載版本: Eclipse IDE for Java EE Developers
(注意! 如果不是下載這個版本很可能在安裝ADT的時後會出現error 無法成功)

下載完後就放到Linux裡解壓縮

會產生eclipse 資料夾

直接點資料夾裡的eclipse.exe執行

這時後會跳出一個error message 讓你無法正確的開啟eclipse

內容是說你沒裝JDK,沒錯我們不是裝了嗎?

在Linux裡我們還要再用終端機讓JDK再安裝到eclipse裡

做法如下:

1. 先進到jdk所在的目錄

2.輸入下列指令

-> sudo apt-get install java


下一篇就是在Eclipse安裝Android 的ADT 和 SDK


2010年8月13日 星期五

Android 入門

最近在看Android
找了一些可以線上看的電子書
覺得還蠻詳細的
從環境的設置開始都教的很清楚
想入門android可以看以下的連結

我個人覺得第一個連結教的比較易懂
也比較接近目前使用的android 版本

在學Android前最好是先看Java
有點Java的基礎概念架構
因為Android 是base on java
真有點後悔為什麼大學的時後沒有好好學小java
T_T 應該說怎麼沒認真學程式

2010年6月10日 星期四

(MFC) SetTimer & KillTimer 的用法

或許大家會想問..
SetTimer是什麼東東?
什麼時後會需要用到SetTimer呢?

嘿~ 我來回答

SetTimer 是一個程式定時器.....
所以當我們需要每隔一段時間執行一件事的時後
就可以用到它囉~

我舉個例好了...
像是做時鐘的功能必須每隔多久就要更新一次時間
這時後就可以用SetTimer來設定多久更新的動作了~

來看一下SetTimer的原型
UINT SetTimer(
HWND hWnd,
UINT nIDEvent,
UINT uElapse,
TIMERPROC lpTimerFunc
);
當使用SetTimer函數的時候,就會生成一個計時器。

函數中nIDEvent指的是計時器的標識,也就是名字。

nElapse指的是時間間隔,也就是每隔多長時間觸發一次事件。

第四個參數是一個回調函數,在這個函數裏,放入你想要做的事情的代碼,

你可以將它設定為NULL,也就是使用系統默認的回調函數,系統默認認的是onTime函數。

這個函數怎麼生成的呢?

你需要在需要計時器的類的生成onTime函數:
在ClassWizard裏,選擇需要計時器的類,添加WM_TIME消息映射,就自動生成onTime函數了。
然後在函數裏添加代碼,讓代碼實現功能。每隔一段時間就會自動執行一次。

例: SetTimer(m_hWnd(指定容器), 1(名稱), 1000(毫秒), NULL(NULL就是到onTime))

如果要增設兩個以上的Timer,那當然就是多用SetTimer

只要名稱取不一樣就可以

接著在onTime裡可以用switch...case的方法來分辨要執行哪一個SetTimer

不需要的時後就要用KillTimer(nIDEvent)


下方的連結有更詳細的SetTimer和KillTimer的用法
http://wenku.baidu.com/view/b52f38b91a37f111f1855b46.html

2010年6月9日 星期三

(MFC) 新增元件function 遇到的問題

我用VS的MFC拉介面弄到一半, Button要加新事件的時候, 系統就冒出這段話

"Add/Remove operation is impossible, because the code element 'XXX' is read only"

我試過把button刪除再重新新增一個

也還是無法替Button 加新事件

最後上網google一下 果然還蠻多人發生類似的事

原因是資料夾的唯讀選項被啟用了

後來我試著把資料夾內容-> 唯讀的功能取消

再開啟project ,但情況還是一樣沒改善

事件還是無法新增

最後在網上找到了二個解決的方法


方法一

1. 把project 資料夾裡的.ncb檔刪除掉

2. 再重新編譯project

3. 創Button 新事件


方法二

從執行->cmd->到project的資料夾-> 打入 attrib -h -r /S

-是關閉選項, h是隱藏檔案屬性, r是唯讀檔案屬性,
/S是處理目前及所有子資料夾

就成功改變資料夾屬性囉~


我只用到方法一就成功了

所以方法二我就沒試了....

我想應該也是有用的吧 ^^

2010年5月3日 星期一

C/C++禁用危險API

這是之前在網路上看到有好心人整理出來的表格
其實這些禁用的API還是可以用,但其實主要目是是為了減少代碼中引入安全漏洞的可能性
如果能避開不用當然是最好的

下面這個表格是禁用的API,各自可以替代的函數

MSDN: http://msdn.microsoft.com/en-us/library/ff468910%28v=VS.85%29.aspx

禁用的API 替代的StrSafe函數 替代的Safe CRT函數
有關字符串拷貝的API
strcpy, wcscpy, _tcscpy, _mbscpy, StrCpy, StrCpyA, StrCpyW, lstrcpy, lstrcpyA, lstrcpyW, strcpyA, strcpyW, _tccpy, _mbccpy StringCchCopy, StringCbCopy,

StringCchCopyEx, StringCbCopyEx

strcpy_s
有關字符串合併的API
strcat, wcscat, _tcscat, _mbscat, StrCat, StrCatA, StrCatW, lstrcat, lstrcatA, lstrcatW, StrCatBuffW, StrCatBuff, StrCatBuffA, StrCatChainW, strcatA, strcatW, _tccat, _mbccat StringCchCat, StringCbCat,

StringCchCatEx, StringCbCatEx

strcat_s
有關sprintfAPI
wnsprintf, wnsprintfA, wnsprintfW, sprintfW, sprintfA, wsprintf, wsprintfW, wsprintfA, sprintf, swprintf, _stprintf StringCchPrintf, StringCbPrintf,

StringCchPrintfEx, StringCbPrintfEx

_snprintf_s

_snwprintf_s


2010年4月28日 星期三

ICRT - 英文聽力練習

最近忽然很想把英文學好
年紀都這麼大了
結果連個第一外語的影子在哪都看不到>"<

現在聽力的練習我是聽ICRT電台
可是都是有聽沒有懂
但在聽之前我已經做好心理準備
一開始我不強求聽的懂
但至少要跟上他們的講話速度
現在似乎有點慢慢跟的上
總之也只能慢慢來吧...

今天我又發現
原來ICRT在播新聞的時後
為了台灣的聽眾有一個特別的服務
在早上十點跟晚上七點的新聞
在前五~十分鐘會先上傳講稿
如果想練習聽力
這真的很有幫助的感覺~
我明天開始要下載來聽!!

2010年3月9日 星期二

(MFC)Thread- Afxbeginthread

先貼上我成功宣告的thread
光宣告就花了我好久的時間...
CChildView.cpp
UINT CChildView::WorkerThreadProc(LPVOID Param) //Sample function for using in AfxBeginThread
{
CChildView* pView = (CChildView*) Param;

return 0;
}

在要呼叫thread的地方寫上
AfxBeginThread(WorkerThreadProc,(LPVOID)this);
CChildView.h
static UINT WorkerThreadProc(LPVOID Param);

會用很久的原因在於我一直不想把WorkerThreadProc 宣告成成員function
我用成全域function 但是一直不能編譯成功
後來只好放棄改用成員function,但宣告成成員function一定要宣告成靜態
不然會一直編譯失敗...

2010年3月2日 星期二

CString:: right && CString ::left 用法

CString Left(int nCount)

Parameters

nCount
Specifies the number of characters to extract from this CString object.

Return Value

A CString object containing a copy of the specified range of characters. Note that the returned CString object may be empty.

Example

The following example demonstrates the use of CString::Left.

// example for CString::Left CString s(_T("abcdef")); ASSERT(s.Left(2) == _T("ab"));
left和right的用法是相同的
只是算個數的方向不同
left - 是從左數到右
right - 是從右數到左

CString cs = _T("abcdef");
字串.left(個數) =>ex. cs.left(2) = _T("ab");
字串.right(個數) =>ex. cs.right(2) = _T("ef");

ReverseFind 使用

最近會用到ReverseFind,之前有找一下資料
可是都會忘....

Return Value

The index of the last character in this CString object that matches the requested character; –1 if the character is not found.

Parameters

ch

The character to search for.

Remarks

Searches this CStringstrrchr. object for the last match of a substring. The function is similar to the run-time function

Example

// Example for CString::ReverseFind
CString s( "abcabc" );
ASSERT( s.ReverseFind( 'b') == 4 );

這是msdn上的解釋
我每次再回來看都是有點看不懂
所以我又上網找了一下別人的解釋

原來有一個跟ReverseFind 類似的字串符搜尋api 就是Find

CString str = "abcdbc";
int x1 = str.Find('b');
int x2 = str.ReverseFind('b');
x2 = 4;
x1 = 1;


後來我終於知道他們的差異在哪 T_T




Find 是找第一個'b'

ReverseFind 是找最後一個'b'

2010年2月23日 星期二

CString GetBuffer() && GetString 差別

CString中提供兩個成員函式讓我們可以取得其字串的指標
一個是GetString() 另一個是GetBuffer()
CString::GetString()
GetString() 使用時機是當我們需要知道其(char *)指標以取得其字元內容
比方說 某個window API需要(char*)指標做為輸入時 我們就可以使用GetString()
不過要注意的是 GetString() 所傳出來的指標是不能被修改的
他只能用來讓我們知道裡面的字元 而不能讓我們對裡面做修改


CString::GetBuffer()
GetBuffer() 他會create出所指定大小的空間出來 這個空間是可以讓我們修改的
很多時候 有的 API 會要一個(char*)的指標作為輸出
如果我們就因為這樣去產生一個(char*)的buffer 給他 等到資料取出來之後
便無法使用CString 的種種方便功能
因此 比較好的做法 便是用GetBuffer()來產生一個buffer空間給他
等到取出來之後 我們便可以直接使用CString來對他操作
GetBuffer() 使用完後 最好是呼叫一下ReleaseBuffer()做為結束

範例

CFile file;
// FILE_NAME 為事先定義好的檔案名稱
if
(file.Open(FILE_NAME,CFile::modeRead))
{
CString szContent;
int nFileLength = file.GetLength();
file.Read(szContent.GetBuffer(nFileLength),nFileLength);
szContent.ReleaseBuffer();
// 取得檔案內容放在szContent中 我們之後可以對其操作
}

2010年1月27日 星期三

TXT Viewer- fopen()

Open File or URL

Function:
FILE *fopen(
const char *filename, // 絕對路徑檔案名稱
const char *mode // 讀檔方式
);
FILE *_wfopen(
const wchar_t *filename,
const wchar_t *mode
);