တတိယခြေလှမ်း အခြေခံ XSL

XMLရဲ့ Tagများသည် အချက်အလက်တွေရဲ့အဓိပ္ပါယ်များနှင့်၊ ထူးခြားချက်များကိုဖော်ပြပေးနိူင်ပါသည်။ ယခင်အခန်းများတွင် ဖော်ပြပြီးခဲ့သလို XMLသည်အချက်အလက်များကို ဖော်ပြရန်အတွက် Tagများကို လွတ်လပ်စွာ အသုံးပြုနိူင်ပေ၏။ ထို့အတွက် HTMLကဲ့သို့ ပိုင်ဆိုင်တဲ့Tagတွေအသီးသီးကို မည်သို့ဖော်ပြမည် ဆိုသည်ကို ကြိုတင်သတ်မှတ်ထားခြင်းမရှိပေ။သို့ရာတွင် XMLအချက်အလက်များကို ပြင်ဆင်ပြီးလှပစွာ ပုံဖော်လိုကြမည် မဟုတ်ပေလော။  Continue reading “တတိယခြေလှမ်း အခြေခံ XSL”

7 Cross Platform iOS and Android Solutions

iOS ကို သာမက Android ပါ run လို့ ရအောင် application တွေ ရေးဖို့အတွက် SDK List လေးပါ။

Native App Creators

Airplay SDK – သူကတော့ game company တော်တော်များများ အသုံးပြုကြပါတယ်။ cross platform applications အတွက် game ရေးဖို့ဆိုရင် အဆင်ပြေပါတယ်။ 2D/3D Game တွေ ရေးဖို့အတွက် အဆင်ပြေပါတယ်။

Corona SDK – Lua ကို သုံးပြီး app တွေရေးဖို့အတွက်ဆိုရင်တော့ Corona ရှိပါတယ်။ သူကတော့ Actionscript 2.0 နဲ့ တူပါတယ်။ Adobe Developer အဟောင်းတွေက တည်ထောင်ထားတာပါ။ တန်ဖိုးကတော့ $99 per year ပေးဆောင်ရပါတယ်။

Flash CS5 (Adobe Air for iOS ) – Packager ကို သုံးပြီး iOS အတွက် Flash CS5 apps တွေ ဖန်တီးလို့ရပါတယ်။ Mac ကို သုံးစရာမလိုပဲ ရေးလို့ရပါတယ်။ စျေးနှုန်းကတော့ $600 ဝန်းကျင်ရှိပြီးတော့ upgrade လုပ်တာဆိုရင်တော့ $200 ပေးရပါလိမ့်မယ်။

Unity – Game တွေအတွက် သီးသန့်ဆိုရင်တော့ Unity ရှိပါတယ်။ သူက 3D object တွေအတွက် Editor ပါပြီးသားဆိုတော့ တော်တော်လေးကို ကောင်းမွန်တယ်လို့ ဆိုရပါမယ်။ ထို့အတူ စျေးလည်း ကောင်းပါတယ်။ iPhone သီးသန့်အတွက် Unity ဆိုရင် $300 လောက်ပေးရမှာဖြစ်ပြီး Unity Pro ဆိုရင်တော့ $1500 လောက်ကုန်ပါလိမ့်မယ်။ Android အတွက်ပါရေးမယ်ဆိုရင်တော့ $3000 လောက်တော့ ကုန်ကျပါမယ်။

Hybrid App Creators (HTML/Javascript and HTML/ruby based)

Appcelerator – native app ကို HTML/Javascript ကို သုံးပြီး ရေးလို့ရမယ့် နည်းလမ်းပေါ့။ UIWebView ကို သုံးပြီး iPhone မှာ run တာပေါ့။ သူက Free ပါပဲ။

Phonegap – Appcelerator နဲ့ အတူတူပါပဲ။ သူကတော့ Appcelerator ထက်စာရင် ရေးရတာ ပိုလွယ်ပြီးတော့ support နဲ့ communities အားကောင်းတယ်လို့ ဆိုရပါမယ်။

Rhomobile – Ruby ကို သဘောကျတဲ့သူတွေအတွက်ကတော့ Rhomobile က အဆင်ပြေပါလိမ့်မယ်။ ROR သမားတွေ အကြိုက်ပေါ့။ noncommericial application အတွက် free ပါ။

Conclusion

Flash သမားတွေအတွက်တော့ Flash CS5 က အသင့်တော်ဆုံးပေါ့။ Airplay SDK ကတော့ စိတ်ဝင်စားဖို့ကောင်းတဲ့ SDK ဆိုလည်း မမှားပါဘူး။ Corona ကတော့ စျေးနည်းနည်းများတယ်လို့ ထင်ပါတယ်။ နောက်ပြီး Lua language ကိုလည်း လေ့လာဖို့ လိုလိမ့်မယ်။ Corona စျေးများတာကတော့ Unity စျေးများတာကို မမှီဘူးလို့ဆိုရမလားပဲ။ သို့ပေမယ့် Unity က Game Development အတွက် တော်တော်လေးကို ကောင်းမွန်ပါတယ်။ Game Development အတွက် invest မလုပ်ဘူးဆိုရင်တော့ မစဉ်းစားသင့်ပါဘူး။

HTML/Javascript solutions အတွက်ဆိုရင်တော့ Appcelerator ဖြစ်ဖြစ် Phonegap ဖြစ်ဖြစ် အဆင်ပြေပါတယ်။ web developer တွေအတွက် iPhone , Android app အမြန်ရေးဖို့အတွက်ပေါ့။ Appcelerator ကတော့ သူ့ javascript တွေ သိထားဖို့လိုတယ်။ ထပ်လေ့လာဖို့လိုတာပေါ့။ Phonegap ကတော့ လက်ရှိ HTML5 application ကို iPhone , Android အတွက် ချက်ခြင်း ပြောင်းလိုက်ရုံပဲလေ။ ROR သမားတွေအတွက်တော့ ထွေထွေထူးထူး ပြောစရာလိုမယ်မထင်။ Rhomobile က အဆင်ပြေဆုံး ဖြစ်လိမ့်မယ်။

reference: http://maniacdev.com/2010/09/cross-platform-iphone-and-android-solutions/

3 Opensource iPhone Game on App Store

iPhone game တွေထဲမှာလည်း Opensource Game လေးတွေ ရှိပါတယ်။ အောက်မှာပြထားတဲ့ game ၃ ခုဟာ လက်ရှိ app store မှာ ရှိနေတဲ့ game ပါ။

အဲဒီအတွက် source ကိုတော့ github မှာ ရှိထားပြီးသားပါ။

Continue reading “3 Opensource iPhone Game on App Store”

Learn Objective-C : Day 5

ကဲ… Part 5 ကိုတောင် ရောက်လာပါပြီဗျာ။ ဒီနေ့မှာတော့ memory mangagement အပိုင်းကို လေ့လာရအောင်။ Script Language တော်တော်များများ (PHP ကဲ့သို့ ) ဟာ memory management ပိုင်းကို အလိုအလျောက်ဆောင်ရွက်ပေးပါတယ်။ ဒါပေမယ့် Objective-C မှာကတော့ သတိထားဖို့လိုပါတယ်။ object ကို create လုပ်ပြီးရင် release လုပ်ပေးဖို့လည်းလိုပါတယ်။

Other Articles In This Series

iPhone Development လုပ်ပြီဆိုရင် memory management ပိုင်းက အရေးပါပါတယ်။ ဘာလို့လည်းဆိုတော့ iPhone က memory limit က Desktop နဲ့ ယှဉ်ရင် နည်းပါတယ်။

Two Approaches

Objective-C မှာ memory management အတွက် methods ၂ မျိုးရှိပါတယ်။ ပထမက reference counting နဲ့ ဒုတိယကတော့ garbage collection ပါ။ သင့်အနေနဲ့ စဉ်းစားလို့ရတာကတော့ manual နဲ့ automatic ပေါ့။ reference counting ဆိုတာက programmer က code ထည့်ပေးရပြီး garbage collection ကတော့ system ကို အလိုအလျောက် memory managing လုပ်ခိုင်းတာပေါ့။ Garbage collection က iPhone မှာ အလုပ်မလုပ်ဘူးဆိုတာကို သတိထားဖို့လိုပါတယ်။ အဲဒါက Mac developer တွေအတွက်သာ အသုံးဝင်ပါတယ်။

Reference Counting

ကဲ… ကျွန်တော်တို့app ကို memory manage ဘယ်လိုလုပ်မလဲ။ ပထမဆုံးအနေနဲ့ ဘယ်အချိန်မှာ code က memory ကို အသုံးပြုပါသလဲ။ ကျွန်တော်တို့တွေက class instance (object) ကို ဖန်တီးလုပ်ပြီဆိုတာနဲ့ memory က allocated လုပ်ပါတယ်။ object က သေးသေးလေးပေမယ့် app က တဖြည်းဖြည်း ကြီးလာတာနဲ့အမျှ memory ပြဿနာတွေက ဖြစ်လာနိုင်ပါတယ်။

ကဲ.. ဥပမာ တစ်ခုလောက် ကြည့်ရအောင်။ ကျွန်တော်တို့ Drawing App တစ်ခုဆွဲပါတယ်။ user ဆွဲတဲ့ shape တစ်ခုတိုင်းက separate object တွေပေါ့။ ကျွန်တော်တို့မှာ shpare 100 ဆိုရင် object 100 memory ပေါ်မှာ နေရာယူသွားပါလိမ့်မယ်။ screen ကို clear လုပ်ပြီး နောက်ထပ် shape 100 ထပ်ဆွဲမယ်။ ကျွန်တော်တို့ဟာ memory manage မလုပ်ခဲ့ရင် အသစ် shape 100 လည်းပြီးရော object 200 memory ပေါ်မှာ နေရာယူထားပြီလေ။ အဲလိုမျိုးတွေ လုပ်နေရင် ကြာလာတဲ့အခါမှာ memory တွေ အရမ်းစားပါလိမ့်မယ်။

ကဲ… ကျွန်တော်တို့ reference counting နဲ့ စဉ်းစားကြည့်ရအောင်။ create new object လုပ်လိုက်တိုင်း memory ပေါ်မှာ နေရာယူသွားတယ်။ object က count 1 ဖြစ်သွားပြီ။ နောက်ထပ် object ဆောက်ရင် retain count က 2 ဖြစ်သွားပြီ။ တကယ်လို့ release ပြန်လုပ်လိုက်ရင် retain count က decrease ဖြစ်ပြီး 1 ဖြစ်သွားပါလိမ့်မယ်။ ထပ်ပြီး decrease လုပ်လိုက်ရင် 0 ဖြစ်သွားမယ်။ zero ဆိုရင် ထိန်းမထားတော့ပဲ memory ပေါ်မှာ free ဖြစ်သွားပါပြီ။

Syntax

ကျွန်တော်တို့ ပထမဆုံး object တစ်ခုကို တည်ဆောက်ပါမယ်။ object တစ်ခုကို အောက်ကလို တည်ဆောက်ပါမယ်။

myCarClass *car = [myCarClass alloc];

ကျွန်တော်တို့ object ဆောက်ပြီးသွားရင် manual release သို့မဟုတ် autorelease ကို နောက်ပိုင်းမှာ လုပ်ပါမယ်။ သတိထားဖို့က object ကို manual release လုပ်ပြီးမှ autorelease ကို သွားခိုင်းလိုက်ရင် application က crash ဖြစ်သွားနိုင်ပါတယ်။

ကျွန်တော်တို့ oject ကို alloc နဲ့ တည်ဆောက်ပြီးပါပြီ။ အဲဒါတော့ reatin လုပ်ပါမယ်။ object က ဆောက်လိုက်တော့ object count က 1 ဖြစ်သွားပါပြီ။

[car reatin];

ထပ်ပြီး reatin လုပ်လိုက်တော့ count က 2 ဖြစ်သွားပါတယ်။ ဒါကြောင့် ကျွန်တော်တို့ ၂ ကြိမ် release လုပ်ပေးဖို့လိုပါတယ်။

Autorelease and Autorelease Pool’s

XCode မှာ create project တစ်ခုဆောက်တဲ့အခါမှာ အချို့ code တွေက autorelease အတွက် ရေးထားတာကို သတိပြုမိမှာပါ။ code က အောက်ကလို မျိုး ပုံစံလေးပေါ့

NSAutoreleasePool * pool =[[NSAutoreleasePool alloc] init];
[pool drain];

Note: documentation အဟောင်းတွေမှာတော့ နောက်ဆုံး လိုင်းက drain အစား release ဖြစ်နေမှာပါ။ တကယ်တန်းတော့ အတူတူပါပဲ။ drain ပဲ သုံးသုံး release ပဲ သုံးသုံးအဆင်ပြေပါတယ်။

အပေါ်က code က autorelease အတွက်အလုပ်လုပ်ထားတာပါ။ ကျွန်တော်တို့တွေက object ကို autorelase message ပို့ထားလိုက်ပါတယ်။ drain message ကို sent လိုက်တဲ့အခါမှာတော့ object က release လုပ်သွားပါတယ်။ autorelease က အသုံးဝင်ပါတယ်။ pool စဆောက်တဲ့အချိန်ကနေ drain မလုပ်ခင်ထိ သုံးထားတဲ့ object တွေကို drain လုပ်တဲ့အချိန်မှာ အကုန် release လုပ်လိုက်ပါတယ်။ ကျွန်တော်တို့တွေ object ကို reatin count လုပ်ပေးနေစရာမလိုတော့ပဲ relase လွယ်လွယ်ကူကူ လုပ်ပေးလိုက်လို့ရပါတယ်။

Nested Autorelease Pool’s

nested autorelease pool နဲ့ ပတ်သက်ပြီးတော့ အကြမ်းရှင်းပြပေးလို့ရပါတယ်။ အဲဒါကို ဘာကြောင့်သုံးရတာလဲ။ တစ်ခါတစ်လေ loop ပတ်နေတဲ့အချိန်မှာ tempoary object ကို ဆောက်တဲ့ အခါလေးတွေ ရှိပါတယ်။

ဥပမာ။။ loop လုပ်နေတဲ့အခါမှာ temporary object ၂ ခု ဆောက်လိုက်ပါတယ်။ မလိုချင်တဲ့အခါမှာ အဲဒါကို autorelease ပြန်လုပ်ဖို့လိုပါတယ်။ အောက်က code လေးကို လေ့လာကြည့်လိုက်ပါ။

void main()
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

NSArray *args = [[NSProcessInfo processInfo] arguments];

for (NSString *fileName in args) {

NSAutoreleasePool *loopPool = [[NSAutoreleasePool alloc] init];

NSError *error = nil;
NSString *fileContents = [[[NSString alloc] initWithContentsOfFile:fileName
encoding:NSUTF8StringEncoding error:&error] autorelease];

/* Process the string, creating and autoreleasing more objects. */

[loopPool drain];
}

/* Do whatever cleanup is needed. */
[pool drain];

exit (EXIT_SUCCESS);
}

အဲဒီ code လေးက တော်တော်ကောင်းပါတယ်။ အဲဒီမှာ ကျွန်တော်တို့အနေနဲ့ pool တစ်ခုကို စဆောက်လိုက်တယ်။ ပြီးတော့ loop ထဲဝင်တယ်။ Loop ထဲမှာ pool ကို ထပ်ဆောက်တယ်။ အဲဒီ အချိန်မှာပဲ object ၂ ခု ထပ်ဆောက်တယ်။ ပြီးတော့ loopPool ကို drain လုပ်လိုက်တယ်။ ဒါကြောင့် pool စဆောက်တဲ့အချိန်ကနေပြီး drain လုပ်တဲ့ကြားက object တွေကို autorelease လုပ်သွားပေးပါလိမ့်မယ်။ object တွေ create လုပ်ခဲ့တဲ့အတွက် စိုးရိမ်စရာမရှိတော့ဘူးပေါ့။ နောက်ဆုံး program ပြီးသွားတော့ drain ထပ်လုပ်လိုက်တယ်။ ရှိနေတဲ့ object တွေကို အကုန် clear လုပ်သွားပေးတယ်။

loop ထဲမှာ သုံးထားတဲ့အတွက် loop လုပ်တဲ့အချိန်မှာ object တွေများလာပြီး memory တွေစားမှာ စိုးရိမ်စရာမလိုတော့ဘူးပေါ့။ တကယ်လို့သာ release သာ ပြန်မလုပ်ပေးရင် loop တွေများလာလေလေ memory က သုံးတာ များလာလေလေ ဖြစ်မှာပေါ့။

retainCount

အပေါ်မှာတုန်းကတော့ reatin နဲ့ပတ်သက်ပြီးပြောထားပြီးပါပြီ။ reatin ဘယ်နှစ်ခုရှိလဲ သိဖို့အတွက် reatinCount ကို အသုံးပြုနိုင်ပါတယ်။

NSLog(@"retainCount for car: %d", [car retainCount]);

retainCount က integer ဖြစ်တဲ့အတွက်ကြောင့် %d ကို သုံးထားပါတယ်။

Wrapping Up

Memory management က new programmer တွေအတွက် အနည်းငယ် နားလည်ရခက်ခဲနိုင်ပါတယ်။ အထူးသဖြင့် script langauge က လာတဲ့ programmer တွေအတွက်လည်း ခေါင်းရှုပ်စေနိုင်ပါတယ်။ ဒါပေမယ့် Objective-C မှာက memory management ကို ကိုယ်ပိုင် စိတ်ကျ ဖန်တီးနိုင်တဲ့အတွက်ကြောင့် program ပေါ့ပါးမှုက programmer ရဲ့ object တည်ဆောက်မှုနဲ့ release လုပ်မှုပေါ်မှာ မူတည်နေပါတယ်။ နားမလည်တာတွေကို မေးနိုင်ပါတယ်။

Next Time

နောက်တစ်ပိုင်းမှာတော့ Objectiv-C နဲ့ ပတ်သက်ပြီး ရိုးရှင်းတဲ့ code တွေအကြောင်းရေးသားသွားပါအုံးမယ်။

reference: http://mobile.tutsplus.com/tutorials/iphone/learn-objective-c-day-5/

Learn Objective-C Day 4

ပြီးခဲ့တဲ့ အပိုင်းတွေကတော့ အခြေခံလေးတွေကို ပြန်နွှေးပြီးပါပြီ။ ပြီးခဲ့တဲ့ အပိုင်း တွေကတော့

ကဲ .. အခု Day 4 လေး စလိုက်ရအောင်

Getting Started

အရင်ဆုံး Xcode ကို ဖွင့်လိုက်ပါ။ MacOSX အောက်က Applications ကို ရွေးပြီး Command Line Tool ကို click လုပ်လိုက်ပါ။ Type ကို Foundation လို့ ရွေးလိုက်ပါ။ File name ကို အဆင်ပြေတာပေးပါလိုက်ပါ။ ကျွန်တော်ကတော့ CarApp လို့နာမည်ပေးလိုက်တယ်။ ပြီးရင် ကျွန်တော်တို့တွေ New Class ဆောက်ဖို့လိုပါတယ်။ Command-N သို့မဟုတ် File > New File ကို သွားပါ။ Coca Class အောက်က Objective-C Class ကို ရွေးပါ။ subclass ကတော့ NSObjective ပဲ။ Next လုပ်ပြီးနောက် SimpleCar.m ဆိုပြီး နာမည်ပေးလိုက်ပါ။ ပြီးရင် Finish လုပ်လိုက်ပါ။

Coding the Interface

SimpleCar.h ကို ဖွင့်လိုက်ရင် အောက်ကလို မြင်ရပါလိမ့်မယ်။

#import <Cocoa/Cocoa.h>

@interface SimpleCar : NSObject {

}

@end

ဆိုတဲ့ file လေး ရလာပါမယ်။ Cocoa.h ကြောင့် ကျွန်တော်တို့တွေ NSString, NSMutableString စတာတွေ အသုံးပြုလို့ရလာပါတယ်။ ဟုတ်ပြီ။ Car နဲ့ ပတ်သက်တဲ့ Attribute တွေ ကျွန်တော်တို့တွေ ထည့်ရအောင်။ ဘာတွေလည်းဆိုတော့

  • Make
  • Model
  • VIN

စတာတွေပေါ့။ တခြား Properties တွေ ရှိပေမယ့် အခုတော့ ဒီလောက်ပဲ ထည့်ထားပါမယ်။ အဲဒါကို Cocoa မှာ ဒီလို ရေးလိုက်ပါတယ်။

@interface SimpleCar : NSObject {

NSString* make;

NSString* model;

NSNumber* vin;

}

@end

ကျွန်တော် တို့တွေ ပြီးခဲ့တဲ့ နေ့တုန်းကပြောခဲ့ဘူးပါတယ်။ Data တွေကို ဖတ်ဖို့ ရေးဖို့အတွက် function တွေ လိုအပ်ပါတယ်။ ဒီတော့ ကျွန်တော်တို့ method တွေ ထည့်ပါမယ်။

@interface SimpleCar : NSObject {

NSString* make;

NSString* model;

NSNumber* vin;

}

// set methods

- (void) setVin: (NSNumber*)newVin;

- (void) setMake: (NSString*)newMake;

- (void) setModel: (NSString*)setModel;

// convenience method

- (void) setMake: (NSString*)newMake

andModel: (NSString*)newModel;

@end

ဒါတွေကတော့ ကျွန်တော် Class ရဲ့ SET mthod ပေါ့။ နောက်ပြီးတော့ Parameter ၂ ခုနဲ့ function တစ်ခု ပါထည့်သွင်းထားပါတယ်။ Data Type တွေ တူညီအောင် ကျွန်တော်တို့တွေ ထည့်ပေးဖို့လိုပါတယ်။ ဥပမာ။။ vin က NSNumber ဖြစ်တဲ့အတွက်ကြောင့် setVin ကိုလည်း NSSNumber paramter ပို့ထားတာပေါ့။ နောက်ပြီးတော့ method တွေကို @end မတိုင်ခင်နဲ့ } အဆုံးမှာ ရေးရတာကို သတိထားစေချင်ပါတယ်။ ဟုတ်ပြီ။ Set Method တော့ ပြီးပြီ။ Get method ရေးရအောင်။

// set methods

- (void) setVin: (NSNumber*)newVin;

- (void) setMake: (NSString*)newMake;

- (void) setModel: (NSString*)newModel;

// convenience method

- (void) setMake: (NSString*)newMake

andModel: (NSString*)newModel;

// get methods

- (NSString*) make;

- (NSString*) model;

- (NSNumber*) vin;

return ပြန်စရာလိုတဲ့အခါမှာတော့ ကျွန်တော်တို့တွေ (void) ကို သုံးလို့မရတော့ပါဘူး။ Return ပြန်မယ့် data type ကို ထည့်သွင်းပေးဖို့လိုပါတယ်။

Coding the Implementation

အခု ကျွန်တော်တို့တွေ SimpleCar.h မှာ ပါမယ့် variable တွေ mehtod တွေ ရေးပြီးပါပြီ။ SimpleCar.m မှာ ကျွန်တော်တို့တွေ စပြီး Implement လုပ်ဖို့ လိုလာပါပြီ။ အပေါ်က method တွေမှာ ပါတဲ့ အတိုင်း function တွေကို အောက်ကလို ချရေးလိုက်ပါတယ်။

#import "SimpleCar.h"

@implementation SimpleCar

// set methods

- (void) setVin: (NSNumber*)newVin{

}

- (void) setMake: (NSString*)newMake{

}

- (void) setModel: (NSString*)newModel{

}

// convenience method

- (void) setMake: (NSString*)newMake

andModel: (NSString*)newModel{

}

// get methods

- (NSString*) make{

}

- (NSString*) model{

}

- (NSNumber*) vin{

}

@end

make , model , vin အတွက်ကတော့ return ပြန်ဖို့ပဲ လိုတဲ့အတွက် ဒီလို ထပ်ပြီး ရေးလိုက်တယ်။

- (NSString*) make {

return make;

}

- (NSString*) model {

return model;

}

- (NSNumber*) vin {

return vin;

}

ဒီမှာ တချက် သတိထားဖို့က ကျွန်တော် variable ကို return ပြန်လိုက်တာပါ။ Method Name က သပ်သပ် variable name က သပ်သပ်ပါ။ method name အတိုင်း return ပြန်တာ မဟုတ်ပါဘူး။ variable name အတိုင်း method name ကို လိုက်ရေးရတာ မဟုတ်ပါဘူး။

ကဲ.. ရှေ့ဆက်ရအောင်။ ကျွန်တော်တို့တွေ အခြား set method ကို implement လုပ်ဖို့ လိုပါပြီ။

// set methods

- (void) setVin: (NSNumber*)newVin {

[vin release];

vin = [[NSNumber alloc] init];

vin = newVin;

}

- (void) setMake: (NSString*)newMake {

[make release];

make = [[NSString alloc] initWithString:newMake];

}

- (void) setModel: (NSString*)newModel {

[model release];

model = [[NSString alloc] initWithString:newModel];

}

// convenience method

- (void) setMake: (NSString*)newMake

andModel: (NSString*)newModel {

// Reuse our methods from earlier

[self setMake:newMake];

[self setModel:newModel];

}

ဒီ code ကို ကြည့်ရင် ရှုပ်ထွေးသွားပါလိမ့်မယ်။ အခြား Language တွေနဲ့ မတူတာက NSStirng တို့ NSNumber တို့ကို clear လုပ်ချင်တဲ့အခါမှာ release ဆိုတာလေးကို သုံးရပါတယ်။ နောက်ပြီးတော့ alloc နဲ့ init လုပ်ပေးဖို့လိုပါတယ်။ အခြား Language တွေနဲ့ မတူညီတဲ့ အချက်တွေကြောင့် ခေါင်းနည်းနည်း ရှုပ်ရတတ်ပါတယ်။ code တွေ ရေးပြီးရင်တော့ memory ပေါ်ကနေ ပြန်ရှင်းဖို့လိုပါတယ်။ program ကို ပိတ်တဲ့အခါမှာ memory ပေါ်ကနေ အကုန် ရှင်းချခဲ့ပေးရပါမယ်။

-(void) dealloc

{

[vin release];

[make release];

[model release];

[super dealloc];

}

ဆိုတာလေးကို ထပ်ဖြည့်လိုက်ပါတယ်။

ကဲ.. အခုတော့ Implementation အဆင့်တော့ ပြီးသွားပါပြီ။ နောက်တဆင့် Testing ပေါ့။

Testing the Class

ကဲ… အခု Test အဆင့်ကို ရောက်လာပါပြီ။ ကျွန်တော်တို့ ရေးထားတာတွေ မှန်မမှန် စမ်းရအောင်ဗျာ။

CarApp.m ကို ဖွင့်လိုက်ပါ။

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

// insert code here…

NSLog(@”Hello, World!”);

[pool drain];

return 0;

}[/objc]

အဲလို မျိုး ရေးထားတာလေးကို တွေ့မှာပါ။ အဲလိုရေးထားတာလေးကို အောက်ကလို ပြင်ကြည့်ရအောင်။

#import &lt;Foundation/Foundation.h&gt;

#import "SimpleCar.h"

int main (int argc, const char * argv[]) {

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

SimpleCar *myCar = [[SimpleCar alloc] init];

NSNumber *newVin = [NSNumber numberWithInt:123];

[myCar setVin:newVin];

[myCar setMake:@"Honda" andModel:@"Civic"];

NSLog(@"The car is: %@ %@", [myCar make], [myCar model]);

NSLog(@"The vin is: %@", [myCar vin]);

[myCar release];

[pool drain];

return 0;

}

အဲလိုလေး ရေးပြီးတဲ့အခါမှာတော့ Build and Run ကို နှိပ်လိုက်ပါ။ ဘာမှ မမြင်ရရင် Run > Console ကို နှိပ်လိုက်ပါ။ Console Log မှာ The car is: Honda Civic , The car is: 123 ဆိုပြီး ပေါ်လာတာကို တွေ့ရပါလိမ့်မယ်။

Property and Synthesize

ကဲ .. ကျွန်တော်တို့တွေ အဆင်ပြေပြေနဲ့ code တော့ ရေးပြီးသွားပြီ။ Objective-C နဲ့လည်း Class ဆောက်လို့ရသွားပြီ။ ဒါပေမယ့် code တွေက ရှည်နေတယ်။ အဲဒီအတွက် @property နဲ့ @synthesize ကို သုံးပြီး ချုံလို့ရပါတယ်။

ကျွန်တော်တို့တွေ ပြီးခဲ့ SimpleCar.h ကို အောက်ကလို ပြောင်းလိုက်ပါမယ်။

@interface SimpleCar : NSObject {

NSString* make;

NSString* model;

NSNumber* vin;

}

@property(readwrite, retain) NSString* make;

@property(readwrite, retain) NSString* model;

@property(readwrite, retain) NSNumber* vin;

// convenience method

- (void) setMake: (NSString*)newMake

andModel: (NSString*)newModel;

@end 

အများကြီးကို တိုသွားပါတယ်။ setMake နဲ့ vin method ၂ ခုကို ပေါင်းပြီး ရေးလိုက်တာပေါ့။ @property က Interface မှာ ကြေငြာထားတာတွေကို ပြန်ထည့်ထားတာပါ။ readwrite လုပ်မယ်လို့ ဆိုလိုတာပေါ့။ အဲလိုပြင်လိုက်တော့ SimpleCar.m ကို လည်းပြင်ဖို့လိုလာပါပြီ။ အဲဒီတော့ ဒီလို ပြင်လိုက်ပါတယ်။

#import "SimpleCar.h"

@implementation SimpleCar

@synthesize make, model, vin;

- (void) setMake: (NSString*)newMake

andModel: (NSString*)newModel {

[self setMake:newMake];

[self setModel:newModel];

}

@end

SimpleCar.h မှာ ကြေငြာထားတာတဲ့ Properties ကို အလုပ်လုပ်ဖို့အတွက် @synthesize နဲ့ variable တွေ ကြေငြာလိုက်ပါတယ်။ ဒါကြောင့် setMake, setModel စတာတွေကို သုံးလို့ရတာပေါ့။

အခုဆိုရင်တော့ Objective-C အကြောင်း အနည်းငယ်တော့ သိလာပြီလို့ထင်ပါတယ်။ နောက်နေ့တွေမှာ ဒီထက် ပိုပြီး ပျော်စရာကောင်းတဲ့ code တွေနဲ့ ရှေ့ဆက်သွားပါအုံးမယ်ဗျာ။

reference: http://mobile.tutsplus.com/tutorials/iphone/learn-objective-c-day-4/

Learn Objective-C: Day 3

အခြား အပိုင်းက Series တွေကတော့

Class from Apple (and some history)

Apple မှာ classes တွေ အများကြီးရှိပြီး တော်တော်များများဟာ NS နဲ့ စပါတယ်။ NS ဆိုတာက NextStep ရဲ့ အတိုကောက်ပေါ့။ NeXT ဆိုတာကတော့ Steve Jobs Apple ကနေ ထွက်ပြီးနောက်ပိုင်းမှာ workstation computer တွေပေါ်မှာ run ဖို့ operation system တွေပါ။ NeXTSTEP မှာ object orientated programming ကို အသုံးပြုထားပါတယ်။ NS ကလည်း NeXTSTEP ကနေ ဆင်းသက်လာတာပါ။ Apple က NeXTSTEP ကို ဝယ်ပြီးနောက် Mac OS X ကို NeXTSTEP ပေါ်မှာ အခြေခံခဲ့ပြီး ထုတ်ခဲ့ပါတယ်။

အချို့ common classes တွေကို အောက်မှာ ဖော်ပြထားပါတယ်။

  • NSString ကတော့ string စာကြောင်းတွေ အတွက်ပေါ့။
  • NSMutableStrng ကတော့ mutable string တွေအတွက်ပါ။
  • NSArray ကတော့ immutable object တွေ အတွက်ပါ။
  • NSMutableArray ကတော့ object array mutable တွေအတွက်ပေါ့။
  • NSNumber ကတော့ number တွေအတွက်ပေါ့။

object က immutable ဆိုတာကတော့ object ကို create လုပ်ပြီး assign လုပ်တဲ့အခါမှာ value က static ဖြစ်သွားပါတယ်။ ပြန်ပြောင်းလို့မရတော့ပါဘူး။ တကယ်လို့ object က mutable ကတော့ ပြောင်းလဲလို့ရတဲ့ dynamic ပေါ့။ object ကို create လုပ်ပြီး နောက်ပိုင်း ပြန်ပြောင်းလို့ရပါတယ်။

Pointers and Initializing

ကဲ.. code လေးကို အရင် ကြည့်ရအောင်

#import

int main (int argc, const char * argv[]) {

NSString *testString;
testString = [[NSString alloc] init];
testString = @"Here's a test string in testString!";
NSLog(@"testString: %@", testString);

return 0;

}

Xcode ကနေ File > New Project > Mac OSX > Application > Command Line Tool > Type: Foundation ကနေ create လုပ်ထားလိုက်တာပါ။ ပေးထားတဲ့ နာမည်နဲ့ source folder အောက်က extension .m file လေးကို အပေါ်က code လို ပြင်ကြည့်ပါ။

အပေါ်က code တွေကနေ ရှင်းပြပါမယ်။

int main(int argc, const char * argv[]) { 

C သမားတွေကတော့ သိပြီးသားပါ။ program တစ်ပိုဒ်စရင် main နဲ့ စပါတယ်။ two parameter ရှိပြီး , နဲ့ ပိုင်းထားပါတယ်။ arguments passing လုပ်ဖို့အတွက်ပေါ့။

NSString *testString;
testString = [[NSString alloc] init];

အဲဒါကတော့ testString ကို pointer နဲ့ create လုပ်ပြီး NSString object ကို ခေါ်လိုက်တာပေါ့။ အပေါ်က တစ်ကြောင်းပြီးသွားပေမယ့် tesString က object အနေနဲ့ပဲ ရှိနေအုံးမှာပါ။ နောက် တစ်ကြောင်းကမှ testString ထဲမှာ init လုပ်ပေးလိုက်တာပါ။

အဲဒါကို အောက်ကလို ပြန်ပြင်ရေးလို့ရပါတယ်။

testString = [NSString alloc];
[testString init];

nested ရေးတာကတော့ တစ်ကြောင်းတည်းပြီးသလို အခု လို ၂ ကြောင်းနဲ့ ရေးလိုက်လည်း ရပါတယ်။

testString = @"Here's a test string in testString!";

NSString မှာ စာတွေ ထည့်ဖို့အတွက် @ sign ကို ရှေ့ ဆုံးမှာ ထည့်ဖို့လိုပါတယ်။

NSLog(@”testString: %@”, testString);

%@ ဆိုတာကတော့ Objective-C object ကို ဆိုလိုတာပါ။ %@ နေရမှာ testString ကို အစားထိုးမှာပါ။ ကဲ … အပေါ်က code ကို run ကြည့်လိုက်ပါ။ Command + Shfit + R ကို နှိပ်ပြီး Debugger Console ကို ဖွင့်ဖို့လိုပါတယ်။ NSLog နဲ့ ထုတ်ထားတာတွေကတော့ Debugger Console မှာပဲ မြင်ရမှာပါ။

Inheritance

NSString ကို ကျွန်တော်တို့ သိပါပြီ။ NSMutableString , NSArray စတာတွေကလည်း single NS Class တွေပါပဲ။ code တွေ အားလုံးမှာ init လုပ်ဖို့ လိုပါတယ်။ အဲလို လုပ်ရတာ အလုပ်ပိုတယ်လို့ ထင်နေတယ်မဟုတ်လား။ ဟုတ်ပါတယ်။ root Class က NSObject ဖြစ်ပြီး သူ့ ပေါ်မှာ implemented လုပ်ထားရပါတယ်။ ဘာကြောင့်လည်းဆိုတော့ အဆင့်ဆင့် inherit အချင်းချင်းလုပ်ထား ပါတယ်။

NSMutableString ဆိုရင် NSString က parent ပါ။ NSString ရဲ့ parent ကတော့ NSObject ပါ။

NSObject မှာ method အသုံးပြုဖို့အတွက် init လုပ်ပါတယ်။ ဒါကြောင့် subclass တွေမှာလည်း init ပါလာပါတယ်။ NSObject ဟာ တကယ်တန်းတော့ return ကိုယ့်ဘာသာ မပြန်ထားပါဘူး။ ဒါကြောင့် method တွေကို overwritten လုပ်လို့ရပါတယ်။ NSArray class ဟာ init ကို override လုပ်ထားပြီး functionality တွေ ပေါင်းထည့်ထားပါတယ်။ အဲဒါကြောင့် memory avaiable ဖြစ်ဖို့အတွက်ရယ် လိုအပ်တဲ့ instance variable တွေကိုလည်း ပြင်ဆင်နိုင်ပါတယ်။

inheriting classes တွေက ထပ်ပြီး extend လုပ်နိုင်တဲ့အတွက် အသုံးဝင်လှပါတယ်။ ကျွန်တော်တို့တွေဟာ extend class ကို ထပ်ဆောက်ပြီး လိုအပ်တဲ့ functionality တွေကို ထပ်မံ ဖြည့်ပေးနိုင်ပါတယ်။ ကျွန်တော်တို့ ကိုယ်ပိုင် NSString version ကို ဖန်တီးပြီး methods တွေ ထပ်ဖြည့်နိုင်ပါတယ်။

Summary

ကျွန်တော်တို့ Class တွေကို ဘယ်လို အသုံးချရမလဲ ဘယ်လို Inheritance လုပ်ထားလဲ။ နောက်ပြီး inheritance လုပ်ထားတဲ့အတွက် ဘယ်လို အသုံးဝင်သလဲဆိုတာတွေကို ဖော်ပြထားပါတယ်။

ဒီအပိုင်းက ကျွန်တော် သိပ်ပြီး ပိုင်နိုင်မှု မရှိပဲနဲ့ ဘာသာပြန်ထားရတဲ့ အပိုင်းဆိုလည်း မမှားပါဘူး။ မှားနေတာတွေ ရှိရင် ထောက်ပြနိုင်ပါတယ်။

reference: http://mobile.tutsplus.com/tutorials/iphone/learn-objective-c-day-3/

Learn Objective-C: Day 2

Day 2 ကို မစခင် အရင်တုန်းက ရေးခဲ့တဲ့ Day 1 လေးကို ပြန်ညွှန်းလိုက်ပါတယ်။

Object Orientated Programming

ကျွန်တော်တို့ ဘာလို့ Objective C ကို သုံးရတာလဲ။ ဘာဖြစ်လို့ C language ကို မသုံးရတာလဲ။ ဘာလို့လည်းဆိုတော့ Objective C ဟာ Object Orientated Programming ဖြစ်ပြီး Application တွေကို တည်ဆောက်ရမှာ လွယ်ကူစေပါတယ်။ OOP ဆိုတာကတော့ programming paradigm တစ်ခုပါ။ သူက Software တစ်ခုကို တည်ဆောက်တဲ့အခါမှာ object တွေ attribute တွေ နောက်ပြီး function တွေ ပါဝင်လာပါတယ်။ OOP မှာ data abstraction, encapsulation, modularity, polymorphism, နဲ့ inheritance တွေ ပါဝင်ပါတယ်။ OOP အကြောင်းပြောရရင် စာအုပ် တစ်အုပ်စာ ဖြစ်သွားပါလိမ့်မယ်။ ဒါကြောင့် စာပြန်နွှေးတဲ့အနေနဲ့ ဒီနေ့မှာတော့ အခြေခံလေးတွေ ပြောသွားပါမယ်။

စဉ်းစားကြည့်လိုက်ပါ။ သင့်မှာ ကား တစ်စီးရှိတယ်။ အဲဒီ ကား ကို object လို့ သတ်မှတ်လို့ရပါတယ်။ ကမ္ဘာပေါ်မှာ ကားတွေ အများကြီးရှိပါတယ်။ ဒါကြောင့် ကားတွေမှာ properties တွေ ရှိလာတယ်။ model , color , engine type စသည်ဖြင့် အများကြီးရှိပါတယ်။ OOP အရဆိုရင် car က abstract class ဖြစ်ပြီး အဲဒီ class ပေါ်မှာ အခြေခံပြီး အခြား car တွေကို ဖန်တီးလို့ရပါတယ်။ car အသစ်တစ်ခုမှာ မူရင်း ကားမှာ သတ်မှတ်ထားတာတွေ အပြင် အခြား properties တွေ ပါလာနိုင်ပါသေးတယ်။

ဟုတ်ပြီ။ ဒါဆိုရင် ဘာကို object လို့ ခေါ်တာလဲ။ အရာတော်တော်များများဟာ Object တွေလို့ သတ်မှတ်လို့ရပါတယ်။ ဥပမာ လူဟာလည်း Object တစ်ခုလို့သတ်မှတ်ရင်လည်း ရပါတယ်။ Object တစ်ခု ထဲမှာ Properties တွေ function တွေ ပါဝင်လာပါတယ်။ လူဟာ လက် ၂ ဖက် ခြေ ၂ ချောင်း properties တွေ ပါဝင်ပြီး လက်တွေ ခြေတွေ ကို ခိုင်းစေဖို့ function တွေ ပါဝင်ပါတယ်။ ဒီလောက်ဆို နည်းနည်း ရှင်းမယ်ထင်တယ်။ OOP သင်ခဲ့တဲ့သူတွေကတော့ လွယ်လွယ် ကူကူ နားလည်နိုင်ပါလိမ့်မယ်။

Class ဆိုတာကလည်း Object ကိုခေါ်တာပါပဲ။ Object က class ကနေ ဖန်တီးထားတာပါ။a နောက်ပိုင်းမှာ တဖြည်းဖြည်းနဲ့ နားလည်ပါလိမ့်မယ်။ အခုထိ ဘာမှ မမြင်ရသေးတော့ နည်းနည်း စိမ်းနေသေးတာမို့ OOP ကို သိခါစကလူတွေ အတွက် ခေါင်း ရှုပ်ကောင်း ရှုပ်ပါလိမ့်မယ်။

Method

ဟုတ်ပြီ။ car ဆိုတဲ့ Object ရှိတယ်။ car မှာ ဆီဖြည့်တာရှိမယ်။ မောင်းတာ ရှိမယ်။ ကွေ့တာရှိမယ်။ နောက်ဆုတ်တာ ရှိမယ်။ ဒါသူ့ရဲ့ Method တွေပေါ့။ Objective C မှာ method ကို ခေါ်ရင် အောက်ကလို ခေါ်ပါတယ်။

[recipient message];

ဒါဆိုရင် car ဆိုတဲ့ object မှာ gas ဖြည့်တာ ဆိုရင် အောက်ကလို ခေါ်ပါလိမ့်မယ်။

[dansCar addGas];

ဒါက Objective C မှာ ခေါ်တဲ့ ပုံစံ ပါ။ Programming Langauge တော်တော်များများကတော့ အောက်ကလို ခေါ်ကြတာ များပါတယ်။

dansCar.addGas();

Objective C ဟာ အခြား programming language တွေနဲ့ ရေးသားတဲ့ syntax က နည်းနည်းလေး ကွဲပြားတဲ့အတွက် Objective C ကို မလေ့လာပဲ iPhone Development ကို ကူးတဲ့အခါမှာ syntax တွေကြောင့် စိတ်အနှောင့်အယှက် ဖြစ်ရတတ်ပါတယ်။

Attributes

gas ကတော့ ဖြည့်ပြီးသွားပြီ။ gas tank ထဲမှာ gas ဘယ်လောက်ရှိလဲသိရဖို့အတွက် လိုလာပါပြီ။ gas tank ထဲမှာ gas 50% ရှိတာလား။ 100% ရှိတာလား ဆိုတာကို သိဖို့လိုပါတယ်။ အဲဒီအတွက် attribute variable လိုလာပါပြီ။ Attribute ဆိုတာကတော့ ဒီ class အတွက် သီးသန့် variable ပေါ့ဗျာ။ OOP နားလည်ပြီးသားသူတွေအနေနဲ့တော့ ပြောလိုက်တာနဲ့ သဘောပေါက်မယ်ထင်ပါတယ်။ OOP အားနည်းတဲ့သူတွေ နားမလည်ရင်လည်း comment မှာ မေးလို့ရပါတယ်။ အားမငယ်ပါနဲ့။ Objective C လုပ်ရင်း OOP ကို နားလည်သွားပါလိမ့်မယ်။

Interface and Implementation

Objective C မှာ အဓိက အားဖြင့် file 2 file ပါဝင်ပါတယ်။ .m နဲ့ .h file ပါ။ Interface ကို .h နဲ့ သိမ်းပြီး implementation ကိုတော့ .m နဲ့ ရေးပါတယ်။

Interface

#import <Cocoa/Cocoa.h>

@interface Car : NSObject {

//This is where attributes go
float fillLevel;

}

//This is where methods go
- (void)addGas;

@end

အဲဒါက Interface တစ်ခု ဖန်တီးထားတာပါ။ ဒါက Objective-C ရဲ့ .h file အခြေခံပေါ့။ ဒီ ဥပမာ က syntax သဘောတရားပဲ ပြထားတဲ့အတွက် run လို့ရမှာမဟုတ်ပါဘူး။ Car ကို Interface တစ်ခု အနေနဲ့ တည်ဆောက်လိုက်တယ်။ NSObject ကတော့ Car class က NSObject ကို inherits လုပ်ထားတယ်ကို ပြောတာပါ။ Attribute အနေနဲ့ Float value fillLevel ပါပါတယ်။ နောက်ပြီး function အနေနဲ့ addGas ဆိုတာ ပါပါတယ်။ (void) ဆိုတာကတော့ return value မရှိဘူးလို့ ဆိုလိုတာပါ။ C နဲ့ ဆင်ပေမယ့် syntax လေးတွေက နည်းနည်း ကွာပါတယ်။

Implementation

#import "Car.h"

@implementation Car

-(void) addGas {
// code goes here to add gas
}

@end

ဒါကတော့ Implementation ပိုင်းဖြစ်တဲ့ .m အပိုင်းပေါ့။ interface မှာ ပြောထားတဲ့ function ကို implementation လုပ်ပါတယ်။ နောက်ပြီး interface မှာ ကြေငြာထားတဲ့ attribute ကို ခေါ်ယူပြီး အသုံးပြုလို့ရပါတယ်။ addGas ကနေ gas ဖြည့်တဲ့ function ကို ရေးသားရပါမယ်။

ကဲ.. ဒီနေ့တော့ ဒီလောက်ပါပဲ။ အခုဆိုရင် Objective C အကြောင်း အနည်းငယ် သိသွားလောက်ပါပြီ။ နောက်နေ့တွေမှာ Objective C အကြောင်းကို ဆက်သွားပါမယ်။ အခုတော့ အခြေခံ သဘောတရားလေးတွေ နွှေးပြီးပြီမို့ Objective C အပိုင်းကိုပဲ ဆက်သွားပါတော့မယ်။

reference : http://mobile.tutsplus.com/tutorials/iphone/learn-objective-c-2/

Learn Objective C : Day 1

Objective C series ထဲမှာ အခြား အပိုင်းများ

Objective C ဆိုတာ ဘာလဲ။

Objective C ဆိုတာကတော့ Objective Oriented Language တစ်ခုဖြစ်ပြီး C Language ပေါ်မှာ အခြေခံထားခြင်းဖြစ်ပါတယ်။ သူဟာလက်ရှိ Mac OS X နဲ့ iOS အတွက် အဓိက programming language တစ်ခုပါပဲ။ အရင်တုန်းကတော့ NeXTSTEP OS ရဲ့ အဓိက language တစ်ခုပါ။ အဲဒီ OS ကို apple က ဝယ်ပြီး OS X ကို ထုတ်လုပ်ခဲ့ပါတယ်။

Objective C ဟာ C ကို အခြေခံထားပြီး C ကိုလည်း run နိုင်ပါတယ်။ Objective C ဟာ C ပါ run နိုင်တာကြောင့် C လုပ်နိုင်သမျှ အကုန်လုံးကို Objective C က လုပ်နိုင်ပါတယ်။

ဘာတွေ လိုအပ်သလဲ။

အခု ကျွန်တော်တို့ iPhone Development မလုပ်သေးခင် Objective C အကြောင်းကို သိထားဖို့လိုပါတယ်။ Objective C ကို စမ်းဖို့အတွက် XCode ကို သွင်းတဲ့အခါမှာ Mac OSX SDK ကိုပါသွင်းခဲ့ဖို့ လိုပါလိမ့်မယ်။ iPhone SDK ကို သွင်းတဲ့အခါမှာ XCode , Interface Builder အပြင် အခြား Application တွေပါပါဝင်ပါတယ်။ ထို့အတူ gcc ကိုလည်း အလိုအလျောက်သွင်းသွားပါလိမ့်မယ်။

Objective C ကို လေ့လာတဲ့ အခါမှာ C ကို အခြေခံသိထားတဲ့ သူတွေဆိုရင် ပိုကောင်းပါလိမ့်မယ်။ C programming language က programmer တော်တော်များများရဲ့ ပထမဆုံး အခြေခံ language ဆိုလည်း မများပါဘူး။ တကယ်လို့ C ကို မလေ့လခဲ့လည်း ကိစ္စတော့ သိပ်မရှိပါဘူး။ Programming ကို တတ်ကျွမ်းထားရင် လေ့လာနိုင်ပါလိမ့်မယ်။

iPhone Development လုပ်ဖို့အတွက် Mac OSX လိုအပ်ပါတယ်။ Intel CPU Mac တွေ လိုအပ်ပါတယ်။ ဒါကြောင့် Mac user မဟုတ်တဲ့သူတွေအတွက် Objetive C ကို လေ့လာလို့ ရမှာမဟုတ်ပါဘူး။ နောက်ပြီးတော့ Objective C ကို အဓိက ထားမှာ ဖြစ်တဲ့အတွက်ကြောင့် iPhone Development ကို ချက်ခြင်း ကူးမှာ မဟုတ်ပါဘူး။ Objective C အခြေခံမရှိပဲ iPhone Development ပိုင်းကို ကူးတဲ့အခါမှာ ပြဿနာတွေ ကြံုတတ်ပါတယ်။

Compile လုပ်ခြင်း

GCC က ကျွန်တော်တို့ စက်တွေထဲမှာ ရှိနေပြီးသား ဖြစ်တဲ့အတွက် သီးသန့် သွင်းနေစရာ မလိုတော့ပါဘူး။ တစ်ခါတည်း code တွေကို compile လုပ်လို့ရပါတယ်။ အခု အပိုင်းမှာတော့ C ကိုပဲ Mac မှာ ဘယ်လို compile လုပ်သလဲဆိုတာလေးကို အခြေခံအနေနဲ့ ရေးသားမှာပါ။ Application -&gt; Terminal ကို ဖွင့်ပြီး Terminal ကနေ ကျွန်တော်တို့ gcc ကို compile လုပ်ရပါတယ်။

[lang name=shell]$gcc inputfile.m -o outputfile[/c]

အဲလို မျိုး compile လုပ်ပြီးသား program ကို run ဖို့အတွက်ကတော့

[lang name=shell]$./outputfile[/c]

ဆိုပြီး run လိုက်လို့ရပါတယ်။

The Basics

ကဲ … ကျွန်တော်တို့တွေ ဥပမာလေး တစ်ခုလောက် စမ်းရအောင်။ Desktop ပေါ်မှာ Test ဆိုတဲ့ Folder လေး ဆောက်လိုက်ပါ။ Texteditor မှာ C code ကို အောက်ပါ အတိုင်း ရိုက်နိုင်ပါတယ်။

#include &lt;stdio.h&gt;
int main(){
printf("Hello World\n");
return 0;
}

ပြီးတဲ့ အခါမှာ Test ဆိုတဲ့ Folder ထဲမှာ program1.m နာမည်နဲ့ သိမ်းလိုက်ပါ။ Terminal ကို ဖွင့်ပြီး

$cd ~/Desktop/Test
$gcc program1.m -o program1
$./program1

အဲဒါဆို compile လုပ်ပြီးသား program ကို run လိုက်တဲ့အခါမှာတော့ Hello World ဆိုတဲ့ စာလေးထွက်လာပါလိမ့်မယ်။ code လေးကတော့ ရှင်းရှင်းလေးပါပဲ။ computer တက္ကသိုလ် first year ပြီးထားတဲ့သူတိုင်း သိတဲ့ code လေးပါ။ printf နဲ့ ထုတ်ပြီး \n ကတော့ တစ်ကြောင်းဆင်းထားလိုက်တာပါ။

Variable

Variable ကတော့ data တွေကို memory ပေါ်မှာ သိမ်းဖို့အတွက်ပါ။ Variable တွေမှာ variable type တွေ ရှိပါတယ်။ ဒါတွေကတော့ programming အခြေခံတတ်ထားပြီးသားသူတွေအတွက် သိပြီးသားလို့ ထင်ပါတယ်။ variable type တွေကတော့

  • int – integer နံပတ်တွေကို သိမ်းဖို့အတွက်ပါ။
  • char – character တွေကို သိမ်းဖို့အတွက်ပေါ့။
  • float – ဒဿမ ကိန်းတွေအတွက်ပါ။
  • double – ဒဿမ ကိန်းတွေအတွက်ပါပဲ။ ဒါပေမယ့် သူက float ထက် ပိုပြီး အရေအတွက်များပါတယ်။

variable ကို ဘာလို့ အသုံးပြုရသလဲဆိုတော့

1+10 = 11

ဖြစ်ပါမယ်။ အမြဲ ပုံသေ မဟုတ်ချင်တဲ့အခါမှာတော့ variable ကို အသုံးပြုပါတယ်။

1+i= ?

အဲဒါဆိုရင် နံပတ်တွေက အမျိုးမျိုး ဖြစ်နိုင်တယ်ပေါ့။ variable ထဲမှာ ထည့်ထားတဲ့ နံပတ်ပေါ်မှာ အခြေခံပြီးတော့ အဖြေလည်း ပြောင်းသွားပါလိမ့်မယ်။ ဟုတ်ပြီ။ အပေါ်က c code လေး ကို အောက်ကလို နည်းနည်းထပ်ပြောင်းပါမယ်။

#include &lt;stdio.h&gt;
int main(){
int someNumber = 123;
printf("My number is %i \n", someNumber);
return 0;
}

အဲဒါကို run လိုက်ရင် 123 ဆိုပြီး ဖြစ်သွားပါလိမ့်မယ်။ printf ကို သုံးတဲ့အခါမှာ variable ပေါ်မယ့် နေရာတွေကို ဘာ variable ဆိုပြီး data type ပေါ်မူတည်ပြီး text လေးထည့်ပေးရပါတယ်။ အခု ဥပမာမှာ %i ကို ထည့်ထားတာ တွေ့ပါလိမ့်မယ်။ အဲဒါက someNumber က int ဖြစ်နေလို့ပါ။ အခြားဟာတွေအတွက် အောက်မှာ ကြည့်နိုင်ပါတယ်။

  • %i – integer အတွက်
  • %f – float အတွက်
  • %e – double အတွက်
  • %c – char အတွက်

ဒါတွေက အရေးကြီးပါတယ်။ C မှာ သာမဟုတ် နောက်ပိုင်း Objective C ကို ရေးသားရာမှာလည်း အသုံးများလာပါလိမ့်မယ်။ အဲဒီအထဲမှာ character က string အတွက် အသုံးပြုမယ်ဆိုရင် အခန်းတွေ အများကြီးနဲ့ တွဲပြီး အသုံးပြုရပါတယ်။ ဥပမာ။။ Hello World ဆိုတဲ့ စာလုံး ၁၁ လုံး မှာဆိုရင် chr[0] က H ပေါ့။ အဲလိုမျိုး 0 ကနေ စပြီး 10 အထိ အခန်းပုံစံတွေနဲ့ အသုံးပြုရပါတယ်။

Conditionals

လောကမှာ အရာအားလုံးက တဆင့်ပြီး တဆင့်ဖြစ်နေတာ ရှိနေသလို အချို့နေရာတွေမှာကတော့ ဒါဖြစ်ရင်ဒါလုပ် မဖြစ်ခဲ့ရင် ဒါလုပ် ဆိုတဲ့ Conditional တွေ ရှိပါတယ်။ Programming မှာလည်း ရှိပါတယ်။ အဲဒီအခါမှာ programming မှာ if နဲ့ အသုံးပြုပါတယ်။ code ကတော့ အောက်မှာ ဥပမာ ပေးထားပါတယ်။

#include &lt;stdio.h&gt;
int main()
{
if(1 == 1) { // This is always true

// Do some stuff here

}

return 0;
}

1 နဲ့ 1 သာ တူခဲ့ရင် true ဖြစ်ပြီး အောက်က { နဲ့ စပြီး } ပိတ်ထားတဲ့ ကြားက code တွေကို အလုပ်လုပ်မှာပါ။ မဖြစ်ခဲ့ရင် condition အတွက်တော့ else ဆိုတာကို အသုံးပြုနိုင်ပါတယ်။ // နဲ့ ရေးထားတာတွေက comment ပါ။

int main(){

if(1==1){

// Do some stuff here.

}

else{

// The universe is broken!

}

return 0;

}

ကျွန်တော်တို့တွေ အဲဒီ 1==1 ဆိုတဲ့ နေရာတွေမှာ variable တွေထားပြီး စစ်နိုင်ပါတယ်။ i==1 ဖြစ်လားဆိုသလိုမျိုးပေါ့

Loop

ကြိမ်ဖန်များစွာ ထပ်ခါ ထပ်ခါ လုပ်နေရင် Loop လုပ်တယ်လို့ ခေါ်ပါတယ်။ Looping အတွက် ကျွန်တော်တို့တွေ for , while , do တွေကို အသုံးပြုကြပါတယ်။

// if loop

int main () {

int i = 9;

int x = 0;

for (x = 0; x &amp;lt; i; x++){

printf("Count is: %i\n", x);

}

return 0;

}

အဲဒါလေးကတော့ for loop ပေါ့။ x က 0 ကနေ စပြီးတော့ i ထက် ငယ်တဲ့အထိပေါ့။ i က 9 ဖြစ်တဲ့အတွက်ကြောင့် 0 ကနေ 8 အထိ အလုပ်လုပ်ပါမယ်။ အဲဒီတော့ Count is 0 ကနေ Count is 8 ထိကို ဖော်ပြပေးပါလိမ့်မယ်။

// while loop

int main () {

int x = 0;

while (x &lt; 10){

printf("Count is: %i\n", x); //Watch OUT! Something is missing.

}

return 0;

}

ဒါကတော့ while loop ပေါ့။ သူကတော့ variable တစ်ခုထဲပါပဲ။ x ကို 0 လို့ သတ်မှတ်ထားတယ်။ 10 ထက် ငယ်နေသ၍ အလုပ်လုပ်မယ်လို့ ဆိုထားတာပါ။ ဒါပေမယ့် အဲဒီ code ကို run ရင် ပြီးတော့မှာ မဟုတ်ပါဘူး။ ဘာကြောင့်လဲဆိုတော့ x တန်ဖိုး မပြောင်းလဲသွားတဲ့အတွက်ကြောင့်ပါ။ for loop မှာတုန်းက x++ ဆိုပြီး x တန်ဖိုးကို ၁ တိုးတိုး သွားပါတယ်။ while loop မှာလည်း အဲလို တန်ဖိုး တိုးပေးဖို့လိုပါတယ်။ အဲဒါကြောင့် အောက်ကလို နည်းနည်းပြင်လိုက်ပါတယ်။

// while loop
int main () {
int x = 0;
while (x &lt; 10){
x++;
printf("Count is: %i\n", x);
}

return 0;
}

အဲဒီအခါ x ကို ၁ တိုးတိုးသွားတဲ့အတွက် ၁၀ ရောက်တာနဲ့ ၁၀ ထက် မငယ်တော့တာကြောင့် loop က ထွက်သွားပါလိမ့်မယ်။ do loop က လည်း while loop နဲ့ အတူတူပါပဲ။ မတူတာကတော့ condition ကို အောက်မှာ စစ်တာပါပဲ။ while loop က process မစခင် စစ်ပေမယ့် do loop က process ကို အနည်းဆုံး ၁ ခေါက်လုပ်ပြီးမှ condition ကို စစ်ပါတယ်။

// do loop

int main () {

int x = 0;

do {

x++;

printf("Count is: %i\n", x);

} while(x &lt; 10);

return 0;

}

Pointer

pointer က memory ပေါ်က address နံပတ်ကို မှတ်ထားတာပါ။ variable က value ကို မှတ်ပေမယ့် pointer က memory address ကို မှတ်ထားပြီး အဲဒီ memory address ကို value ကို လှမ်းယူတာပေါ့။ ဥပမာ။။ variable value က အမြဲ ပေါင်းနေပေမယ့် variable ရဲ့ address က တစ်ခုတည်းမှာပဲ value တွေ ပြောင်းပြောင်းသွားနေတာပါ။ ဒါကြောင့် address နံပတ်ကို လှမ်းခေါ်လိုက်ရင် variable မှာ ပြောင်းထားတဲ့ value ကို ရနိုင်ပါတယ်။

int foo = 123; // This is an integer variable

int *ptr = &amp;foo; // This is a pointer to an integer variable

ရှုပ်သွားလောက်ပြီထင်တယ်။ နောက်ပိုင်းမှာ Objective-C လေ့လာရင်း pointer အသုံးပြုပုံတွေ တွေ့လာမှာပါ။ အဲဒီ အခါ ထပ်ရှင်းပြတာပေါ့။

အဆုံးသတ်ခြင်း

ဒီနေ့မှာတော့ Objective-C မစခင် C ကို ပြန်နွှေပေးတာပါ။ လွယ်လွယ်လေးနဲ့ ပြန်မှတ်မိအောင်ပေါ့။ အချို့တွေကလည်း C ကို အသုံးမပြုတာကြာပြီဆိုတော့ မေ့သွားလောက်ပြီ။ ဒါကြောင့် Objective-C မစခင် ပြန်ပြီး နွှေးပေးတဲ့ သဘောပါ။ နောက်နေ့မှာ Objective-C အကြောင်း Intro လေး စပါမယ်။

Reference : http://mobile.tutsplus.com/tutorials/iphone/learn-objective-c-day-1/

XML Part – 2

ဒုတိယခြေလှမ်း အခြေခံ DTD

XMLဟာ Tagတွေကိုလွတ်လပ်စွာ သတ်မှတ်ပြီးအသုံးပြုနိူင်သည့်အတွက်  အချက်အလက်အမျိုးမျိုးကို ဖော်ပြပေးနိူင်၏။ သို့ပေမယ့်  လွတ်လပ်စွာရေးသားနိူင်ခြင်းကြောင့်လည်း အဆင်မပြေမှု့များလည်း  တွေ့ရှိနိူင်ပါသည်။ ဥပမာအားဖြင့် XMLနဲ့ရေးသားထားတဲ့ အချက်အလက်တွေကို   တခြားကုမ္ပဏီတစ်ခုနဲ့ အဆက်အသွယ်လုပ်မည်ဆိုတဲ့ နမှုနာကိုစဉ်းစားကြည့်ကြပါ။  ကုမ္ပဏီအသီးသီးက နှစ်သက်သလို Tagတွေကို အသုံးပြုနေခဲ့မည်ဆိုလျှင်  အဲ့ဒီXMLစာတွေကိုဘာသာပြန်ဖို့အတွက်လည်း Programတွေ လိုအပ်လာပါလိမ့်မည်။  သည်လိုဆိုရင်ဖြင့် အဆင်မပြေနိူင်ပါ။ Continue reading “XML Part – 2”

XML – Part 1

1.ပထမခြေလှမ်း အခြေခံ XML

XML ဆိုသည်မှာ TAGတွေကိုအသုံးပြုပြီး၊ စာပိုဒ်တစ်ခုရဲ့ဖွဲ့စည်းပုံကို စနစ်ချရာမှာအသုံးပြုသော စနစ်တစ်ခု ဖြစ်၏။ XML သည်မရေရာသော ရေးသားပုံစနစ်ကလိုက်မခံပဲ၊ တင်းကျပ်တဲ့စည်းမျဉ်းတွေနဲ့ စာရေးသားပုံစနစ်ကို သတ်မှတ်ထားသည့်အတွက် Program များမှ အသုံးပြုရလွယ်ကူစေသော ထူးခြားမှု့ကိုပိုင်ဆိုင်၏။ ထိုကြောင့်ရုံးသုံးစာများတွင်၊ Business Data အချက်အလက်တွေကို ရေးသားရာမှာ XML ကိုအသုံးပြုနေကြ သည်မှာမရေတွက်နိုင်ပေ။ Continue reading “XML – Part 1”

iPhone Development Intro – 2

အပိုင်း ၁ မှာ တုန်းက iPhone Development တွေ လိုအပ်တာတွေပြင်ဆင်ဖို့ ဘယ်လို လေ့လာရမလဲဆိုတာတွေ ပြောပြီးပါပြီ။ အခု အပိုင်းမှာတော့ iPhone Developer Account နဲ့ Distrubtion အကြောင်းလေး ရေးပါမယ်။

Why you need Developer Account

ကျွန်တော်တို့မှာ Simulator ရှိပါတယ်။ သို့ပေမယ့်လည်း Simulator Account နဲ့ အကုန်လုပ်လို့မရဘူး။ camera, phone, accelerometer, magnetometer or gyroscope စတာတွေကို Simulator နဲ့ စမ်းလို့မရပါဘူး။ Developer Account ရှိမှ အဲဒီ API တွေကို Device ပေါ်မှာ တင်ပြီး စမ်းလို့ရမှာပါ။ နောက်ပြီး App store မှာ တင်ပြီးတော့ ရောင်းချင်တယ်ဆိုရင်လည်း Developer Account လိုအပ်ပါတယ်။ ဝယ်မယ်ဆိုရင်တော့ အရင်ဆုံး Apple Store or iTune store Account ရှိဖို့ လိုပါတယ်။ အဲဒီ Account ရှိမှ Developer Account ကို ဝယ်လို့ရမှာပါ။

dev center

Testing Your Project

Project ကို စမ်းမယ်ဆိုရင် Device ပေါ်မှာ စမ်းသပ်တာက အကောင်းဆုံးပါပဲ။ iPodTouch Simulator မှာသုံးတဲ့ Speed နဲ့ iPhone Device မှာ ရတဲ့ Speed က မတူပါဘူး။ နောက်ပြီး အချို့ API တွေ ဖြစ်တဲ့ camera, accelerometer စတာတွေက  Simulator နဲ့ စမ်းလို့မရဘူး။ Device ပေါ်မှာ စမ်းဖို့အတွက် Developer Account ရဲ့ Provisioning Portal ကနေ Development Provisioning Profiles တစ်ခုကို Download ချပြီး ဖန်တီးဖို့ လိုပါတယ်။ နောက်ပြီး သင့် Application အတွက် App ID တစ်ခုလည်း တည်ဆောက်ဖို့လိုတယ်။ အဲဒီအဆင့်တွေက Developer Account ဝယ်ပြီးသွားရင် Provisioning Portal မှာ အဆင့်ဆင့်တွေ ပြထားပါတယ်။ iPhone Development လုပ်နေပြီဆိုကတည်းက English စာ အသင့်သင့် ရှိနေတဲ့ သူတစ်ယောက်ဖြစ်တဲ့အတွက် English စာဖတ်ရတာ ခက်ခဲမယ် မထင်ပါဘူး။ အဆင့်ဆင့်တွေ ဖြစ်တဲ့ အတွက် Provision Portal မှာ စာတွေ အသေးစိတ် ဖတ်ဖို့ လိုအပ်ပါတယ်။

sdk

Simulator က iPhone Device ထက်မြန်တယ်လို့ ကျွန်တော် ပြောပြီးပါပြီ။ အဲဒါကြောင့် Device မှာသာ သုံးလို့ရတဲ့ API မသုံးပဲ ရေးမယ်ဆိုရင် Simulator ကို အဓိက ထားသုံးသင့်ပါတယ်။ Device ကို နောက်ဆုံး Testing အဆင့်အတွက် အဓိက ထားသုံးသင့်ပါတယ်။ Device မှာ မဟမ်းသွားဖို့လိုပါတယ်။

Distrbution

Distrubtion လုပ်မယ်ဆိုရင် ၂ နည်းရှိပါတယ်။ Ad Hoc နဲ့ App Store ပိုင်းပါ။ Ad Hoc ဆိုတာကတော့ App Store မှာ မတင်ပဲသီးသန့် ခွင့်ပြုထားတဲ့ device တွေမှာ အသုံးပြုဖို့အတွက်ပါ။ Ad Hoc က ကြိုက်သလောက် ဖန်တီးခွင့် မရှိပါဘူး။ စုစုပေါင်း Device ID 99 ခုပဲရပါတယ်။ နောက်တနည်းကတော့ App Store ပါ။

distrubtion

App Store

iPhone Project တွေ မတင်ခင် developer account မဝယ်ခင် App store နဲ့ ပတ်သက်ပြီး သိသင့်တာလေးတွေ ရှိပါတယ်။ App Store မှာ ရောင်းမယ်ဆိုရင် ရောင်းစျေးထက် 70% ပဲရပါလိမ့်မယ်။ ဥပမာ ။။ $0.99 နဲ့ ရောင်းတဲ့ app အတွက် ၁ ခု ရောင်းရလျှင် 0.70 ပဲ ကိုယ်က ရမှာပါ။ App Store ကို အသုံးပြုမယ်ဆိုရင် Online Bank Account ရှိဖို့လိုပါတယ်။ Bank Account က Swift Account ရှိဖို့လိုပါတယ်။ စကာင်္ပူမှာတော့ POSB, DBS , Ctibank တို့က Swift ရှိပါတယ်။ Address ကို သတိထားရပါမယ်။ Address ပြောင်းချင်ရင် Bank မှ လာထားတဲ့ Phone Bill နဲ့ ကိုယ်နေထိုင်တဲ့ နိုင်ငံရဲ့ ID card ပြနိုင်ဖို့ လိုပါတယ်။ Address ပြောင်းခြင်းကလည်း ၁ ပတ်လောက် ကြာမြင့်နိုင်ပါတယ်။ အကုန်လုံး သေချာသွားပြီဆိုရင် Contract စတင် ချုပ်လို့ရပါပြီ။ Contract ချုပ်ပြီးတာနဲ့ ကိုယ့် Bank Account ကို စတင်ဖြည့်လို့ရပါပြီ။ လိုအပ်တဲ့ Information တွေ ဖြည့်ပေးဖို့လိုပါတယ်။ Free version အတွက် bank account တွေ မလိုအပ်ပါဘူး။

app store

Sale on App Store

App store ပေါ်တင်မယ်ဆိုရင် ကိုယ့် App ကို ပုံမှန်အားဖြင့် ရ ရက် စောင့်ရပါတယ်။ ရ ရက်အတွင်းမှာ 95% Application တွေက Approve ဖြစ်ပါတယ်။ ဘာလို့ 5% က Approve မဖြစ်သလဲဆိုတော့

  • မပြည့်စုံခြင်း။ ( လိုအပ်ချက်တွေ မပြည့်စုံလို့ပါ။ Description မပြည့်စုံခြင်း။ Application က ဘာမှ မရှိပဲ နည်းနည်းလေး ပါးပါး စမ်းသပ်ထားသလို ဖြစ်နေခြင်း စတာတွေ ကြောင့်ပါ )
  • Custom API သုံးထားခြင်း။ ( App ထဲမှာ Custom API တွေ ထည့်သွင်းသုံးထားတာကို Apple က ခွင့်မပြုပါဘူး )
  • Crash ဖြစ်ခြင်း။ ( App က crash ဖြစ်တာကိုတွေ့ရင် လက်မခံပါဘူး )

approve

တကယ်လို့ ကိုယ့် App က approve မဖြစ်လို့ ပြန်ပြင်ပြီး resubmit လုပ်လို့ရပါတယ်။ App တစ်ခုကို တင်ရင် လိုအပ်တာတွေက

require

ရောင်းဖို့အတွက် စျေးနှုန်းတွေကို Tier နဲ့ သတ်မှတ်ပါတယ်။ ပုံမှန်အားဖြင့် အနိမ့်ဆုံး Tier 1 ဖြစ်တဲ့ $0.99 ကနေ စရောင်းလို့ရပြီးတော့ အမြင့်ဆုံး ဖြစ်တဲ့ Tier 85 ဖြစ်တဲ့ $999.99 ထိ ရောင်းလို့ရပါတယ်။ စာရင်းကိုတော့ ဒီမှာ ကြည့်လို့ရပါတယ်။ နောက်တချက် သိဖို့က ရောင်းတဲ့အခါမှာ $150 ပြန်မရမခြင်း သင့် ပိုက်ဆံ ပြန်ထုတ်လို့မရပါဘူး။ iAds လည်း ထိုနည်းတူပါပဲ။ ဒါကြောင့် သင့် Appliation ကို ရောင်းကောင်းအောင် Marketing တွေ လုပ်ဖို့လိုပါတယ်။

Marketing Your Application

App store မှာ တင်ပြီးသွားရင် ကိုယ့် Application Marketing အတွက် ဘယ်လောက်ရောင်းရတယ် ဘယ်လောက် Update လုပ်လဲ စတဲ့ report တွေကို ကြည့်လို့ရပါတယ်။ နောက်ပြီး Finance Reports ကို ၁ လ ၁ ကြိမ် ကြည့်လို့ရပါတယ်။ ဒါပေမယ့် real time report ကတော့ ကြည့်လို့မရပါဘူး။ ဒီနေ့ တနေ့လုံး ဘယ်လောက် ရောင်းရလဲဆိုတာကိုပဲ ကြည့်ုလို့ရပါတယ်။ ဒီနေ့ ၁ နေ့လုံးဆိုတာကလည်း ပုံမှန်အားဖြင့် ည singapore ည ရ နာရီ မှ တစ်ခါ update ဖြစ်ပါတယ်။ weekly report အတွက် ရ ရက်စောင့်ရပါမယ်။ နောက်ပြီးတော့ Discount Period တွေ သတ်မှတ်လို့ရပါတယ်။ ဘယ်အချိန်မှာ ဘယ်စျေးပြောင်းဆိုပြီး သတ်မှတ်လို့ရပါတယ်။ Available on App Store ဆိုတဲ့ Image ကို အသုံးပြုချင်တယ်ဆိုရင်တော့ US ကို mail ပို့ပြီး ကိုယ် သုံးမယ့် app နဲ့ website address အတွက် ခွင့်ပြုချက်ရယူဖို့ လိုပါတယ်။

ကဲ… ဒီလောက်ဆိုရင် iPhone Application Development အကြောင်းကို ခြံုငုံပြီး သိသွားပြီလို့ထင်ပါတယ်။

iPhone Development Intro – 1

iPhone application တစ်ခု ရေးသားဖို့ရာ နည်းလမ်း ၂ ခု ရှိပါတယ်။ HTML5 Web Application နဲ့ iPhone Application တို့ပါပဲ။ HTML5 Web application ဆိုတာက သမာရိုးကျ website ကို iPhone Safari နဲ့ အဆင်ပြေအောင် ပြောင်းလဲရေးသားရတာပါ။ HTML5 ဖြစ်တဲ့အတွက်ကြောင့် Video တွေ Sound တွေ ထည့်သွင်းလာနိုင်ပါတယ်။ အဲဒီလိုမျိုး HTML5 တွေကို စမ်းသပ်ချင်တယ်ဆိုရင်တော့ http://www.apple.com/html5 မှာ လေ့လာနိုင်ပါတယ်။ ပုံမှန် Web Development နဲ့ အတူတူပါပဲ။ ဘာမှ ကွာခြားမှုမရှိပါဘူး။ ထူးခြားတာကတော့ safari webkit css တွေ ခေါ်ယူသုံးစွဲလို့ရတာပါပဲ။

Continue reading “iPhone Development Intro – 1”

Python Day 11 – Day 20

Day-11

အားလုံးပဲ မင်္ဂလာပါ Day-11တောင်ဘာလိုလိုနဲ့ရောက်လာပြီ။ ကျွှန်တော်တို့ Python ကိုတော်တော်များများက Request လုပ်ကြတာ မြင်ရတော့ ဝမ်းသာမိပါတယ်။

English လိုရေးရင် ပိုမြန်ပြီးပိုကောင်းမှာပါ။ ဒါပေမယ့် language အခက်အခဲရှိတဲ့ ညီ၊ ညီမ များအဆင်ပြေအောင် တမင်မြန်မာလို အပင်ပန်:ခံပြီး တင်ပေးရတာပါ။ အမှန်အတိုင်းဝင်ခံရရင် ကျွှန်တော်မြန်မာလို မရိုက်တက်ပါဘူး။Ko Seth Hetu လုပ်ပေးထားတဲ့ ဝိဇ္ဇာနဲ့ရိုက်ရတာပါ။ ဝိဇ္ဇာကအားလုံးကို အဆင်ပြေအောင် မရိုက်နိူင်သေးပါဘူး။အတတ်နိူင်ဆုံးကြိုးစားပြီး အပင်ပန်းခံရိုက်ပေးထားတာပါ။

Continue reading “Python Day 11 – Day 20”

Windows Controls (part 7)

Web Browser

ဟိုဘက်က ADO.NET ဘက် လှည့်လိုက်တာ ဒီဘက်မှာ နဲနဲ ပြတ်သွားတယ်.. ဒါကြောင့် ဒီတစ်ခါ နဲနဲ အထူးအဆန်းလေး ပြမယ်.. သိတဲ့သူတွေကတော့ ငြိမ်ငြိမ်နေပေါ့ဗျာ.. မသိတဲ့သူတွေကို မျက်လှည့်ပြလိုက်အုံးမယ်.. 😀 ဒီတစ်ခါ ခေါင်းလဲ သိပ်မစားမဲ့ မထင်ထားတဲ့ အရာတစ်ခု ပြပါမယ်။ အဲဒါက web browser တစ်ခုကို ဘယ်လို ဆွဲမယ်ဆိုတာပါပဲ။ web browser ကို တကယ်ဆွဲဖို ့ကတော့ ခေါင်းစားမှာပါ.. ဒါပေမဲ့ အခုက ဘယ်လိုလုပ်လို ့ရနိုင်မလဲ ဒါတွေက ဒီလိုပါလား ဆိုတဲ့ sense လေးကို သိဖို ့ အတွက်တော့ ခေါင်းသိပ်မစားဘူး လို ့ဆိုလိုတာပါ…

Namespace: System.Windows.Forms

web browser ဆိုတာ web pages တွေ display and host ပေ့ါဗျာ.. သူ ့မှာ အခြား controls တွေလိုပဲ methods တွေ၊ properties တွေ၊ events တွေ များစွာ ရှိပါတယ်။ သူရဲ ့လက်တွေ ့အသုံးဝင်တဲ့ methods အချို ့ကို အောက်မှာ ရေးပြပါမယ်။

  • Url
  • Navigate
  • GoForward
  • GoBack
  • Stop
  • Refresh
  • GoHome
  • GoSearch
  • Print

ကဲ Sample တစ်ခုလောက် ကြည့်ရအောင်။

using System;
using System.Drawing;
using System.Windows.Forms;

public class MainClass
{
[STAThread]
public static void Main(string[] args)
{
Application.EnableVisualStyles();
Application.Run(new MyWebBrowser());
}
}

public class MyWebBrowser : Form
{
public MyWebBrowser()
{
InitializeComponent();
webBrowser.Navigate(“http://www.myanmarfamily.org”);
}

private WebBrowser webBrowser;
private Label lblAddress;
private TextBox AddressBox;
private Button goButton;
private Button forwardButton;
private Button backwardButton;

private void InitializeComponent()
{
this.webBrowser     = new WebBrowser();
this.lblAddress     = new Label();
this.AddressBox     = new TextBox();
this.goButton       = new Button();
this.forwardButton  = new Button();
this.backwardButton = new Button();

// webBrowser
webBrowser.Anchor = ((AnchorStyles)((((AnchorStyles.Top | AnchorStyles.Bottom) | AnchorStyles.Left) | AnchorStyles.Right)));
webBrowser.Location = new Point(16, 42);
webBrowser.Size = new Size(917, 524);
webBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser_DocumentCompleted);

// lblAddress
lblAddress.AutoSize = true;
lblAddress.Location = new Point(15, 11);
lblAddress.Size = new Size(60, 17);
lblAddress.Text = “Address”;

// AddressBox
AddressBox.Anchor = ((AnchorStyles)(((AnchorStyles.Top | AnchorStyles.Left) | AnchorStyles.Right)));
AddressBox.Location = new Point(77, 7);
AddressBox.Size = new Size(500, 22);
AddressBox.TabIndex = 0;

// goButton
goButton.Anchor = ((AnchorStyles)((AnchorStyles.Top | AnchorStyles.Right)));
goButton.Location = new Point(587, 5);
goButton.Size = new Size(100, 28);
goButton.TabIndex = 1;
goButton.Text = “Go”;
goButton.Click += new EventHandler(goButton_Click);

// forwardButton
forwardButton.Anchor = ((AnchorStyles)((AnchorStyles.Top | AnchorStyles.Right)));
forwardButton.Enabled = false;
forwardButton.Location = new Point(807, 5);
forwardButton.Size = new Size(100, 28);
forwardButton.Text = “Forward >>”;
forwardButton.Click += new EventHandler(forwardButton_Click);

// backButton
backwardButton.Anchor = ((AnchorStyles)((AnchorStyles.Top | AnchorStyles.Right)));
backwardButton.Enabled = false;
backwardButton.Location = new Point(697, 5);
backwardButton.Size = new Size(100, 28);
backwardButton.Text = “<< Back”;
backwardButton.Click += new EventHandler(backwardButton_Click);

// Form
this.ClientSize = new Size(949, 581);
this.Controls.Add(goButton);
this.Controls.Add(AddressBox);
this.Controls.Add(lblAddress);
this.Controls.Add(webBrowser);
this.Controls.Add(forwardButton);
this.Controls.Add(backwardButton);
this.Text = “GreenLeaf’s WebBrowser”;
}

private void goButton_Click(object sender, EventArgs e){
webBrowser.Navigate(AddressBox.Text);
}

private void forwardButton_Click(object sender, EventArgs e){
webBrowser.GoForward();
}

private void backwardButton_Click(object sender, EventArgs e){
webBrowser.GoBack();
}

private void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
AddressBox.Text = webBrowser.Url.ToString();

if (webBrowser.CanGoBack)
{ backwardButton.Enabled = true; }
else
{ backwardButton.Enabled = false; }

if (webBrowser.CanGoForward)
{ forwardButton.Enabled = true; }
else
{ forwardButton.Enabled = false; }
}
}

Output


Figure1_1 နဲ ့ Figure1_2 နဲ ့ Figure1_3 မှာ တစ်ချက် ကြည့်ကြည့်..

 


Figure1_1

 


Figure1_2

 


Figure1_3

 

This is pretty cool .. huh ??

How To Works

 

ဆိုတော့ code ကို လေ့လာကြည့်ရအောင်.. ထုံးစံအတိုင်း InitializeComponent() ထဲမှာ Form နဲ ့ Controls တွေရဲ ့ properties တွေ ရေးမှာပေါ့ဗျာ.. ဒီ properties တွေက အရင် post တွေမှာ ရှင်းပြပြီးသား ဖြစ်ပါတယ်။ ဒါပေမဲ့ နဲနဲ စွဲသွားအောင် တချို ့တလေ အရေးကြီးတာလေးတွေ ပြန်ပြောပြမယ်။ ဥပမာ

webBrowser.Anchor = ();
အဲဒီ့မှာ Anchor ဆိုတဲ့ property က ကျနော်တို ့form ကို resize ပေါ့လေ mouse နဲ ့ ချံု၊ ချဲ ့လုပ်တဲ့အခါ form ထဲက control တွေပါ resize အတိုင်း အကြီးအသေးပါနိုင်အောင် သူ ့ကို အသုံးပြုရပါတယ်။ Location ဆိုတာကတော့ controls တွေကို နေရာချထားမှုပေါ့ဗျာ.. (x,y) coordinate ကို အသုံးပြုပါတယ်။ သချင်္ာက (x,y) coordinate မဟုတ်ပါဘူး.. Display screen ကို programming မှာ ကိုယ့်ဘာသာ သတ်မှတ်ထားတဲ့ unit နဲ ့ပါ။ Display Screen (e.g., LCD) ရဲ ့ အပေါ်ဘယ်ထောင့်က (x,y) coordinate (0,0) ဖြစ်ပါတယ်။ x coordinate က ညာဘက်ကို အပေါင်း ကိန်းပြည့်တန်ဖိုး တိုးသွားပြီးတော့ y coordinate က အောက်ဘက်ကို အပေါင်းကိန်းပြည့် တန်ဖိုး တိုးသွားပါတယ်။ ကျန်တဲ့ property တွေကတော့ ပြောစရာမလိုတော့ဘူးထင်တာပဲ..


goButton.Click += new EventHandler(goButton_Click);

private void goButton_Click(object sender, EventArgs e)
{
webBrowser.Navigate(AddressBox.Text);
}

Navigate() method ကို အသုံးပြုသွားတယ်ဆိုရုံပါပဲ။ ဘာမှကို မပါလို ့ ဘာမှကို ရှင်းပြစရာ မလိုဘူး ထင်ပါတယ်။ သူ ့အတိုင်းကို ရှင်းနေပြီလေ။ ထပ်ရှင်းလိုက်ရင် တော်ကြာ …. အဲ သူ ့မှာ AddressBox.Text ဆိုတာက ကျနော်တို ့ အပေါ်က ရိုက်လို ့ရတဲ့ TextBox (ရိုက်လို ့ရတာဆိုလို ့ သူ တစ်ခုတည်းရှိပါတယ်) ထဲမှာ ကျနော်တို ့ရိုက်သမျှ Url ကို WebBrowser Class ရဲ ့ Navigate() method အကူအညီနဲ ့ display လုပ်ပေးပါလိမ့်မယ်။

private void forwardButton_Click(object sender, EventArgs e)
{
webBrowser.GoForward();
}

private void backwardButton_Click(object sender, EventArgs e)
{
webBrowser.GoBack();
}

ဒီနှစ်ခုကတော့ မပြောတော့ဘူးဗျာ.. မြင်တဲ့အတိုင်းပဲလေ..

private void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
AddressBox.Text = webBrowser.Url.ToString();

if (webBrowser.CanGoBack)
{
backwardButton.Enabled = true;
}
else
{
backwardButton.Enabled = false;
}

if (webBrowser.CanGoForward)
{
forwardButton.Enabled = true;
}
else
{
forwardButton.Enabled = false;
}
}

ဒီကောင်လေးကလဲ သိပ်ပြောစရာတော့ မရှိပါဘူး… ကျနော်တို ့ forwardButton, backButton ရဲ ့ property မှာ

forwardButton.Enabled = false;
ဆိုပြီး ပေးခဲ့တယ်။ သဘောက ပထမဆုံး Browser ဖွင့်လိုက်တဲ့အချိန်မှာ Home Page တက်လာမယ်။ အဲအချိ်န်မှာ အရင် page တွေ၊ နောက် page တွေ မရှိသေးဘူးလေ။ ဟုတ်တယ်မို ့လား.. ဒါကြောင့် ဒီ button နှစ်ခုကို ပထမမှာ  disable ပေးထားမယ်။ နောက် home page ကနေမှ တခြား page တစ်ခုကို သွားပြီဆိုတော့မှ ဒီနှစ်ကောင်ကို enable ပေးလိုက်မယ်။ ဒီ method မှာ ရေးထားတာ အဲဒါပါပဲ..

Home page ကို

public MyWebBrowser()
{
InitializeComponent();
webBrowser.Navigate(“http://www.myanmarfamily.org”);
}

ဒီ MyWebBrowser class constructor မှာ တစ်ခါတည်း ပေးထားလိုက်ရင် ရပါတယ်။

Remark
အပေါ်မှာ အသုံးဝင်တဲ့ method လေးတွေ ပြောခဲ့ပါတယ်။ ဒါပေမဲ့ code ထဲမှာ ယူသုံးသွားတာက Url, GoBack, GoForward လောက်ပဲ သုံးထားပါတယ်။ ဒါကြောင့် ကျန်တဲ့ GoHome တို ့၊ GoSearch တို ့၊ Refresh တို ့ကို  ခင်ဗျားစမ်းဖို ့အတွက် ချန်ထားခဲ့ပါတယ်။…

 

 

 

 

Ok, Happy Coding!!
Thanks for reading!!
See u around, buddy!!