網頁

2011年4月13日 星期三

ObjC的特色


ObjC就是C加上物件導向的特性,很接近Java,比C++精簡,許多概念都是從SmallTalk而來的。

  • 單一繼承,只可以有一個superclass。 
  • C++和JAVA使用 funcation call[Object.funcation(args)],ObjC也是,只是改稱為message,格式改為[Object method:args],使用dynamic binding,並不是在編譯的時候處理。 
  • Category類似Java和C++中的Subclass用來增加原有的Class短缺的method,差別在於Category只能新增method,不能新增變數,而C++和java的subclass可以。 
  • Protocol類似Java的Interface,用來解決沒有多重繼承的問題。

閱讀全文...

GNUstep初探


GNUstep主要提供兩個函示庫,Foundation和AppKit。Foundation用來處理非圖形介面,又稱為GNUstep Base;AppKit用來處理圖形介面,又稱為GNUstep GUI。最後衍生出OpenStep介面,可用在Mach、Windows、Solaris及HP/UX,更進一步成為MacOSX的Cocoa環境。


GNUstep 包含四個主要部份:
1. GNUstep Make:提供類似 Makefile 的功能。
2. GNUstep Base:提供 OpenStep 的 Foundation 程式庫,用於處理非圖形介面的功能。
3. GNUstep GUI:提供 OpenStep 的 AppKit 程式庫,用於處理圖形介面的功能。
4. GNUstep Back:提供與作業系統相關的後端處理,提供 GNUstep GUI 有關繪圖及字型的功能。讓使用者不用考慮作業系統問題。

閱讀全文...

2011年4月12日 星期二

在Windows環境下編譯ObjC


雖然安裝完環境後,也嘗試編譯OK,但想到每次都要打那落落長的一串,心裡就…

懶是進步的原動力,翻完了GCC Online Documents(http://gcc.gnu.org/onlinedocs/)發現,GCC預設的環境變數有OBJC_INCLUDE_PATH,有這個真的方便多了,在unix like環境有.profile可以發揮其妙用了。


1.        UNIX like環境(這邊是Windows底下採用MSYS環境)
1.1.       從 “開始/所有程式/GNUstep/shell” 開啟 MSYS
1.2.       在 home 目錄下,打開 .profile 檔案,此檔案的內容會在每次新進入的shell時執行一次,在檔案裡面鍵入下列兩行:
export OBJC_INCLUDE_PATH=/c/GNUstep/GNUstep/System/Library/Headers/
export LIBRARY_PATH=/c/GNUstep/GNUstep/Library/Libraries/


說明:兩行用來設定ObjC的 header file和library 路徑,GCC會造此設定去尋找所需的檔案。
1.3.       重新開啟MSYS或在原MSYS的命令列鍵入執行
. ~/.profile
編譯看看
$ gcc `gnustep-config –objc-flags` hello.m -o hello -lgnustep-base –lobjc


閱讀全文...

2011年4月11日 星期一

Objective-C環境(使用GNUStep)安裝於Windows


為了建置一個練習Objective-C語言的環境,GNUstep是一個不錯的選擇,一個實作出Cocoa APIs的跨平台開發環境,可以在Linux和Windows平台下使用。底下以Windows(我的電腦為Windows 7)為例。


1.        先至GNUstep的下載頁面(http://www.gnustep.org/experience/Windows.html)下載GNUstep MSYS System、GNUstep Core和GNUstep Devel(不裝這個就無法編譯程式),這邊下載的是0.25.x版本,安裝到Windows上,這樣就會有MinGW這個開發環境和相關程式。
2.        安裝GNUstep MSYS System,標準的windows安裝步驟,同意license,採用預設值,一直按Next就可以安裝完成。








3.        安裝GNUstep Core,標準的windows安裝步驟,同意license,採用預設值,一直按Next就可以安裝完成。







4.        安裝GNUstep Devel,標準的windows安裝步驟,同意license,採用預設值,一直按Next就可以安裝完成。








5.        執行GNUstep的shell視窗
執行 “開始/所有程式/GNUstep/shell” 會出現下面畫面,安裝時都採預設值時,起始目錄對應的實體硬碟目錄為C:\GNUstep\home\<使用者名稱>

6.        又見Hello World
預設環境中會有Vim,打開產生hello.m,鍵入下列程式碼。
#import

int main(int argc, char *argv[]){
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    NSLog(@"Hello World!");

    [pool drain];
    return 0;
}

7.        編譯及執行
在shell視窗鍵入:
gcc `gnustep-config --objc-flags` -L /GNUstep/System/Library/Libraries hello.m -o hello -lgnustep-base –lobjc

./hello 執行



閱讀全文...

2011年3月15日 星期二

iphone預設行事曆同步多個Google行事曆的設定方法

此設定無法在電腦進行,一定要使用iPhone連上網路操作才可以設定完成!
1. 打開Sarfari,輸入 http://m.google.com/sync
2. 因為不支援中文,必須先"變更語言",將語言改成 "English (US)"才行。
3. 登入 Google 帳號。
4. 選擇同步裝置,例如 iphone 。
5. 勾選要同步的行事曆後,save,就設定完成了。
閱讀全文...

iphone 收 Gmail (透過Exchange)

1. 設定->電子郵件/聯絡資訊/行事曆->加入帳號
2. 選擇 "Microsoft Exchange"
3. 填入下列資料:
   電子郵件、使用者名稱、描述:都填您的 @gmail.com 完整帳號
   密碼:填入您的 Gmail 密碼。
   伺服器: m.google.com
   網域: 不用填。
   輸入完了點右上角的「下一步」即可設定完成。
4. 可以選擇要同步的項目,選擇電子郵件和行事曆就好,聯絡資訊不要選,除非你的gmail聯絡人和你的手機聯絡人資料是一樣的。
5. 擷取新資料可以開啟推撥,可以即時知道有mail進來,只是會很耗電。
6. 收不到mail時,請確認你的gmail帳號內的設定,IMAP存取是否有打開。
閱讀全文...

2011年1月4日 星期二

Perl – 字串操作

Perl最強項的能力就在於字串的處理能力,不管是比對、擷取或是核心的regular expression(RE),透過這些處理能讓字串變成非常有用的資訊。


常用的字串操作(可透過 http://perldoc.perl.org/ 來查詢perl function 的使用方式)
length 取得指定字串長度
標準語法:
length EXPR

my $str = “hello”;
print length($str);    # 長度5

控制字元也是有佔長度的
my $str = “hello\n”;
print length($str);    # 長度6

index 取得子字串在主字串第一次出現的位置(找不到傳回-1)
標準語法:
index STR,SUBSTR,POSITION
index STR,SUBSTR

my $mains = “hello world”;
my $subs = “world”;
print index($mains, $subs);     # 印出6

需注意的一點 index 永遠只傳回第一次找到的子字串位置
my $mains = “well, well, well”;
my $subs = “well”;
print index($mains, $subs);     # 印出0

那要如何找出第二個 well 位置,這時就要利用POSITION 來處理,預設值為0
my $mains = “well, well, well”;
my $subs = “well”;
my $first = index($main, $subs);
print index($mains, $subs, $first+1);      # 找到第二個

那要如何找到最後一個子字串出現的位置,用迴圈一直找下去,….
Perl 提供了另一個 rindex function

rindex 取得子字串從主字串最後面往回找的第一個位置
標準語法:
rindex STR,SUBSTR,POSITION
rindex STR,SUBSTR

my $mains = “well, well, well”;
my $subs = “well”;
print rindex($mains, $subs);    # 印出12

substr 取出字串中的某字串
標準語法:
substr EXPR,OFFSET,LENGTH,REPLACEMENT
substr EXPR,OFFSET,LENGTH
substr EXPR,OFFSET

my $str = “Misunderstood”;
print substr($str, 3);         # 印出 understood

沒傳入長度參數,perl會自動取出到字串最後。

my $s = "The black cat climbed the green tree";
my $color        = substr $s, 4, 5;      # black
my $middle     = substr $s, 4, -11;   # black cat climbed the
my $end          = substr $s, 14;        # climbed the green tree
my $tail           = substr $s, -4;         # tree
my $z              = substr $s, -4, 2;     # tr

由標準語法可以看出,substr也可以用在字串取代上,以下各種方法雖然不一樣,但目的是相同的。
my $str = "Love is only rule";
substr($str, 0, 4, "True");         # True is only rule
substr($str, 0, 4) = "Good";     # Good is only rule
$str =~ s/Good/Love/;             # Love is only rule

uc 轉換成大寫
標準語法:
uc EXPR

my $str = “good”;
print uc $str;    # GOOD

ucfirst 首字母轉成大寫

lc 轉換成小寫
標準語法:
lc EXPR

my $str = “GOOD”;
print lc $str;     # good

lcfirst 首字母轉換成小寫

sprintf 格式化字串輸出
標準語法:
sprintf FORMAT,LIST

# Format number with up to 8 leading zeroes
$result = sprintf("%08d", $number);

各式各樣的表示:
%% 百分比符號
%c 字元
%s 字串
%d 包含正負號的十進位整數
%u 不包含正負號的十進位整數
%o 不包含正負號的八進位整數
%x 不包含正負號的十六進位整數
%e 以科學符號表示的浮點數
%f 固定長度的十進位浮點數
%g 用 %e 或 %f 表示的浮點數

%X 以大寫表示的%x
%E 像%e一樣,但以大寫顯示"E"符號
%G 像%g一樣,但以大寫顯示"E"符號
%b binary
%B 像%b一樣,但以大寫顯示"B"符號(在5.8.0版試不出來)
%p a pointer (outputs the Perl value's address in hexadecimal)
%n special: *stores* the number of characters output so far into the next variable in the parameter list

%i 同%d
%D 同%ld
%U 同%lu
%O 同%lo
%F 同%f

format parameter index 這是perl 提供一個很不一樣的功能,讓你能直接明確指出要輸出的順序,例如2$
printf '%2$d %1$d', 12, 34;                    # 印出 "34 12"
printf '%3$d %d %1$d %d', 1, 2, 3;       # 印出 "3 1 1 2"
printf '%2$d %d %d', 1, 2, 3;                 # 印出來的是 “2 1 2”

需注意的地方,當你指明順序後,下一個輸出為你指定的位置後下一個未使用的值。

flag
space       prefix non-negative number with a space
+              prefix non-negative number with a plus sign
-               left-justify within the field
0              use zeros, not spaces, to right-justify
#              ensure the leading "0" for any octal,
prefix non-zero hexadecimal with "0x" or "0X",
prefix non-zero binary with "0b" or "0B"

printf '<% d>', 12; # prints "< 12>"
printf '<%+d>', 12; # prints "<+12>"
printf '<%6s>', 12; # prints "< 12>"
printf '<%-6s>', 12; # prints "<12 >"
printf '<%06s>', 12; # prints "<000012>"
printf '<%#o>', 12; # prints "<014>"
printf '<%#x>', 12; # prints "<0xc>"
printf '<%#X>', 12; # prints "<0XC>"
printf '<%#b>', 12; # prints "<0b1100>"

flag +和space同時出現時

printf '<%+ d>', 12; # prints "<+12>"
printf '<% +d>', 12; # prints "<+12>"

實際上的輸出顯示並不是和perldoc上說的一樣,實際結果如下:
< 12>
<+12>

#. Padding zero
printf '<%#.10d>', 12; # 印出 "<0000000012>"


chomp 移除字串尾端的換行字元
標準語法:
chomp VARIABLE
chomp(LIST)

$a = <STDIN>;       # 從鍵盤(即標準輸入裝置,STDIN)取得一列文字輸入 chomp($a);                # 刪除此輸入字串尾端的換行符號

chop 移除字串的最後一個字元和回傳此字元
標準語法:
chop VARIABLE
chop(LIST)

$str = “0123456789”;
print chop($str);      # return 9
print $str;                 # return 012345678

reverse 字串反轉
標準語法:
reverse LIST

$str = “0123456789”;
print reverse($str);   # return 9876543210



閱讀全文...