ေရႊပြဲလာတုိ႕၏ အားေပးမႈ

၂၀၀၉ ခုႏွစ္ ၾသဂုတ္လ ၁ ရက္ေန႕မွစ၍ လက္မွတ္ေစာင္ေရေပါင္း ေစာင္ တိတိ ေရာင္းခ်ခဲ့ရၿပီး ျဖစ္ပါသည္။
Showing posts with label သိပၸံႏွင့္ နည္းပညာ. Show all posts
Showing posts with label သိပၸံႏွင့္ နည္းပညာ. Show all posts

Sunday, August 9, 2009

Quick Sort ကုိ အသံုးျပဳၿပီး Sorting စီျခင္း

ေလာကအလွ အြန္လုိင္းမဂၢဇင္းတြင္ ေဖာ္ျပခဲ့ဖူးေသာ ေဆာင္းပါးကုိ ျပန္လည္ေဖာ္ျပျခင္း ျဖစ္ပါသည္။

ကြန္ပ်ဴတာ သိပၸံ (Computer Science) ေလ့လာသူေတြနဲ႕ သတင္းနည္းပညာ (IT) ေလ့လာသူေတြအတြက္ အစီအစဥ္ဆြဲနည္း (Programming) သင္ခန္းစာေတြမွာ မပါမျဖစ္ကေတာ့ အခ်က္အလက္မ်ားကုိ စီျခင္း (Sorting) အစီအစဥ္ပါပဲ။ Sorting စီတဲ့ နည္းလမ္းစဥ္ (Algorithm) အမ်ိဳးေပါင္း ေျမာက္မ်ားစြာ ရွိတဲ့အထဲက Bubble Sort, Counting Sort, Insertion Sort, Selection Sort နဲ႕ Quick Sort တုိ႕ဟာ ထင္ရွားပါတယ္။ (စာေရးသူ အႀကိဳက္ဆံုးကေတာ့ Selection Sort ျဖစ္ၿပီး အေၾကာင္းရင္းကေတာ့ နားလည္ရလြယ္လြန္းလုိ႕ ျဖစ္ပါတယ္။) ဒါေပမဲ့ လက္ေတြ႕ဘ၀မွာ အသံုး၀င္တာကေတာ့ နားလည္ရခက္၊ ေရးရတာ လက္၀င္တဲ့ Quick Sort ေလ။ ေရးလုိက္ၾကတဲ့ အစီအစဥ္ေတြတုိင္းမွာ စီစရာ (object, data type) တစ္မ်ိဳး ေပၚလာတုိင္း Quick Sort ကုိ တစ္ခါ ထထ ေရးရမယ္ ဆုိတာကေတာ့ လြန္လြန္းပါတယ္။ ဒါေၾကာင့္ C/C++ စံသတ္မွတ္ခ်က္မွာ Array အားလံုးကို စီႏုိင္ဖုိ႕ qsort ဆုိတဲ့ function ပါေနတာ ျဖစ္ပါတယ္။ ဒီေဆာင္းပါးမွာ အဲဒီ qsort ကုိ အသံုးျပဳနည္းကို ေရးသားေပးမွာ ျဖစ္ပါတယ္။

qsort ရဲ႕ သတ္မွတ္ခ်က္မွာ အစီအစဥ္ေရးသားသူ (programmer) ဒါမွမဟုတ္ ကုဒ္ဒါကို ၿခိမ္းေျခာက္ေနတာကေတာ့ pointer ေတြပါပဲ။ ရုိးရုိး Data Pointer ေတြတင္မကပဲ Function Pointer ႀကီးပါ ပါေနေတာ့ Pointer ဆုိရင္ ေက်ာစိမ့္ေနၾကလူေတြ လန္႕ကုန္တာ မဆန္းပါဘူး။ ဒါေပမဲ့ အေက်ာသိရင္ လြယ္လြယ္ကေလးပါ။ qsort ရဲ႕ အဓိပၸါယ္ သတ္မွတ္ခ်က္ကို အရင္ၾကည့္ရေအာင္ေနာ္။

void qsort ( void * base, size_t num, size_t size, int ( * comparator ) ( const void *, const void * ) );

ပထမဆံုး return type ကေတာ့ ဒီ function ဟာ return မျပန္ပါဘူးလုိ႕ အဓိပၸါယ္ရပါတယ္။ ဆုိလုိတာက ေပးလိုက္တဲ့ array ကုိ စီပဲ စီေပးမယ္။ ဘာ ဂဏန္းမွ တြက္ၿပီး အေျဖမထုတ္ေပးပါဘူးေပါ့။

ပထမဆံုး parameter က စီရမဲ့ array ရဲ႕ ပထမဆံုးအကြက္ရဲ႕ လိပ္စာ (address) ပါ။ အမ်ားေၾကာက္တဲ့ pointer ေပါ့။ Array အားလံုးဟာ Fix Pointer ေတြ ျဖစ္တဲ့အတြက္ စိတ္ခ်လက္ခ်ပဲ array name ကုိ ျဖည့္လုိက္လုိ႕ရပါတယ္။

ဒုတိယ parameter ကေတာ့ Array ရဲ႕ အရြယ္အစား (size) ျဖစ္ပါတယ္။ C/C++ မွာ Array ရဲ႕ size ကုိ compile-time/run-time check မလုပ္ပဲ ကုဒ္ဒါကပဲ အၿမဲ ကုိင္တြယ္ ႀကီးၾကပ္ရတာမုိ႕ ဒါကို ထည့္ေပးရတာပါ။ ႏုိ႕မုိ႕ရင္ ဘယ္ႏွခု စီရမလဲ မသိပဲ ျဖစ္ေနမယ္ေလ။ ကုိယ့္ Array မွာ Element ၁၀ ခုပါရင္ 10 လုိ႕ထည့္ေပါ့။ Variable တစ္ခုခု ထည့္လုိ႕လဲ ရပါတယ္။

တတိယ parameter ကေတာ့ စီခ်င္တဲ့ Array Element တစ္ခုခ်င္းရဲ႕ အရြယ္အစားေပါ့။ အဲဒါမွ အဲဒီ မွတ္ဥာဏ္တံုးႀကီး (memory block) ေတြကို ေရႊ႕လုိ႕ရမယ္ေလ။ ဒါလဲ မခက္ပါဘူး။ sizeof(element) လုိ႕ ေပးလုိက္ရင္ရပါတယ္။

စတုတၳနဲ႕ ေနာက္ဆံုး parameter ကေတာ့ နည္းနည္း ရွင္းျပရ လက္၀င္ပါတယ္။ ဒါဟာ Function Pointer ႀကီးျဖစ္ပါတယ္။ ကုိယ့္ဘာသာကုိယ္ သတ္မွတ္ထားတဲ့ Element ေတြကို ႏိႈင္းယွဥ္ခ်င္ရင္ ဒီ Function နဲ႕ တြက္ဆုိၿပီး ေျပာရတဲ့ သေဘာပါ။ (ေနာက္တမ်ိဳးေျပာရရင္ အဲဒီ Function ႀကီးကုိ qsort ကေန လွမ္းေခၚမွာ ျဖစ္ပါတယ္။ အဲဒီ Function ႀကီးက qsort ဆီကုိ ေရွ႕ကေကာင္က ငယ္ရင္ အႏႈတ္ကိန္း၊ တူရင္ သုည၊ ႀကီးရင္ အေပါင္းကိန္း တစ္ခုခု return ျပန္ရပါမယ္။) အဲဒီ Function ႀကီးရဲ႕ ပံုစံကလဲ

int function_name(const void* a, const void* b);

ပဲျဖစ္ရပါမယ္။ ပုိနားလည္လြယ္ေအာင္ ဥပမာေလးနဲ႕ ၾကည့္ရေအာင္ေနာ္။

ဥပမာ ၀န္ထမ္းေတြကို လစာ အမ်ားဆံုးကေန အနည္းဆံုးကို စီၿပီးသား အစီရင္ခံစာထုတ္ေပးတဲ့ အစီအစဥ္ကုိ လုိခ်င္တယ္။ တကယ္လုိ႕ လစာတူေနရင္ လုပ္သက္ရင့္တဲ့လူကုိ ေရွ႕မွာ ထားခ်င္တယ္ ဆုိပါစုိ႕။ ဒါဆုိရင္ ၀န္ထမ္းေတြရဲ႕ အခ်က္အလက္ေတြကုိ သိမ္းဖုိ႕ class တစ္ခု ေဆာက္ရပါမယ္။

class employee{

    int experience;     //in year

    float salary;    //in kyat

    /* Blar Blar Blar */

    public:

        bool operator < (employee &e)    {

            If(this->salary == e.salary) return (this->experience < e.experience);

            else return (this->salary < e.salary);

        }

        void my_emp_function(void) { }

        /* More Blar Blar Blar */

};

ေပါ့။ အဲဒီ Class မွာ လစာရယ္၊ လုပ္သက္ရယ္က Private Member ေတြ ျဖစ္ၿပီးေတာ့ အျပင္ကေန ၀န္ထမ္းေတြကို ႏိႈင္းယွဥ္ႏုိင္ဖုိ႕ operator '<' ကုိ overload လုပ္ထားတဲ့ Function တစ္ခုပါပါတယ္။ ဒါေပမဲ့ qsort ထဲကုိ အဲဒီ function ကုိ ထည့္လုိက္လုိ႕မရတဲ့အတြက္ (qsort က လုိခ်င္တဲ့ ပံုစံနဲ႕ operator '<' ရဲ႕ ပံုစံ Syntax မတူတဲ့အတြက္) qsort အတြက္ Function ကုိ ဒီလိုေရးရပါမယ္။

int employee_comparer(const void* a, const void* b) {

    employee *temp_e = (employee*) a;        //type cast from void*

    employee *temp_f = (employee*) b;        //to employee*

    if((*temp_e) < (*temp_f)) return -1;

        else return 1;    

}

ေရးထားတဲ့ Function ရဲ႕ ပထမ ၂ ေၾကာင္းကေတာ့ ဘာ type information မွမပါပဲ qsort က ရမ္းသန္းမွန္းသန္း ပုိ႕လႊြတ္လုိက္တဲ့ Pointer ၂ ခုကို employee Pointer ျဖစ္ေအာင္ ေျပာင္းယူတာပါ။ အဲဒီမွာ တခ်က္သတိထားဖုိ႕က အဲဒီလုိ ေျပာင္းယူၿပီးတာေတာင္ temp_e နဲ႕ temp_f က Pointer ပဲ ရွိပါေသးတယ္။ ဒါေၾကာင့္ သူတုိ႕ကုိ သံုးတဲ့အခါမွာ Data of လုိ႕ အဓိပၸါယ္ရတဲ့ '*' ေလးကို အၿမဲထည့္ရပါမယ္။ (တကယ္လုိ႕ သူတို႕ထဲက function ေတြ ေခၚမယ္ဆုိရင္လဲ operator '.' ကုိ မသံုးပဲ operator '->' ကုိ ဒီလုိေလး temp_e->my_emp_function() ဆုိၿပီးေတာ့ သံုးေပးရပါမယ္။) အဲဒီ '*' ေလးကို ထည့္ၿပီး operator '>' နဲ႕ ႏိႈင္းယွဥ္လုိ႕ရလာတဲ့ အေျဖေပၚမူတည္ၿပီး -1 သုိ႕မဟုတ္ +1 ကို qsort အတြက္ return ျပန္ေပးလုိက္ရပါမယ္။

ဒီ Function ေလးေရးလုိ႕ အခ်ိဳးေျပသြားၿပီဆုိရင္ေတာ့ qsort ကုိ စိတ္ေအးခ်မ္းသာ အသံုးျပဳႏုိင္ပါၿပီ။ (employee ရဲ႕ private member ေတြကို accessor method ေတြကေနတဆင့္ ေခၚထားတာ သတိျပဳပါ။ တကယ္တမ္း ေရးတဲ့အခါက်ေတာ့ သတိလက္လြတ္ ဒီတုိင္း ေရးမိတတ္ပါတယ္။ အဲဒီလုိေရးခ်င္ရင္ေတာ့လဲ friend လုပ္လုိက္ေပါ့ဗ်ာ၊ ေနာ။) ေအာက္မွာက main Function ပါ။

/* preprocessor Yada Yada Yada */

void main(void)

{

    employee myEmployeeArray[NUM_OF_EMPLOYEE];

    /* input data into myEmployeeArray */

    qsort(myEmployeeArray, NUM_OF_EMPLOYEE, sizeof(employee), employee_comparer);

    /* output sorted myEmployeeArray */

}

qsort ကုိ လြယ္လြယ္ေခၚၿပီး ကုဒ္ဒါအေပါင္း သက္သာၾကပါေစေၾကာင္း …

စာေရးသူ ေရးသားစမ္းသပ္ထားေသာ Code ကုိ ရယူရန္

Monday, July 20, 2009

လကမၻာခရီးစဥ္ ႏွစ္ ၄၀ ျပည့္

လူသားတစ္ေယာက္ရဲ႕ ဤေျခလွမ္းငယ္တလွမ္းဟာ လူသားထုတရပ္လံုးရဲ႕ ခုန္ပ်ံတုိးတက္မႈတစ္ခုျဖစ္တယ္။ (Neil Armstrong).

လူသားေတြအေနနဲ႕ လကုိ ေအာင္ႏုိင္မွ စၾကာ၀ဠာတစ္ခုလံုးကို ခရီးႏွင္ႏုိင္မွာျဖစ္ပါတယ္။ ဘာျဖစ္လုိ႕လဲဆုိေတာ့ လကမၻာရဲ႕ ဆြဲငင္အားက ကမၻာ့ ဆြဲငင္အားရဲ႕ ၆ ပံု ၁ ပံုသာ ရွိတာမုိ႕ လကမၻာမွာ အေျခစိုက္စခန္းထားႏုိင္ခဲ့ရင္ ေလာင္စာအနည္းငယ္နဲ႕ပဲ ေနစၾကာ၀ဠာထဲက ၿဂိဳဟ္ေတြကုိ သြားေရာက္ ေလ့လာႏုိင္မွာ ျဖစ္ပါတယ္။ (ကမၻာကေန တုိက္ရုိက္သြားမယ္ဆုိရင္ေတာ့ ကမၻာေျမရဲ႕ ဆြဲငင္အားကုိ လြန္ဆန္ႏုိင္တဲ့ လြတ္ေျမာက္အလ်င္ (escape velocity) ရဖုိ႕ကုိ ေလာင္စာ အမ်ားႀကီး သံုးရပါတယ္။) 

လြန္ခဲ့တဲ့ ႏွစ္ေပါင္း ၄၀ ၁၉၆၉ ခု ဇူလုိင္လ ၂၀ ရက္ေန႕ (ဒီေန႕) မွာ အေမရိကန္ အာကာသသူရဲေကာင္း အမ္းစထေရာင္းနဲ႕အယ္လ္ဒြင္တုိ႕ဟာ လူသားထုတရပ္လံုးရဲ႕ ကုိယ္စား လကမၻာကို ေျခခ်ကာ အမွတ္တရအျဖစ္ အေမရိကန္ အလံကို လႊင့္ထူထားႏုိင္ခဲ့ပါတယ္။ အမ္းစထေရာင္းရဲ႕ သိမ္းငွက္ ေျခခ်လုိက္ၿပီ (Eagle has landed) နဲ႕ လွလုိက္တာ (Beautiful view) ဆုိတဲ့ သတင္းပုိ႕သံေတြဟာ ယေန႕တုိင္ ေရပန္းစားေနဆဲပါ။ (သီခ်င္းအခ်ိဳ႕မွာ remix လုပ္တာ၊ Game အခ်ိဳ႕မွာ ထည့္ထားတာ၊ ရုပ္ရွင္အခ်ိဳ႕မွာ မွီျငမ္းတာ စသျဖင့္ ေတြ႕ရွိရပါတယ္။)




စစ္ေအးေခတ္ အာကာသ နည္းပညာ ၿပိဳင္ဆုိင္မႈေၾကာင့္ လူသားတရပ္လံုး လူေနမႈ အဆင့္အတန္း တဟုန္ထုိး တုိးတက္ေျပာင္းလဲခဲ့ပါတယ္။ လံုး၀လံုးတဲ့ သတၱဳစက္လံုးကို ပံုသြန္းႏုိင္တာကစလုိ႕ ကြန္ပ်ဴတာေတြအလယ္၊ ေလေၾကာင္း နည္းပညာအဆံုး အမ်ားႀကီး တုိးတက္မႈ ရေစခဲ့တာ ျငင္းလုိ႕မရပါဘူး။ လက္ရွိမွာ အာကာသ စူးစမ္းေလ့လာေရးမွာ လူသားေတြ အားေလ်ာ့ေနေပမဲ့ (အၾကမ္းဖက္မႈ တုိက္ဖ်က္ေရးေတြ၊ စီးပြားပ်က္ကပ္ေတြနဲ႕ ရႈပ္ေနတာကုိး) တရုတ္ႏုိင္ငံက သိပ္မၾကာခင္မွာ လေပၚကုိ လူမဲ့ခရီးစဥ္လႊတ္မယ္၊ ေအာင္ျမင္ရင္ လေပၚကုိ လူတက္မယ္ဆုိတာ ၾကားရေတာ့ စၾကာ၀ဠာႀကီးကုိ လူသားေတြ စုိးမုိးႏုိင္ဖုိ႕ ေမွ်ာ္လင့္ခ်က္ေတြ ျပန္လည္ ႏုိးထလာပါၿပီ။

လကမၻာေန႕ (ဇူလုိင္ ၂၀ ရက္ေန႕) ႏွစ္ပါတ္လည္အျဖစ္ ေရးသား ဂုဏ္ျပဳပါသည္။

Wednesday, July 15, 2009

ျမန္မာစာစနစ္မ်ား၏ ေနာက္ခံကား

ယခုအခါ ကြန္ပ်ဴတာသံုး ျမန္မာစာ စနစ္အမ်ိဳးမ်ိဳး ေပၚထြန္းလွ်က္ ရွိသည္။ ၄င္းစနစ္အသီးသီး၏ ေပၚေပါက္လာရျခင္း အေၾကာင္းရင္းႏွင့္ သေဘာသဘာ၀မ်ားမွာ တခုႏွင့္ တခု မတူညီပဲ ကြဲျပားလွ်က္ရွိသည္။ Unicode 5.1 တြင္ ျမန္မာအကၡရာမ်ား၏ ေနရာသတ္မွတ္ခ်က္ တည္ၿငိမ္လာၿပီျဖစ္ရာ အခ်က္အလက္မ်ား မွ်ေ၀ႏုိင္ရန္၊ ျမန္မာဘာသာျဖင့္ ေရးသားထားေသာစာမ်ားကုိ အကၡရာ၀လိစီရန္ႏွင့္ ရွာေဖြႏုိင္ရန္ ၄င္းေနရာသတ္မွတ္ခ်က္မ်ားအတုိင္း ေျပာင္းလဲ သံုးစြဲသင့္ၿပီျဖစ္သည္။ လက္ရွိစနစ္မ်ား၏ ေနာက္ခံကားကုိ နားလည္သေဘာေပါက္မွ ၄င္းစနစ္မ်ားအား အသံုးျပဳလွ်က္ရွိသူတုိ႕ကုိ Unicode အဆင့္မီစနစ္မ်ားသုိ႕ ေခ်ာေခ်ာေမြ႕ေမြ႕ ေျပာင္းလဲႏုိင္ေစမည္ျဖစ္ရာ ဤစာတမ္းငယ္တြင္ လက္ရွိ ျမန္မာစာစနစ္မ်ား၏ သေဘာသဘာ၀ကုိ Information Systems Practitioner တစ္ဦး၏အျမင္မွ ေဆြးေႏြးတင္ျပမည္ ျဖစ္သည္။

နိဒါန္း

ယခုအခါ ကြန္ပ်ဴတာကုိ အသံုးျပဳရာတြင္ အဂၤလိပ္၊ ဂ်ာမန္၊ ျပင္သစ္စေသာ အေနာက္တုိင္း ဘာသာစကားမ်ားသာမကပဲ တရုတ္၊ ကုိရီးယား၊ ဂ်ပန္ စေသာ အေရွ႕တုိင္း ဘာသာစကားမ်ားျဖင့္လဲ လြယ္ကူစြာ အသံုးျပဳႏုိင္ၾကၿပီ ျဖစ္သည္။ ဤကဲ့သုိ႕ မိခင္ဘာသာစကားမ်ားျဖင့္ ကြန္ပ်ဴတာကုိ အသံုးျပဳႏုိင္ရျခင္းမွာ ဘာသာစကားအမ်ားအျပား၏ အကၡရာမ်ားကုိ code-range တစ္ခုအတြင္းတြင္ ေနရာခ်ထားေပးေသာ Unicode ေခၚ စံႏႈန္းတစ္ရပ္ကုိ အမ်ားသေဘာတူ သတ္မွတ္ႏုိင္ခဲ့ေသာေၾကာင့္ ျဖစ္သည္။ အဆုိပါ စံႏႈန္းအတြင္းတြင္ ျမန္မာအကၡရာမ်ားအတြက္ code-range ကုိ သတ္မွတ္ႏုိင္ခဲ့ေသာ္လည္း ႏွစ္ေပါင္းမ်ားစြာၾကာသည့္တုိင္ေအာင္ အေသးစိတ္ အေကာင္အထည္ေဖာ္မည့္ ပံုစံကုိ အတည္မျပဳႏုိင္ေသးပဲ ရွိခဲ့သည္။

ယခုအခါ ျမန္မာစာ Unicode စနစ္သည္ တည္ၿငိမ္စ ျပဳလာၿပီျဖစ္ၿပီး ေဇာ္ဂ်ီ ျမန္မာစာ စနစ္မွာ အျခားဘာသာစကားမ်ားႏွင့္ ယွဥ္တြဲ သံုးစြဲႏုိင္သည့္ Unicode အစစ္မဟုတ္ေသာ္လည္း အမ်ားသံုး (de facto) စံႏႈန္းတစ္ရပ္ အျဖစ္ ရပ္တည္လွ်က္ရွိသည္။ ယခင္က သံုးစြဲခဲ့ေသာ ASCII (truetype) font မ်ားႏွင့္ Burglish သံုးစြဲမႈမ်ားလဲ ယေန႕တုိင္ ရပ္တည္လွ်က္ရွိသည္ကို ေတြ႕ရွိရသည္။ ဤစာတမ္းတြင္ 8 bit font မ်ားႏွင့္ burglish အေၾကာင္းကို ေရွးဦးစြာတင္ျပၿပီး အမ်ားသံုးျဖစ္သည့္ ေဇာ္ဂ်ီစနစ္အေၾကာင္းကုိ ဆက္လက္ ေဆြးေႏြးမည္ ျဖစ္သည္။ ထုိ႕ေနာက္ Unicode 5.1 အဆင့္မီစနစ္မ်ားအေၾကာင္းႏွင့္ ၄င္းတုိ႕ကုိ အဘယ္ေၾကာင့္ ေရြးခ်ယ္သင့္သည္ကို ရွင္းလင္းေရးသားမည္ ျဖစ္ပါသည္။

8 Bit Systems

ယခင္က အဂၤလိပ္စာလံုးကဲ့သုိ႕ေသာ လက္တင္စာလံုးမ်ားျဖင့္ ေရးသားထားသည့္ contents မ်ားကုိ ကြန္ပ်ဴတာမ်ား ေ၀မွ်သံုးစြဲႏုိင္ေစရန္အတြက္ စံအျဖစ္ IBM မွ EBCDIC (8 bits) စနစ္ႏွင့္ ASCII (7 bits) စနစ္ဟူ၍ စတင္ ေပၚေပါက္ခဲ့သည္။ ေနာက္ပုိင္းတြင္ ASCII စနစ္ကုိ 8 bit သုိ႕ တုိးခ်ဲ႕ခဲ့သည္။ နာမည္ႀကီး Windows စနစ္မ်ားတြင္ ASCII စနစ္ကုိ အသံုးျပဳႏုိင္ရာ အဂၤလိပ္စာလံုးမ်ားကုိ ပံုျပင္ဆြဲ၍ ျမန္မာစာလံုးပံုစံ အမ်ားအျပား ေပၚထြက္ခဲ့သည္။ ၄င္းတုိ႕သည္ နည္းပညာရႈေထာင့္အရ အဂၤလိပ္စာကုိ ပံုေျပာင္းထားျခင္းမွ်သာျဖစ္ၿပီး ျမန္မာဘာသာျဖင့္ ေရးသားထားေသာ အခ်က္အလက္မ်ားကုိ ျမန္မာစာ အကၡရာစီထံုးျဖင့္ အလြယ္တကူ စီ၍မရေပ။ ယခုအခါ ၄င္းတုိ႕ကုိ ပံုႏွိပ္တုိက္မ်ားတြင္ က်ယ္ျပန္႕စြာ သံုးစြဲလွ်က္ရွိၿပီး CE ႏွင့္ Win-Myanmar ပံုစံတုိ႕မွာ ထင္ရွားသည္။ 

Burglish

ျမန္မာႏွင့္ အဂၤလိပ္စာ ေရာေထြးေရးသားရန္ 16 bit code မ်ား မေပၚေပါက္မီက Chat application သံုးစြဲသူအခ်ိဳ႕သည္ ေျပာလုိေသာ အေၾကာင္းအရာကုိ အသံဖလွယ္၍ အဂၤလိပ္ အကၡရာမ်ားျဖင့္ ေရးသားသံုးစြဲၾကသည္။ (ဥပမာအားျဖင့္ Sar Pee P Lar ? = စားၿပီးၿပီလား ျဖစ္သည္။) ယေန႕တုိင္ ျမန္မာစာ ေကာင္းစြာ မရိုက္တတ္သူ Chat application အသံုးျပဳသူအခ်ိဳ႕လဲ ရွိေနဆဲပင္ ျဖစ္သည္။ ၄င္းတုိ႕အတြက္ အလုိအေလ်ာက္ ဘာသာျပန္ေပးသည့္ စနစ္အမ်ိဳးမ်ိဳး ေပၚထြက္ခဲ့ရာ ၀ိဇၨာစနစ္မွာ ထင္ရွားေသာ ဥပမာ တစ္ခုျဖစ္ၿပီး ေဇာ္ဂ်ီႏွင့္ Myanmar – 3 သုိ႕ ဘာသာျပန္ေပးႏုိင္သည္။

ေဇာ္ဂ်ီ

ႏုိင္ငံတကာသံုး စံႏႈန္းျဖစ္သည့္ Unicode စံႏႈန္း (16 bit code) တြင္ ျမန္မာအကၡရာမ်ား၏ ေနရာ (ခြင္) ကို အတိအက် သတ္မွတ္ႏုိင္ခဲ့ၿပီး ျဖစ္ေသာ္လည္း စာလံုးမ်ား၏ ေနရာႏွင့္ ဘာသာစကား၏ ရႈပ္ေထြးမႈ ျပႆနာမ်ားကို ေျဖရွင္းႏုိင္ရန္ စံသတ္မွတ္ခ်က္ အတိအက် မရွိသည္မွာ အေတာ္ပင္ ၾကာျမင့္ခဲ့သည္။ ဥပမာအားျဖင့္ ျပ ႏွင့္ ၾက တြင္ ပါ၀င္ေသာ ရရစ္မွာ အတူတူပင္ျဖစ္ေသာ္လည္း ၄င္းတုိ႕ကုိ ပံုေဖာ္ရန္အတြက္ software support (rendering support) လုိသည္။ ၄င္းကုိ အလြယ္နည္းႏွင့္ ေျဖရွင္းရန္မွာ code-range ကို ခ်ဲ႕ပစ္ရန္ျဖစ္ရာ (ရရစ္ ၂ ခုသံုးမယ္၊ code ၂ ခုေပး ဆုိတာမ်ိဳး) ပညာရွင္အခ်ိဳ႕က စံႏႈန္းမတည္ၿငိမ္မီ ကာလအတြင္း ေဆးၿမီးတုိအျဖစ္ အျခားဘာသာစကားမ်ား၏ code မ်ားကုိ ေခ်းငွားသံုးစြဲကာ ေဇာ္ဂ်ီစာလံုးစနစ္ကုိ ဖန္တီးခဲ့ၾကသည္။

၄င္းသည္ ျပႆနာ ၂ ရပ္ကုိ ဖိတ္ေခၚလာသည္။ ေဇာ္ဂ်ီသည္ အဂၤလိပ္ အကၡရာမ်ား၏ code ကုိ မထိသျဖင့္ အဂၤလိပ္/ျမန္မာ တြဲဖက္ေရးသားရာတြင္ အဆင္ေျပေသာ္လည္း ၄င္းေခ်းငွားထားေသာ ဘာသာစကားမ်ားႏွင့္ ျမန္မာစာကုိ တြဲဖက္ေရးသားပါက ကြန္ပ်ဴတာအေနႏွင့္ ေခ်းသံုးထားေသာ code မ်ားကုိ မည္သည့္ အကၡရာ (ျမန္မာ အကၡရာ သို႕မဟုတ္ အျခား အကၡရာ) အျဖစ္ ေဖာ္ျပေပးရမည္ကုိ မသိႏုိင္ပဲ ျဖစ္လိမ့္မည္။ (ဥပမာ 1E29 သည္ 'ḩ' လား၊ Latin Small Letter H with Cedilla လား မသိႏုိင္ေတာ့ေပ။) ေနာက္ျပႆနာတစ္ရပ္မွာ တူညီေသာ စာလံုးမ်ား ကုိ code အမ်ားအျပားသုိ႕ assign လုပ္ထားသျဖင့္ အကၡရာစဥ္ စီရာ (ႏွင့္ searching ရွာရာ) တြင္ မလုိလားအပ္ေသာ ရႈပ္ေထြးမႈမ်ားကုိ ျဖစ္ေပၚေစပါသည္။ ဥပမာအားျဖင့္ ရရစ္သည္ ျပ ဟုေရးရာတြင္ တမ်ိဳး၊ ၾက ဟုေရးရာတြင္ တမ်ိဳး၊ လံုးႀကီးတင္ႏွင့္ တြဲရန္တမ်ိဳး (ၿပိ၊ ႀကိ) စသျဖင့္ code အမ်ိဳးမ်ိဳး ျဖစ္ေနသည္။ အမွန္မွာ အကၡရာ စဥ္ရာတြင္ ၾကသည္ ျပအေရွ႕ (ၾကိသည္ ျပိအေရွ႕) ဟူ၍ ရရစ္ ၂ မ်ိဳးကုိ အတူတူ သေဘာထားၿပီး စီရရာ ေဇာ္ဂ်ီစနစ္ျဖင့္ ေရးသားထားေသာ ျမန္မာစာမ်ားကုိ အကၡရာစီႏုိင္ရန္ ခက္ခဲပါသည္။

ေဇာ္ဂ်ီ၏ အဓိက အားနည္းခ်က္ တစ္ရပ္မွာ စာလံုးမ်ား၏ စံပံုစံ မရွိျခင္းပင္ ျဖစ္သည္။ တ + - ိ + - ု (တုိ) ႏွင့္ တ + - ု + - ိ (တုိ) တုိ႕မွာ ေဇာ္ဂ်ီတြင္ မတူညီၾကေပ။ သုိ႕ျဖစ္၍ ပထမ တုိ ကုိ ရွာေဖြရန္ ႀကိဳးစားရာတြင္ ဒုတိယ တုိ ကုိ ထည့္သြင္း ရွာေဖြခုိင္းပါက ရွာေတြ႕မည္ မဟုတ္ပါေခ်။ တူညီေသာစာလံုးမ်ားကုိ ရုိက္ထည့္ေသာ အစီအစဥ္ မတူညီျခင္းေၾကာင့္ ကြန္ပ်ဴတာက မတူညီဟု အေျဖထုတ္ေပးျခင္းမွာ လက္ခံႏုိင္ဖြယ္ အရည္အေသြးတစ္ရပ္ မဟုတ္ေပ။ ေဇာ္ဂ်ီျဖင့္ ေရးသားထားေသာ ျမန္မာစာတုိ႕မွာ တေန႕တျခား တုိးပြားလာေနရာ ေနာင္တခ်ိန္တြင္ ၄င္းတုိ႕သည္ ရွာရ၊ ေဖြရခက္သည့္ စာအုပ္ပံုႀကီးႏွင့္ အတူတူပင္ ျဖစ္လာေတာ့မည္ ျဖစ္သည္။ (အဆုိေတာ္ စုိင္းစုိင္းခမ္းလႈိင္၏ အေၾကာင္းကို ေရးသားသူ တ၀က္က စ + - ိ + - ု + င + - ္ + - း ဟု ေရးၿပီး က်န္တ၀က္က စ + - ု + - ိ + င + - ္ + -း ဟု ေရးပါက မည္သုိ႕ ျဖစ္မည္ကို မွန္းဆၾကည့္ပါ။) သုိ႕ရာတြင္ ေရွးယခင္ လက္ႏွိပ္စက္မ်ားကဲ့သုိ႕ပင္ သေ၀ထုိးႏွင့္ ရရစ္ကုိ ဗ်ည္းမရုိက္ခင္ ရိုက္ရျခင္း၊ ဗ်ည္းတြဲမ်ား (ရရစ္၀ဆြဲ၊ ယပင့္၀ဆြဲ စသည္တုိ႕)ကုိ ခလုတ္တစ္ခ်က္ႏွိပ္ရံုႏွင့္ ေရးသားႏုိင္ျခင္းတုိ႕မွာ သံုးစြဲသူတုိ႕ ႏွစ္သက္ဖြယ္ျဖစ္သည္။

Windows စနစ္အမ်ားစုတြင္ ေဇာ္ဂ်ီစနစ္ျဖင့္ ျမန္မာစာ ေရးသားရန္အတြက္ အခမဲ့ ရရွိႏုိင္ေသာ Zawgyi installer application ကုိ သြင္းလုိက္ရန္သာလုိအပ္ၿပီး ဖတ္ရႈရန္အတြက္မူ သာမာန္ font တစ္ခု သြင္းသကဲ့သုိ႕ ေဇာ္ဂ်ီ font ကုိ သြင္းလုိက္ရန္သာ လုိအပ္သည္။ ေရးသားရန္အတြက္ လက္ကြက္မွတပါး ေလ့က်င့္ရန္ မလုိအပ္ေပ။ အသံုးျပဳရလြယ္ကူျခင္းေၾကာင့္ ယေန႕တြင္ online ေပၚရွိ ျမန္မာစာအသံုးျပဳမႈ (blog, forum, chat application) အမ်ားစုသည္ ေဇာ္ဂ်ီ ျမန္မာစာ စနစ္ျဖင့္ ျဖစ္သည္။

Unicode 5.1 အဆင့္မီ ျမန္မာစာစနစ္မ်ား

Myanmar 3 အပါအ၀င္ Unicode 5.1 စနစ္သံုး ျမန္မာစာစနစ္မ်ားသည္လည္း အစုိးရက ေထာက္ခံေနလင့္ကစား အားနည္းခ်က္မ်ား ရွိဆဲပင္ျဖစ္သည္။ ဥပမာအားျဖင့္ ေမာက္ခ်ာ (- ါ) ႏွင့္ ေရးခ်ာ (- ာ) တုိ႕မွာ စာလံုး ၂ လံုးျဖစ္ေနသည္။ အကၡရာစဥ္ရာတြင္ ၄င္းတုိ႕ကုိ အတူတူဟု သေဘာထားၿပီး စီရသည္။ (ေဇာ္ဂ်ီ၏ ရရစ္ကဲ့သုိ႕ပင္ မလုိအပ္ပဲ code-range ကုိ ျဖဳန္းတီးသကဲ့သုိ႕ ျဖစ္ေနပါသည္။) အသတ္ (- ္)ႏွင့္ ပံုစံတူေသာ္လည္း အသတ္ႏွင့္ ဘာမွမဆုိင္ေသာ ေရွ႕ထုိး (ဥပမာ ေကာ္ မွ - ္) မွာ code မရွိပါ။ တနည္းအားျဖင့္ဆုိေသာ္ Unicode 5.1 သည္လည္း တုိးတက္ေျပာင္းလဲဦးမည့္ အရိပ္အေယာင္မ်ား ရွိေနပါသည္။ သုိ႕ရာတြင္ ၄င္းသည္ စာရိုက္ရာတြင္ သတ္မွတ္ထားသလုိသာ ရုိက္သြင္းရသျဖင့္ ေဇာ္ဂ်ီကဲ့သုိ႕ တုိ ၂ မ်ိဳး ျဖစ္ေနစရာ မရွိသျဖင့္ ေဇာ္ဂ်ီထက္ ပုိမုိ တည္ၿငိမ္မည္ဟု ေမွ်ာ္လင့္ရသည္။

ထုိ႕ျပင္ Myanmar – 3 ကိုအသံုးျပဳရန္အတြက္ အနည္းငယ္ရႈပ္ေထြးေသာ အဆင့္မ်ား လုိအပ္သည္။ Windows စနစ္တြင္ ဖတ္ရႈရန္အတြက္လဲ သီးသန္႕ software မ်ား သြင္းရန္ လက္ရွိအခ်ိန္တြင္ လုိအပ္ဆဲျဖစ္သည္။ ၄င္းကုိ အသံုးျပဳ ေရးသားရန္အတြက္ အခ်ိန္အနည္းငယ္ၾကာမွ် ေလ့က်င့္ရန္ လုိအပ္ပါသည္။

ဘာကုိသံုးရမလဲ၊ ဘာေၾကာင့္ လူမ်ားစု မသံုးေသးတာလဲ။

ယေန႕တြင္ အစုိးရ၀န္ႀကီးဌာနမ်ားအားလံုးကို Myanmar-3 ကုိ အသံုးျပဳရန္ ညႊန္ၾကားထားပါသည္။ ထုိ႕ေၾကာင့္ e-Government စနစ္မ်ားကို ေနာင္အနာဂါတ္တြင္ မိတ္ဆက္ခဲ့ပါက Myamar – 3 ကုိ ႏုိင္ငံသားတုိင္း မျဖစ္မေန အသံုးျပဳရမည္မွာ ေသခ်ာသေလာက္ ရွိသည္။ ထုိ႕ျပင္ Windows စနစ္မ်ားတြင္ Unicode 5.1 ကုိ အေထာက္အပံ့ေပးပါက ဖတ္ရေရးရခက္ေသာ ျပႆနာမွာ အလုိအေလ်ာက္ ေျပလည္သြားမည္ျဖစ္သည္။ (ယခုအခါ KDE သံုး Linux မ်ားတြင္ Myanmar – 3 ကုိ ဒီအတုိင္း ဖတ္လုိ႕ရၿပီျဖစ္သည္။) ထုိအခ်ိန္တြင္ ေဇာ္ဂ်ီသည္ Myanmar- 3 ထက္ပုိ၍ ေရးရ၊ ဖတ္ရလြယ္သည္ဆုိေသာ အားသာခ်က္ မရွိႏုိင္ေတာ့ေပ။

အသံုးမ်ားေသာ ေဇာ္ဂ်ီမွ Unicode 5.1 သို႕ေျပာင္းလဲႏုိင္ေရးသည္ တကယ္တမ္းအားျဖင့္ ကြန္ပ်ဴတာ သိပၸံ ျပႆနာ တစ္ရပ္မဟုတ္ပါ (အက်ယ္ကုိ ေလာကအလွႏွင့္ အင္တာဗ်ဴး ရႈ)။ Myanmar – 3 ကုိ ေျပာင္းရမည္မွာလဲ ေသခ်ာ၊ ေဇာ္ဂ်ီကုိလဲ ၾကာရွည္ အသံုးျပဳရန္လဲ အဆင္မေျပ၊ တစ္ဦးခ်င္း ေျပာင္းရန္လဲ နည္းပညာအရ လြယ္ကူ လွ်င္ျမန္ပါလွ်က္ႏွင့္ ေဇာ္ဂ်ီကုိ လူမ်ားစု ဖက္တြယ္ထားၾကျခင္းမွာ အေၾကာင္းရင္း ၂ ရပ္ေၾကာင့္ ျဖစ္သည္။ ပထမ အေၾကာင္းရင္းမွာ Myanmar – 3 တြင္ လက္ႏွိပ္စက္အတုိင္း ရုိက္မရပဲ ေလ့လာသင္ၾကားမႈ လုိအပ္ေသာေၾကာင့္ (ေဇာ္ဂ်ီ၏ တခုတည္းေသာ အားသာခ်က္) ျဖစ္သည္။ ဒုတိယ အေၾကာင္းရင္းမွာ လူမ်ားစု သံုးစြဲျခင္း မျပဳေသာေၾကာင့္ အထီးက်န္မည္ကုိ စုိးရိမ္သည့္ လူမႈေရး ျပႆနာျဖစ္ၿပီး ပုိမုိအေရးႀကီးသည္။

နိဂံုး

ယခုစာတမ္းငယ္တြင္ 8 bit font၊ Burglish၊ ေဇာ္ဂ်ီႏွင့္ Myanmar – 3 အစရွိေသာ ျမန္မာစာ စနစ္အမ်ိဳးမ်ိဳး၏ သေဘာသဘာ၀မ်ားကို သိနားလည္မွ Unicode အဆင့္မီ ျမန္မာစာစနစ္မ်ားသုိ႕ ေျပာင္းလဲရန္ အစီအစဥ္ကုိ ႀကံဆႏုိင္မည္ျဖစ္သျဖင့္ ၄င္းတုိ႕၏ ဂုဏ္သတၱိမ်ားကုိ နည္းပညာႏွင့္ လူမႈေရး (သမိုင္းေၾကာင္းႏွင့္ သံုးစြဲသူမ်ား) ရႈေထာင့္မ်ားမွ တင္ျပထားသည္။ အဆုိပါ ေတြ႕ရွိခ်က္မ်ားကုိ အေျခခံ၍ Unicode အဆင့္မီ ျမန္မာစာစနစ္မ်ားသုိ႕ ေျပာင္းလဲႏုိင္ရန္ အစီအစဥ္ကုိ ဆက္လက္ေဆြးေႏြးရန္ က်န္ရွိေနပါေသးသည္။

Wednesday, July 9, 2008

UMDH ျဖင့္ မွတ္ဥာဏ္ယုိေပါက္မ်ားကုိ ရွာေဖြျခင္း

ေအာက္ပါ post ပါအေၾကာင္းအရာမ်ားကုိ Intel® Core™2 Duo E6550 @2.33 GHz, DDR 2 1GB x 4, Microsoft Windows XP Professional Service Pack 2 တပ္ဆင္ထားေသာ ၃၂ ဘစ္ စက္တြင္သာ စမ္းသပ္ထားၿပီး ျဖစ္ၿပီး ေရးသားခ်ိန္တြင္ တတ္ႏုိင္သေလာက္ တိက် မွန္ကန္ေစရန္ ႀကိဳးစားထားေသာ္လည္း post ပါ အေၾကာင္းအရာမ်ား၏ မွန္ကန္တိက် မွီခုိႏုိင္စြမ္းကုိ ေလာရွည္ - ကတဲ့ပြဲမွ အာမမခံပါ။ သံုးစြဲျခင္းေၾကာင့္ တစံုတရာ နစ္နာဆံုးရႈံးမႈ ျဖစ္ပြားလာပါက သံုးစြဲသူ၏ တာ၀န္သာ ျဖစ္ေၾကာင္း ႀကိဳတင္ အသိေပးအပ္ပါသည္။ 

Pointer Arithmetic အသံုးျပဳေသာ အစီအစဥ္ (Program) မ်ားကုိ ေရးသားရာတြင္ ျဖစ္တတ္ေသာ ျပႆနာတစ္ရပ္မွာ ရယူထားေသာ မွတ္ဥာဏ္ (memory) ေနရာ (space) မ်ားကုိ ျပန္လည္စြန္႕လႊတ္ျခင္း (deallocation) မျပဳမိသည့္အခါ အပံု (heap) ထဲတြင္ မွတ္ဥာဏ္ေနရာလြတ္ ကုန္ခမ္း သြားတတ္ျခင္းပင္ ျဖစ္သည္။ အထူးသျဖင့္ အမႈိက္သိမ္းစနစ္ (Garbage Collection System) မပါရွိသည့္ C/C++ ကဲ့သုိ႕ေသာ ဘာသာစကားမ်ားတြင္ အဆုိပါ ျပႆနာသည္ ေကာက္ရုိးပံု အပ္ေပ်ာက္သလုိ ရွာရခက္ေသာ ျပႆနာ တစ္ရပ္ျဖစ္ပါသည္။ Windows NT Platform (Windows NT, Windows 2000, Windows XP and Windows Vista) တြင္ အဆုိပါ ျပႆနာကုိ အေျဖရွာႏုိင္ရန္အတြက္ UMDH ဟုေခၚေသာ အစီအစဥ္တစ္ခုကို Microsoft မွ အခမဲ့ ျဖန္႕ျဖဴးေပးထားရာ ယခုေဆာင္းပါးငယ္တြင္ အဆုိပါ အစီအစဥ္ကုိ အသံုးျပဳပံု အဆင့္ဆင့္ကုိ ေရးသားရွင္းလင္းမည္ ျဖစ္ပါသည္။ 

UMDH သည္ Debugging Tools for Windows package တြင္ပါ၀င္ေသာ အစီအစဥ္တစ္ခု ျဖစ္သည္။ ၄င္းကုိ အသံုးျပဳရန္အတြက္ အဆုိပါ package ကုိ အရင္ဆံုး download လုပ္ရမည္ျဖစ္သည္။ မိမိ အသံုးျပဳမည့္ စနစ္ႏွင့္ ကိုက္ညီရာကုိ ေရြးခ်ယ္ရန္ သတိျပဳပါ။ ထုိ႕ေနာက္တြင္ Windows Symbol Package ကုိ download လုပ္ရယူရမည္ျဖစ္သည္။ Symbol Package ကုိ ေရြးခ်ယ္ရာတြင္ မိမိ debug လုပ္မည့္ အစီအစဥ္ကုိ အသံုးျပဳမည့္ စက္ေမာင္းႏွင္စနစ္ (Operating Systems) ႏွင့္ကုိက္ညီရာကုိ ေရြးခ်ယ္ရမည္ျဖစ္သည္။ (စက္တလံုးတည္းတြင္ debug လုပ္မည္ဆုိပါက အဆိုပါစက္၏ ေမာင္းႏွင္စနစ္ကုိသာ ေရြးပါ။) 

အထက္ပါ အေပ်ာ့ထည္မ်ားကုိ ထည့္သြင္းၿပီးပါက သင္၏ စက္ေမာင္းႏွင္စနစ္ကုိ debug mode ျဖင့္ စႏႈိး (boot) ပါ။ Windows XP Professional တြင္ My Computer ကုိ ညာကလစ္ျဖင့္ ႏွိပ္ပါ။ Properties ကုိေရြးပါ။ Advanced tab ကုိ သြားပါ။ Startup and Recovery Setting ကုိ ႏွိပ္ပါ။ Edit ကုိ ႏွိပ္ပါ။ သင္၏ စက္ေမာင္းႏွင္စနစ္ စာေၾကာင္း ေဘးတြင္ "/debug" ဟုျဖည့္သြင္းပါ။ (ဥပမာ …\WINDOWS="Microsoft Windows XP Professional" /fastdetect /debug အခ်ိဳ႕ကမူ ထုိစာေၾကာင္းကို ၂ ေၾကာင္းကူးၿပီး တစ္ခုတြင္ "/debug" ဟု ထည့္သြင္းတတ္သည္။)

ထုိ႕ေနာက္ System Path Variable ကုိ UMDH (ႏွင့္ Debugging Tools for Windows) ထည့္သြင္းထားေသာ လမ္းညႊန္ (Directory) သုိ႕ ေျပာင္းေပးပါ။ My Computer ကုိ ညာကလစ္ႏွိပ္ၿပီး Properties ကုိေရြးပါ။ Advanced tab ကုိသြားပါ (အထက္ပါအတုိင္းတူတူပင္ျဖစ္သည္။) Environment Variables ကုိ ႏွိပ္ပါ။ System variables မွ path ကုိရွာၿပီး UMDH ရွိရာ လမ္းညႊန္ကုိ ဆီမီး ၉ လံုး (semi-colon) ခံၿပီး ေနာက္ဆံုးတြင္ ထည့္သြင္းပါ။ အားလံုးကုိ အုိေကႏွိပ္ပါ။ စက္ကုိ restart လုပ္ပါ။ 

စက္ျပန္တက္လာလွ်င္ _NT_SYMBOL_PATH ဟုေခၚေသာ Environment Variable ကုိ သင္ Symbol ထည့္သြင္းထားခဲ့ေသာ လမ္းညႊန္သုိ႕ ေျပာင္းေပးရမည္ျဖစ္သည္။ set _NT_SYMBOL_PATH=SRV*c:\Windows\Symbols ဟု အမိန္႕ေပးပါ။ (Symbol မ်ားကုိ အျခား လမ္းညႊန္သို႕ ထည့္သြင္းမိလွ်င္ c:\Windows\Symbols အစား အဆုိပါလမ္းညႊန္၏ လမ္းေၾကာင္းကုိ ျဖည့္သြင္းပါ။) သင့္ အစီအစဥ္အတြက္ gflags ကုိ ခ်ိန္ေပးရန္အတြက္ "gflags /i yourprogram.exe +ust" ဟု အမိန္႕ေပးပါ။ UMDH သံုးစြဲရန္ အသင့္ျဖစ္ပါၿပီ။ 

သင္၏ အစီအစဥ္ကုိ မွတ္ဥာဏ္ယိုေပါက္ (memory leakage) မျဖစ္ခင္ အေနအထားတြင္ ရပ္တန္႕ေစ၍ (breakpoint ေပးလုိက္လွ်င္ အလြယ္ဆံုးျဖစ္သည္) umdh –p:<your_program_process_id> -f:<logfile1_path_with_ext> -g ဟု အမိန္႕ေပးပါ။ (Process Id ကုိ သိရန္အတြက္ tlist ဟု အမိန္႕ေပး၍ ၾကည့္ရႈႏုိင္ပါသည္။) ထုိ႕ေနာက္တြင္ မွတ္ဥာဏ္ယုိေပါက္ အၿပီးေလာက္ဟု ထင္ေသာေနရာသုိ႕ ေရာက္သည္အထိ ဆက္လက္လုပ္ေဆာင္ေစပါ။ umdh –p:<your_program_process_id> -f:<logfile2_path_with_ext> -g ဟု ထပ္မံအမိန္႕ေပးပါ။ 

ယခု သင္၏ အစီအစဥ္ရွိ မွတ္ဥာဏ္ယုိေပါက္မတုိင္မီႏွင့္ မွတ္ဥာဏ္ယိုေပါက္အၿပီး မွတ္ဥာဏ္အသံုးခ်မႈဆုိင္ရာ အခ်က္အလက္မ်ား logfile1 ႏွင့္ logfile2 တုိ႕တြင္ သိမ္းဆည္းၿပီး တည္ရွိေနပါၿပီ။ အဆုိပါ file မ်ားကုိ ႏႈိင္းယွဥ္ၾကည့္ရႈရန္အတြက္ umdh –d –v –l <logfile1_path> <logfile2_path> ဟု ႏွိပ္ပါက အဆုိပါ အစီအစဥ္ ေနရာ ၂ ခုၾကား ရယူထားၿပီး ျပန္မစြန္႕လႊတ္ရေသးသည့္ မွတ္ဥာဏ္ေနရာမ်ားကုိ ေတြ႕ရွိရပါလိမ့္မည္။ ("> <text_file_path>" ဟု အမိန္႕ေနာက္တြင္ ျဖည့္သြင္းၿပီးမွ အမိန္႕ေပးလွ်င္ ဖန္သားျပင္ေပၚတြင္ ေပၚလာမည့္ အေျဖမ်ားကုိ အဆုိပါ text_file_path တြင္ ေရးသားေပးပါသည္။) 

ဥပမာ

+ 4132 ( 4132 - 0) 1 allocs    BackTraceD3

+ 1 ( 1 - 0)    BackTraceD3    allocations

    (blar blar blar)

    MSVCR80D!fprintf+0000029C (f:\rtm\vctools\crt_bld\self_x86\crt\src\fprintf.c, 70)

    YourProject!leakyFunction+000005EB (d:\leaky.cpp, 325)

    (blar blar blar)

    kernel32!RegisterWaitForInputIdle+00000049

ဟုေတြ႕ရွိရပါက မွတ္ဥာဏ္ မွတ္တမ္း ၂ ခုအၾကားတြင္ leakyFunction (leaky.cpp မွ လိုင္းအမွတ္ ၃၂၅) မွ မွတ္ဥာဏ္ ၄၁၃၂ ဘုိက္ရယူထားၿပီး ျပန္မစြန္႕လႊတ္ရေသးသည္ကုိ ေတြ႕ရွိရပါလိမ့္မည္။ 

စာရႈသူ မိတ္ေဆြမ်ား မွတ္ဥာဏ္ယိုေပါက္မ်ားျဖင့္ ေခါင္းကိုက္ရျခင္း ဒုကၡမွ ကင္းေ၀းပါေစ။