Monday, December 10, 2007

XML Schemas
(XML သဒၵါ (၀ါ) XML အဓိပၸါယ္ သတ္မွတ္မွဳ) - အပိုင္း ( ၄ )

အပိုင္း ( ၁ ) ၊
( ၂ ) ႏွင့္ ( ၃) ကို အရင္ဖတ္ၾကည့္ေစခ်င္ပါသည္။

Content Models

တခါတေလမွာ Empty element ေတြဟာ အေရးပါအရာေရာက္ေပမယ့္ မ်ားေသာအားၿဖင့္ တန္ဖိုး (value) ရိွတဲ့ element ေတြပဲမ်ားပါတယ္။ element တစ္ခုဟာ ရိုးစင္းတဲ့ content အမ်ိဳးအစားေတြရိွတယ္။ number တို ့ string တို ့လိုမ်ိဳးေပါ့။ ဒါမွမဟုတ္ စာေတြတၿခား element ေတြ ေရွာေထြးေနတာမိ်ဳးလည္း ၿဖစ္တက္တယ္။

element တစ္ခုဟာ သူ ့ေအာက္မွာ အၿခား element မရိွဘဲ တန္ဖိုး (value) ပဲရိွတယ္ဆိုရင္ သူကို ရိုးရွင္းတဲ့ content (simple content) လို ့ေခၚတယ္။တကယ္လို ့ element တစ္ခုဟာ သူကိုယ္တိုင္က parent element ၿဖစ္ၿပီး သူ ့ေအာက္မွာ child element ေတြရိွတယ္ဆိုရင္ သူ ့ကို element content လို ့ေခၚတယ္။ ေနာက္ဆံုး တစ္ခုအေနနဲ ့ စာေတြေရာ ၊ child element ေတြေရာ ေရာေထြးၿပီးရိွေနတယ္ဆိုရင္ သူကို mixed content လို ့ေခၚတယ္။ ဒါက ဘယ္အေၿခအေနမွာ ဘယ္လို သံုးႏွန္းတာလည္းဆိုတာကို ေၿပာတာပါ။

element တစ္ခုကို တည္ေဆာက္တဲ့ အခါ အရိုးရွင္းဆံုးနည္းကေတာ့ built in data type (XML မွာ အလိုအ ေလွ်ာက္ပါၿပီးသား data အမ်ိဳးအစား) ကို သံုးတာၿဖစ္ပါတယ္။အဲဒီထဲမွာ string, decimal, date, Boolean, နဲ ့ time တို ့ပါ၀င္ၾကပါတယ္။ data အမ်ိဳးအစားက လည္း built in၊ content ကလည္း ရိုးရွင္းတဲ့ ေဒတာ (simple data) ဆိုရင္ stand alone element declaration ကို သံုးလို ့ရပါတယ္။ ဥပမာ -

<xs:element name="quantity" type="xs:interger"/>

ဒီ ေၾကညာခ်က္ေလးက <quantity> ဆိုတဲ့ element တစ္ခုကို အသံုးၿပဳႏိုင္ေအာင္လုပ္ေပးပါလိမ္မယ္။ ေဒတာ အမ်ိဳးအစားကေတာ့ interger ေပါ့။

<quantity>5</quantity>

ေဒတာအမ်ိဳးအစာ decimal ၊ temperature element အတြက္ဆိုရင္

<xs:element name="temperature" type="xs:decimal"/>

XML ဖိုင္ထဲမွာေတာ့ ဒီလိုသံုးလို ့ရေရာေပါ့။

<temperature>9.89</temperature>

ေဒတာအမ်ိဳးအစာ date၊ holiday element အတြက္ဆိုရင္

<xs:element name="holiday" type="xs:date"/>

XML ဖိုင္ထဲမွာေတာ့ ဒီလိုသံုးလို ့ရေရာေပါ့။

<holiday>2007-12-13</holiday>

date ေဒတာအမ်ိဳးအစားက YYYY-MM-DD(ႏွစ္၊ လ၊ ရက္) ကို သတ္မွတ္ေပးပါတယ္။

ေဒတာအမ်ိဳးအစာ boolean ၊ attendenct element အတြက္ဆိုရင္

<xs:element name="attendenct" type="xs:boolean"/>

XML ဖိုင္ထဲမွာေတာ့ ဒီလိုသံုးလို ့ရေရာေပါ့။

<attendenct>true</attendenct>

ေဒတာအမ်ိဳးအစာ string ၊ title element အတြက္ဆိုရင္

<xs:element name="title" type="xs:string"/>

XML ဖိုင္ထဲမွာေတာ့ ဒီလိုသံုးလို ့ရေရာေပါ့။

<title>XML Schema Introduction</title>

အဲဒီလို ေပါ့။ ဟုတ္လား။
ပံုစံ ထုတ္ၾကည့္ရင္ ဒီလို ေၿပာလို ့ရမယ္။

<xs:element name="element" type="xs:data_type"/>

element ေတြကို ဒီလို ေၾကညာတာဟာ simple content (အထဲမွာ data ပဲပါၿပီး ဘာမွမပါတာ) ေတြအတြက္ဆို အလုပ္လုပ္ပါ တယ္။ ဒါေပမယ့္ တကယ္လက္ေတြ မွာေတာ့ အဲဒီလို ့ string, date , decimal , boolean ေဒတာေလးေတြ ပဲ ပါတာ မဟုတ္ဗ်။ ပိုၿပီးေတာ့ ရွုပ္ေထြးတယ္။ ဒါေၾကာင့္ content model ဆိုၿပီးၿဖစ္လာရတယ္။ ေအာက္ကေတာ့ အဲဒီအေၾကာင္းပါပဲ။

<simpleType>

ဆက္ရန္။(ေနာက္ေန ့မွ ဒီပိုစ္မွာပဲ ဆက္ေရးပါမယ္)။

အာေကလာ(akela)
Dec 10, 2007 09:53 pm





Wednesday, December 5, 2007

temp Explaination




namespace testingWebLinks

{
class Program
{
static void Main(string[] args)
{
string line;

Dictionary<string,string> dictionaryOutLinks = new Dictionary<string,string>();
သူက page တစ္ခုစီမွာ out links ဘယ္ႏွခုရိွလည္း ကို သိမ္းမွာ။
Dictionary<string,string> dictionaryInLinks = new Dictionary<string,string>();
သူက page တစ္ခုစီမွာ in links ဘယ္ႏွခုရိွလည္း ကို သိမ္းမွာ။
Dictionary<string,string> dictionaryOutPages = new Dictionary<string,string>();
သူက page တစ္ခုစီမွာ ဘယ္ out page ေတြဆီိကို ထြက္သြားတာလည္းကို သိမ္းမွာ။
Dictionary<string,string> dictionaryInPages = new Dictionary<string,string>();
သူက page တစ္ခုစီမွာ ဘယ္ in page ေတြက ၀င္လာတာလည္းကို သိမ္းမွာ။

dictionaryInLinks.Clear();
dictionaryOutLinks.Clear();
dictionaryInPages.Clear();
dictionaryOutPages.Clear();
ဒါကေတာ့ စစခ်င္း clear လုပ္တာပါ။ အေရးမၾကီးပါ။

// Read the file and display it line by line.
String visitedString = "Visited:";
သူက ငါတို ့ဖတ္မဲ့ link က visited link ဟုတ္လား မဟုတ္လားကို စစ္ဖို ့။
String curVisitStr = String.Empty;
သူကေတာ့ လက္ရိွ visited link ကို သိမ္းထားဖို ့ (program အရ လိုေနလို ့ပါ။ေလာဂ်စ္အရ အေရးမၾကီး)။

Int32 inCounter = 0; in links စုစု ေပါင္း
Int32 outCounter = 0; out link စုစုးေပါင္း
Boolean isInVisited = false; သူက မလို ပါဘူး။

System.IO.StreamReader file = new System.IO.StreamReader("C:\\Documents and Settings\\nhyan\\Desktop\\weblinks.txt");
ငါတို ့.. web log file ကို ဖတ္လိုက္တာ။
try
{
while ((line = file.ReadLine()) != null) တစ္ေၾကာင္းခ်င္းloop ပတ္တယ္။
{
if (line.StartsWith(visitedString))ဖတ္လိုက္တဲ့ link က visited နဲ ့ စတာလားကို စစ္
{
if (outCounter != 0) ပထမဆံုး visited link လား ေနာက္မွ ေတြ ့တဲ့ visited link လားစစ္
{
dictionaryOutLinks[curVisitStr.Trim()] = outCounter.ToString();
outCounter = 0; isInVisited = false;
}
dictionaryOutLinks.Add(line.Trim(), outCounter.ToString());
dictionaryOutPages.Add(line.Trim(), String.Empty);
ပထမဆံုး visited link ကို သိမ္းတယ္။သူရဲ ့ counter က ေလာေလာဆယ္ 0 ေပါ့။
curVisitStr = line.Trim();
curVisitStr ထဲကို လက္ရိွ link ကို ထည့္တယ္။
isInVisited = true; ဒါကမလို
}
else ဖတ္လိုက္တဲ့ link က visited နဲ ့ စတာမဟုတ္ဘူးဆိုရင္
{
if (isInVisited == true)ဒါလည္း မလို
{
if (!dictionaryInLinks.ContainsKey(line.Trim()))
In links dictionary ထည္းမွာ လက္ရိွ link ဟာ ရိွပီးလား ကို စစ္( မ၇ိွေသးဘူးဆိုရင္)
{
inCounter++; in coutner ကို ၁ တိုး
dictionaryInLinks.Add(line.Trim(), inCounter.ToString());
In links dictionary ကို လက္ရိွ Link က key၊ in counter က value အၿဖစ္ သိမ္း
outCounter++;
out counter ကိုလည္း ၁ တိုး.. ဒါက တစ္ေၾကာင္းဖတ္တိုင္း တိုးရမွာေလ ။ အခုက out link ကို ဖတ္ေနတာ
dictionaryInPages.Add(line.Trim(), curVisitStr);
in page dictionary ကို လည္း လက္၇ွိဖတ္ေနတဲ့ link ရယ္၊ အေပၚက visited link ၇ယ္ကို key value အၿဖစ္သိမ္း
}
else
In links dictionary ထည္းမွာ လက္ရိွ link ဟာ ရိွပီးလား ကို စစ္( ရိွတယ္ဆိုရင္) ရိွပီးသားကို update လုပ္ရမယ္ေလ အသစ္ထည့္လို ့မရေတာ့ဘူး
{
String tempValue = String.Empty;
String tempString = String.Empty;

// in link dictionar ကို key လက္၇ိွ link ေပးပီ ေတာ့ value ကို ထုတ္ယူ
dictionaryInLinks.TryGetValue(line.Trim(), out tempValue);
inCounter = Convert.ToInt32(tempValue);
inCounter++;
အဲဒီ value ကို ၁ တိုး
dictionaryInLinks[line.Trim()] = inCounter.ToString();
ၿပန္ပီးေတာ့ ထည့္

//dictionaryInLinks.Remove(line);
//dictionaryInLinks.Add(line, inCounter);

//တဆက္တည္း in page ပါ update လုပ္သြား
dictionaryInPages.TryGetValue(line.Trim(), out tempValue);
လက္ရိွ link ကို key အၿဖစ္ ေပးပီးေတာ့ထုတ္ယူ
tempString = tempValue.Trim() + "::" + curVisitStr.Trim();
value ကို update လုပ္
dictionaryInPages[line.Trim()] = tempString;
ၿပန္ထည့္

outCounter++;
ဒါကေတာ့ out counter ကို ၁ တိုးရမယ္ေလ။
}
String tempOutValue = String.Empty;
dictionaryOutPages.TryGetValue(curVisitStr.Trim(), out tempOutValue);
tempOutValue = tempOutValue + "::" + line.Trim();
dictionaryInLinks[curVisitStr.Trim()] = tempOutValue;
}
}
}

ဒီေအာက္ပိုင္းက.. dictionary ထည္းမွာ သိမ္းထားတာေတြကို txtဖိုင္မွာ ၿပန္၇ိုက္ထုတ္တာ။
Int32 i = 0;
TextWriter twOutLink = new StreamWriter("C:\\Documents and Settings\\nhyan\\Desktop\\outLinks.txt");
foreach (KeyValuePair kvp in dictionaryOutLinks)
{
if (i == 0)
{
// write a line of text to the file
twOutLink.Write("OUT LINKS");
twOutLink.WriteLine("\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t PAGES");

i = 1;
}

twOutLink.WriteLine("{0} \t\t\t\t {1}",
kvp.Key, kvp.Value);
}
// close the stream
twOutLink.Close();

Int32 j = 0;

TextWriter twInLink = new StreamWriter("C:\\Documents and Settings\\nhyan\\Desktop\\inLinks.txt");
foreach (KeyValuePair kvp in dictionaryInLinks)
{
if (j == 0)
{
// write a line of text to the file
twInLink.Write("OUT LINKS");
twInLink.WriteLine("\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t PAGES");

j = 1;
}

twInLink.WriteLine("{0} \t\t\t\t {1}",
kvp.Key, kvp.Value);
}
// close the stream
twInLink.Close();
}
catch (KeyNotFoundException exp)
{
Console.Write(exp.ToString());
}

// Suspend the screen.
Console.ReadLine();
}
}
}

Tuesday, December 4, 2007

XML Schemas
(XML သဒၵါ (၀ါ) XML အဓိပၸါယ္ သတ္မွတ္မွဳ) - အပိုင္း ( 3 )

အပိုင္း ( ၁ ) ႏွင့္ ( ၂ ) ကို အရင္ဖတ္ၾကည့္ေစခ်င္ပါသည္။

id
ဒီ id စြမ္းရည္ၿပစကားလံုး (attribute) ေလးက ကၽြန္ေတာ္တို ့ကို ဘာလုပ္ခြင့္ ၿပဳလဲဆိုေတာ့၊ element တစ္ခုအတြက္ ID (Identity) ကို ေၾကညာခြင့္ၿပဳပါတယ္။ ဒီ id ရဲ ့ တန္ဖိုး (value) ဟာ element ရဲ ့ Unique Key (ထပ္တူမရိွေသာ တန္ဖိုး) အၿဖစ္ လုပ္ေဆာင္ေပးပါတယ္။

maxOccurs
ဒီ maxOccurs က XML Document ထဲမွာ Element တစ္ခုဟာ ဘယ္ႏွစ္ၾကိမ္ ပါ၀င္ခြင့္ ရိွတယ္ဆိုတာကို သတ္မွတ္ေပးပါတယ္။ ဥမပါ schemas မွာ ဒီလို ေၾကညာထားမယ္ဆိုပါစို ့-

<element name="part" maxOccurs="3"/>


ဒါဆို XML Document ထဲမွာ part element ေလးဟာ အမ်ားဆံုး 3 ၾကိမ္ ပါလို ့ရပါတယ္။ (ေအာက္မွာၾကည့္ပါ)။

<car>
<part>wheel</part>
<part>body</part>
<part>roof</part>
</car>


မရိွသံုးတန္ဖိုး(default value) အေနနဲ ့ maxOccurs ရဲ ့တန္ဖိုးဟာ 1 ၿဖစ္ပါတယ္။ အႏွတ္ကိန္းမဟုတ္တဲ့ တန္ဖိုးမ်ားကို လက္ခံပါတယ္။ အဲလို ဂဏန္း (interger) ေတြမဟုတ္ပဲ "unbounded" လို ့ တန္ဖိုးသတ္မွတ္ခဲ့ ရင္ element တစ္ခုဟာ ၾကိဳက္သေလာက္ ပါႏိုင္တယ္လို ့အဓၶိပါယ္ရိွပါတယ္။

minOccurs

သူကေတာ့ maxOccurs နဲ ့ေၿပာင္းၿပန္ပါ။ XML Document ထဲမွာ element တစ္ခုဟာ အနည္းဆံုး ဘယ္ႏွယ္ ၾကိမ္ပါ၀င္ႏိုင္လဲဆိုတာကို သတ္မွတ္ေပးပါလိမ့္မယ္။ မရိွသံုးတန္ဖိုး (default value ) က 1 ပါ။

တကယ္လို ့ feature ဆုိတဲ့ element ေလးကို ေၾကညာခ်င္တယ္ဗ်ာ။ အ၀တ္အထည္ အတြက္ေပါ့။ အဲဒီမွာ အနည္းဆံုးအေနနဲ ့ feature ၂ ခု၊ အမ်ားဆံုးအေနနဲ ့ feature ၆ ခုကို ပဲ ရိွေစခ်င္တယ္ဆိုပါစို ့။ ဒါဆို-

<element name="feature" minOccurs="2" maxOccurs="6">


(ကၽြန္ေတာ္တို ့ Database နဲ ့တြဲသံုးတဲ့ အခါ၊ Database မွာ attribute(colum) ရဲ ့ value က allow null (တန္ဖိုး မထည့္လည္း ရတဲ့ column) ဆိုရင္၊ XML တြဲၿပီးအလုပ္လုပ္တဲ့ အခါ၊ minOccurs ကို 0 တန္ဖိုး ေပးလိုက္ ဒါဆုိ အဲဒီ element (tag) ကမပါလည္း ရသြားၿပီး။ ဟုတ္။)

nillable
ဒီဟာေလးကေတာ့ boolean တန္ဖိုး ၿဖစ္တဲ့ true နဲ ့ false တစ္ခုခုကို လက္ခံပါတယ္။ သူက ဘာကိုေၿပာသလဲ ဆိုေတာ့ element တစ္ခုဟာ ဘာမွမပါတာ(nillable)ကို လက္ခံလားမခံလားဆိုတာကိုပဲ။ လက္ခံတယ္ (true) ရင္ element တစ္ခုဟာ EMPTY element ၿဖစ္ႏိုင္ပါတယ္။

<part></part> (၀ါ) <part/> (empty element)


ref

သူကေတာ့ နည္းနည္း ရွဳပ္သလို ရိွတယ္။

ref စြမ္းရည္ၿပစကားလံုး (attribute) ေလးဟာ global ေၾကညာထားတဲ့ elemnt တစ္ခုကို ၿပန္ၿပီး ေတာ့ သံုးခ်င္တဲ့ အခါမွာ အသံုးၿပဳပါတယ္။ ဥမပါ ၾကည့္ရေအာင္ -

<xs:schema>
<xs:element name="full_name" type="xs:string"/>
<xs:element naem="supervisor">
<xs:complexType>
<xs:element ref="full_name"/>
</xs:complexType>
</xs:element>
<xs:element name="employee">
<xs:complexType>
<xs:element ref="full_name"/>
</xs:complexType>
</xs:element>
</xs:schema>


ဒီ ဥပမာေလးမွာ full_name element ေလးတစ္ခုကိုေၾကညာထားပါတယ္။ ပီးေတာ့ ref attribute ကို သံုးၿပီး ေတာ့ supervisor နဲ ့ employee element တို ့မွာ ၿပန္ညြန္းထားပါတယ္။ ဒီေနရာမွာဘာ ကအေရးၾကီးလဲဆို full_name ကို global scope မွာ ေၾကညာရတာပါပဲ။ ref ကို သံုးခ်င္ရင္၊ အသံုးခံရမယ့္ element ဟာ global ၿဖစ္ေစ၊ သံုးမယ့္ element နဲ ့ level တစ္ခုတည္းမွာၿဖစ္ေစရိွရပါမယ္။ အေပၚဥပမာဆိုရင္၊ full_name elemnt ဟာ (အနီေရာင္) ၿပန္ၿပီး reference လုပ္မဲ့ ဟာႏွစ္ခု (အစိမ္းေရာင္) တို ့ရဲ ့ အၿပင္ global scope မွာရိွ ေနတယ္။ ဟုတ္။ ေနာက္သတိၿပဳရမွာတစ္ခ်က္က ref ကို global ေၾကညာမယ့္ element မွာ မသံုးဘူးဆိုတာပါပဲ။ (အေပၚဥပမာဆိုရင္၊ full_name မွာ ref မသံုးထားပါ)

ဒါေၾကာင့္ သေဘားတရားအရ ေအာက္ပါဥပမာမ်ိဳး ကို လုပ္လို ့မရပါဘူး။

<xs:element>
<xs:element name="full_name" type="xs:string"/>
<xs:element ref="full_name" type="xs:string"/>
<xs:schema>


သေဘာေပါက္တယ္ဟုတ္ :D ။

ေလာေလာဆယ္ေတာ့... .
ဆက္ရန္။ (အားေသးဘူးဗ်ာ)။

အာေကလာ(akela)
Dec 04 , 2007 9:23 pm

Wednesday, November 28, 2007

XML Schemas
(XML သဒၵါ (၀ါ) XML အဓိပၸါယ္ သတ္မွတ္မွဳ) - အပိုင္း ( ၂ )

အပိုင္း ( ၁ ) ကို အရင္ဖတ္ၾကည့္ေစခ်င္ပါသည္။

Valid <element>  Attribute


XML Schema မွာ element တစ္ခုကိုေၾကညာမယ္ဆိုရင္ <element> ဆိုတဲ့ tag ကို အသံုးၿပဳရပါတယ္။ ဒီ တက္(ဂ္)ေလးကဘယ္ element ရဲ ့ အစမွာဆိုပါပါတယ္။ ဒီ <element> tag ေလးမွာ attribute လို ့ေခၚတဲ့ ဒီတက္ေလးဟာ နာမည္ဘယ္လိုေခၚေၾကာင္း၊ ဘာေဒတာအမ်ိဳးအစားၿဖစ္ေၾကာင္း၊ စသည္ၿဖင့္ ေၿပာၿပ ေပးမယ့္ စြမ္းရည္ၿပစကားလံုး (attribute) ေလးေတြရိွပါတယ္။ (ေအာက္မွာၾကည့္ပါ)

    - default
- fixed
- id
- maxOccurs
- minOccurs
- name
- nillable
- ref
- substitutionGroup
- type


ဟုတ္ပီလား။ ကၽြန္ေတာ္တို ့ တစ္ခုခ်င္းစီကို ၾကည့္ၾကရေအာင္။ ဒါမွ element ကိုေၾကညာတဲ့အခါ ဘယ္လိုတည္ေဆာက္လို ့ ရတယ္ဆိုတဲ့ structure ကို သိသြားမယ္။

name
ဒီ name ဆိုတဲ့ စြမ္းရည္ၿပ စကားလံုး (attribute) ေလးက XML document ဖိုင္တစ္ခုထဲ မွာရိွတဲ့ element တစ္ခုရဲ ့ နာမည္ကို သတ္မွတ္ေပးပါတယ္။ ဥပမာ - XML Schema မွာ ဒီလို ေရးထားတယ္ဆိုပါဆို ့။

<xs:element name="address"/>


ဒါဘာကိုေၿပာတာလည္းဆိုရင္ ဒီ Schema ကို သံုးမယ့္ XML document ထဲမွာသံုးႏိုင္တဲ့ <address> ဆိုတဲ့ tag ကို ေၾကညာလိုက္တာပါပဲ။ ဒီလို name ကိုတန္ဖိုး သတ္မွတ္ေပးတဲ့ အခါ (ဒီေနရာမွာ address ေပါ့) letter နဲ ့စရပါမယ္။ XML ဆိုတဲ့ စလံုးနဲ ့ ဒါမွမဟုတ္ သူနဲ ့ေပါင္းစပ္ထားတဲ့ စာလံုးနဲ ့ စလို ့မရပါဘူး။ ":" ကို namespace အတြက္ အသံုးၿပဳပီး၊ "_" ကို ေတာ့ သံုးႏိုင္ပါတယ္။
ိုု
defualt
ဒါေလးက string အမ်ိဳးအစား တန္ဖိုးတစ္ခုကို ကၽြန္ေတာ္တို ့့element ရဲ ့ မရိွသံုးတန္ဖိုး (default value) အၿဖစ္ထည့္ေပးပါတယ္။ ဒါေၾကာင့္ တကယ္လို ့ copyright element တစ္ခုကို ဒီလိုေရးခဲ့မယ္ဆိုရင္ -

<element name="copyright" default="Copyright 2008"/>


ဒါဆိုရင္ <copyright> လို ့ေခၚတဲ့ element တစ္ခုကို ဖန္တီးပီးေတာ့ အဲဒီ element မွာဘာတန္ဖိုး (value) မွ မထည့္ခဲ့ရင္ မရိွသံုးတန္ဖိုး (default value) အေနနဲ ့ Copyright 2008 ကိုယူသြားမွာၿဖစ္ပါတယ္။ ဥပမာ -

<copyright></copyright>  


ဒီလိုၿဖစ္ေနခဲ့ရင္ တန္းဖိုးမရိွေတာ့
Copyright 2008 သူရဲ ့တန္ဖိုး(value) အေနနဲ ့ယူသြားမွာၿဖစ္တယ္။ဒါနဲ ့ အတူတူပါပဲ။


<copyright>Copyright 2008</copyright> 


တကယ္လို ့ တန္းဖိုးရိွခဲ့တယ္ဆိုရင္ေတာ့ အဲဒီတန္ဖိုးကိုပဲယူပါတယ္။ မရိွသံုးတန္ဖိုး (default value) ကို မသံုးပါဘူး။

XML document file ကို ေရးတဲ့ သူက အဲဒီ element ကို တန္ဖိုး ထည့္ေပးေပးမေပးေပး မစဥ္းစားဘူး။ element တစ္ခုက တန္ဖိုး(value) တစ္ခုရိွကိုရိွရမယ္။ အဲဒီလို အခ်ိန္မ်ိဳးမွာ ဒီ default ေလးဟာ အလြန္အသံုးက်ပါတယ္။

fixed
ဒီဟာကေတာ့ string အမ်ိဳးအစား တန္ဖိုးတစ္ခုကို element ရဲ ့ တန္ဖိုးအၿဖစ္သတ္မွတ္ေပးလိုက္ပါတယ္။ သေဘာက XML Schema ဖိုင္မွာ ဒီလို ေၾကညာခဲ့မယ္ဆိုရင္ -

<xs:element name="info" fixed="For Information No 001"/>


ဟုတ္ပီ။ ဒါဆိုရင္ XML Document ဖိုင္ထဲမွာ <info> ဆိုတဲ့ tag ရိွမယ္ေပါ့။ အဲဒီ tag ေလးဟာ
For Information No 001 ဆိုတဲ့ တန္ဖိုး(value) ပါကိုပါရမယ္။

<info>For Information No 001</info>


XML Document ဖိုင္ကို ေရးတဲ့ သူကို တန္ဖိုး(value) မေၿပာင္း ေစခ်င္ဘူးဆိုရင္
ဒီ fixed စြမ္းရည္ၿပစကားလံုး (attribute) ကို သံုးပါတယ္။ Schema မွာ ေၾကညာထားတဲ့ တန္ဖိုး (ဒီေနရာမွာ Information No 001) ကို သံုးကိုသံုးရပါတယ္။ XML Document ဖိုင္ကေန ေၿပာင္းလို ့မရပါဘူး။

ဆက္ရန္။

အာေကလာ(akela)
Nov 28 , 2007 1:00 am

Tuesday, October 23, 2007

XML Schemas
(XML သဒၵါ (၀ါ) XML အဓိပၸါယ္ သတ္မွတ္မွဳ) - အပိုင္း ( ၁ )

Document Type Definition (DTD) ဟာ တခ်ိဳ ့ စြမ္းေဆာင္ခ်က္ေတြကို ရယူေပးဖို ့အတြက္ အကန္ ့အသက္ရိွေပမယ့္ XML ရဲ ့သဒၵါ (Schema) ကို ေဖာ္ၿပဖို ့ အတြက္ တကယ္ကို ေကာင္မြန္တဲ့ နည္းလမ္းတစ္ခုပါပဲ။ DTD ဟာ အေမြဆက္ခံၿခင္း (inheritance)၊ နယ္နိမိတ္သတ္မွတ္္ၿခင္း (scoping) တုိ ့ကို ခြင့္မၿပဳပါ ဘူး။ ဒါအၿပင္ ေဒတာ အမ်ိဳးအစားသတ္မွတ္ၿခင္း (datatyping) ကိုလည္း DTD နဲ ့လုပ္လို ့မရပါ။ DTD က ခြင့္မၿပဳေပမယ့္ ဒီ ကိစၥေတြဟာ XML ဒီဇိုင္းအတြက္ အသံုး၀င္တဲ့ အရာေတြပါ။ ဒါေၾကာင္း XML Schema မွာေတာ့ ဒါေတြကို လုပ္ေဆာင္ႏိုင္ေအာင္ ထည့္သြင္း တည္ေဆာက္္ခဲ့ပါတယ္။

XML Schemas ဆိုတာ သူတို ့ကိုယ္ႏိွက္က well-formed XML ေတြပါပဲ။ ဒါဟာ XML Schemas ရဲ ့ အေတာ္ကို ၾကီးမားတဲ့ အားသာခ်က္တစ္ခုပါပဲ။
ရိုးရွင္းတဲ့ XML Schema တစ္ခုကို ၾကည့္ရေအာင္။

<?xml version=”1.0” encoding=”utf-8” ?>
<xs:schema xmlns:xs = “http://www.w3.org/201/XMLSchema”>
<xs:element name=”Occupation” type=”xs:string”/>
</xs:schema>


ဒါဟာ အလြန္ရိုးရွင္းတဲ့ schema တစ္ခုပါပဲ။ ဒီ schema က Occupation ဆိုတဲ့ element တစ္ခုကို သတ္မွတ္ေပးပါတယ္။ အဲဒီ element ရဲ ့ ေဒတာ အမ်ိဳးအစားက string ပါ။


<?xml version=”1.0” encoding=”utf-8” ?>


ပိုၿပီး အေသးစိတ္ၾကည့္ရေအာင္။ ဒါက XML ေၾကညာတာပါပဲ။ ဒီဟာေလးဟာ ဘယ္ XML ဖိုင္ တိုင္းရဲ ့ အစမွာမဆို ပါေလ့ရိွပါတယ္။ သူက အသံုးၿပဳမယ့္ application ကို XML ဖိုင္ၿဖစ္ေၾကာင္း 1.0 XML Recommendation ေပၚမွာ အေၿခၿပဳထားေၾကာင္း၊ UTF-8 character encoding ကို သံုးထားေၾကာင္း စသည္တိုကို သိေစပါတယ္။ (XML schema ဟာ XML ပဲဆိုတာကို မေမ့ပါနဲ ့ဦး။) ဒီလို တူတဲ့ အတြက္ parser တစ္ခုတည္းကို XML document ကိုေရာ schema အတြက္ကိုေရာ အသံုးၿပဳႏိုင္ပါတယ္။

ထပ္ၾကည့္မယ္ဆိုရင္ ဒီလို ေတြ ့ပါလိမ့္မယ္။

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">


ဒီအေၾကာင္းေလးက xs (အနီေရာင္ႏွင့္ၿပထားသည္။) ဆိုတဲ့ Namespace ကို သတ္မွတ္ေပးပါတယ္။ ဒီမွာသံုးထားတဲ့ xs ဆိုတာ http://www.w3.org/2001/XMLSchema ရဲ ့ xs ပါတဲ့ ။

ဒါကလဲ အေရးၾကီးပါတယ္။ သူက ေနာက္ပိုင္းကၽြန္ေတာ္တို ေၿပာဆိုေဆြးရမယ့္ နယ္နိမိတ္သတ္မွတ္္ၿခင္း (scoping) နဲ ့ ဗားရွင္းသတ္မွတ္ၿခင္း (versioning) တိုကို ၿဖစ္ေစပါတယ္။

<xs:element name="programmer" type="xs:string"/>


ဒါကေတာ့ ကၽြန္ေတာ္တို ့ရဲ ့ Schema ကုိသံုးၿပီး element တစ္ခုကို ေၾကညာလိုက္တာပါပဲ။
ဒီေနရာက xs:element ဆိုတာမွာ xs က အေပၚက ကၽြန္ေတာ္တို ့ေၾကညာခဲ့တဲ Namespace ကိုယူသံုးလိုက္တာပါ။ သူက programmer ဆိုတဲ့ element တစ္ခုကို ေၾကညာေၾကာင္း၊ အဲဒီ element ရဲ ့ ေဒတာအမ်ိဳးအစား က string ၿဖစ္ေၾကာင္းတို ့ကို ေၿပာၿပပါတယ္။ ဒီေနရာမွာ type ကေလးက XML Schema မွာ အေရးၾကီးတဲ့ attribute ေလးပါပဲ။ သူက ေဒတာအမ်ိဳးအစားသတ္မွတ္ၿခင္း (datatyping) ကို လုပ္ေပးတယ္ေလ။

ဆက္ရန္။

ရည္ညြန္း။ ။ Using XML by David Gulbransen, et al.

အာေကလာ(akela)
Oct 23 , 2007 7:51 pm


Tuesday, August 21, 2007

Scope in JavaScript (part 4)
(JavaScript ????????? ????????? ????????) - ??????? ?

(??????? ? ? ? ????? ? ??? ????????????????????????)


.bind() ???????? ? ???


????????????? apply() ? call() ??? ? ?? ? ???????????????????????????? ?????????? .bind() ?????????? ????????? ????? ?????????? function ?? ? ??????(reference) ???? ???? (return) ????????????????????????????? ?????????????? ???????????? ??? ???????????????? ??????? ????????????? ?????????????????


<script type="text/javascript">
var _president = {
_answer: "I am the president"
};
var _secaretary = {
_answer: "I am the secaretary of president"
};

function aboutMe(greetingWord) {
return greetingWord + " " +this._answer;
}

Function.prototype.bind = function(obj) {
var method = this,
temp = function() {
return method.apply(obj, arguments);
};

return temp;
}
var whatTheysays;

whatTheysays = aboutMe.bind (_president, ["Hello My Country,"]); // "Hello My Country, I am the president"
alert(whatTheysays);

whatTheysays = aboutMe.bind (_secretary, ["Hello My Officer,"]); // "Hello My Officer, I am the secretary of president"
alert(whatTheysays);
</script>


???????????? ? bind() ??? Function object ?? ? prototype propety ??? ???????? ?????????????? ???? ???????????? ? ?????????? ? ?????? (method) ??????? ??? ?????????????????????? aboutMe.bind(_president) ????????? ?????? Javascript ? bind() ??????????? execution context ???????? ???????????? ???????? this ??? ???? aboutMe ??? ??????????????? ????? ??? prarmeter ??????? obj ??? _president ?????????????????? ??????????????? :D?

???? ????? ? ???????? method ??? ?????? ??????????? method ????? this ??? ???????? ???????? ???? this ? aboutMe() ??? ????? ???????? ?????????? function ??? ?????????????????? ???????????????????? method ??? scope chain ??????? ???? ???????????? ????????? this ??? ??????? ? ???????? ??????? function ???? ??? ????????? ????????? this ? ???? ????? ???????? (local context) ?????????????? aboutMe() ??????????????? ??????? function ?? ????????? ???????? ??????????????

??????????????????? ?? ????????? temp ? closure (????????????????????? ????????????????) ????? bind() ??? ??????? ? ???? (return ) ?????????? aboutMe ??? _president object ???????? ?????????????????? ?????? ????????? ????? execution context ??? ??????????? ? ??????? ???????????? ???????????????????

??? ???????????? ? event handler ????? ????????????? ??????????????????? :D ? ????? ???????? ????? event handler ??? ????? ????????????????


<script type="text/javascript">

var the_button;
function aboutMe(answer)
{
this._answer = answer;
this.tell = function() {
alert(this._answer);
}
}
Function.prototype.bind = function(obj) {
//alert(this + 'this in bind');
//alert(arguments[0].the_answer);
var method = this,
temp = function() {
return method.apply(obj, arguments);
};

return temp;
}

function addhandler()
{
var _president = new aboutMe(“I am the president.”),
var the_button = document.getElementById('thebutton');
the_button.onclick = _ president.tell();
//alert(this + ' this in addhandler');
the_button.onclick = _president.tell.bind(_president);
}
</script>

……
……

<BODY onload="javascript:addhandler();" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#FF0000" VLINK="#800000" ALINK="#FF00FF" BACKGROUND="?">
<button ID="theButton">Click Me</button>
</BODY>
</HTML>


??? html ??? body ?? ? onload ??? addhandler() ??? ???? ?????????????????????????

????? ?????????????????????????.?

?????????????????? ????????


??????(akela)
Augest21, 2007 12:11 pm

Saturday, August 18, 2007

Scope in JavaScript (part 3)
(JavaScript မွာရိွေသာ နယ္နိမိတ္ သေဘာတရား) - အပိုင္း ၃

(အပိုင္း ၁ နဲ ့ ၂ ကို အရင္ဖတ္ၾကည့္ေစခ်င္ပါသည္။)

Context မ်ားကို .apply() နဲ ့ .call() မတ္သတ္(method) မ်ားသံုးၿပီး ကိုင္တြယ္ၿခင္း

တကယ္ေတာ့ ကၽြန္ေတာ္တို ့လို ခ်င္ခဲ့တာဟာ object ရဲ ့ မတ္သတ္(method) ကို events(အဗင့္) လိုမ်ိဳး၊ setTimeout() လို မ်ိဳး ကိုကိုင္တြယ္ဖို ့ သံုးတဲ့အခါက်ရင္ အဲဒီ method(မတ္သတ္)ကို သူရဲ ့ native context(မူလ ကြန္းတက္) ထဲမွာပဲ အလုပ္လုပ္(run) ေစခ်င္တာပါ။ လူသိနည္းတယ္လို ့ ဆိုႏိုင္တဲ့ မတ္သတ္ ၂ ခုရိွပါတယ္။ apply() နဲ ့ call() ပါ။ ဒီ မတ္သတ္ႏွစ္ခုကို သံုးၿခင္းအားၿဖင့္ ကၽြန္ေတာ္ တို ့ ဟာ this ရဲ ့ default value အေပၚကို လႊမ္းၿပီး(override) ေရးႏိုင္ပါတယ္။

<script type="text/javascript">
var _president = {
_answer: "I am the president"
};
var _secretary = {
_answer: "I am the secretary of president"
};
function aboutMe(greetingWord)
{

return greetingWord + " " +this._answer;
}
var whatTheysays;
whatTheysays = aboutMe.call(_president, "Hello My Country,");
alert(whatTheysays);
whatTheysays = aboutMe.call(_secretary, "Hello My Officer,");
alert(whatTheysays);
</script>


ဘယ္လိုလဲ :D ။ အလုပ္လုပ္တယ္ဟုတ္။ :P။

ဒီဥပမာေလးမွာဆိုရင္ ကၽြန္ေတာ္တို ့ president object ရယ္ secretary object ရယ္ဆိုၿပီး object ႏွစ္ခု ဖန္တီးလိုက္ပါတယ္။ သူတို တစ္ခုစီမွာ _answer ဆိုတဲ့ property ကို နာမည္ (name) အတူတူေပးလိုက္ပါတယ္။ ၿပီးေတာ့ aboutMe() ဆိုတဲ့ function တစ္ခုကိုဖန္တီး လုိက္ပါတယ္။အဲဒီ function က parameter တစ္ခုကိုလက္ခံပါတယ္။ greetingWord ပါ။ အဲဒီ function ထဲမွာ greetingWord ရယ္၊ သူဘယ္သူလဲဆိုတာကိုေၿပာတဲ့ စာအစဥ္အတန္း(string) (this._answre) ရယ္ကိုေပါင္းၿပီးၿပပါတယ္။ သတိထားမိလား.. this က call() ကပိုလိုက္တဲ့ object ေပၚမူတည္ၿပီးေၿပာင္းလဲသြားပါတယ္။ president ဆိုရင္ this.answer ဟာ _president ရဲ ့ _answer ၿဖစ္သြားၿပီး၊ _secretary ဆိုရင္ _secretary ရဲ ့ _answer ၿဖစ္သြားပါတယ္။ ဟုတ္။ ဒါဘာေၾကာင့္လဲ ဆိုေတာ့ call() မတ္သတ္(method) ေၾကာင့္ၿဖစ္ပါတယ္။ ပံုမွန္သာ aboutMe() ကို ေခၚတယ္ဆိုရင္ အားလံုးဟာ undified ပါပဲ။ ဘာလို ့ ဆိုေတာ့ global object ၿဖစ္တဲ့ window မွာ _answer ဆိုတဲ့ property မရိွပါဘူး။ ( ကၽြန္ေတာ္တို ့ က window object မွာ ကိုယ္ဖသာ ဒီ _answer ကို မဖန္တီးထားဘူးခဲ့ရင္ မရိွဘူးလုိ ့ ေၿပာတာပါ။) ဒီ call() မတ္သတ္ေလးက ကၽြန္ေတာ္တို ့လိုခ်င္ေနတာနဲ ့ အားလံုးကြက္တိပဲမဟုတ္လား။ :D ။

apply() က call() နဲ ့တူူတူပါပဲ။ အားလံုး တပံုစံပဲ အလုပ္လုပ္ပါတယ္။ တစ္ခုပဲကြဲတယ္။ဘာလဲဆိုေတာ့ apply() က arguments (parameters) ေတြကို array အေနနဲ ့လက္ခံပါတယ္။ ဒီ apply() မတ္သတ္က function တစ္ခုဟာ parameters ေတြကို ဘယ္ႏွစ္ခုလက္ ခံမယ္ဆိုတာကို ေသခ်ာမသိတဲ့ အခါမ်ိဳးမွာ အလြန္အသံုး၀င္ပါတယ္။

<script type="text/javascript">
.........
.........
whatTheysays = aboutMe.apply (_president, ["Hello My Country,"]);
alert(whatTheysays);

whatTheysays = aboutMe.apply (_secretary, ["Hello My Officer,"]);
alert(whatTheysays);
</script>


apply() နဲ ့ call() တိုဟာ သူဟာနဲ ့သူ အလြန္ အသံုး၀င္ပါတယ္။ ဒါေပမယ္ ဒီ ႏွစ္ခုဟာ တကယ္ေတာ့ ကၽြန္ေတာ္တို ့လိုခ်င္တာရဲ ့ လမ္းတ ၀တ္မွာပဲရိွေနပါေသးတယ္။ event handler အေနနဲ ့သံုးမယ္ဆိုရင္ေလ။ ဒီကုဒ္ေလးေတြကို ၾကည့္လိုက္ပါဦး။

function addhandler() 
{
var _president = new aboutMe(“I am the president.”),
var the_button = document.getElementById('thebutton');
the_button.onclick = _ president.tell.call(_president);
}


စမ္းၾကည့္ၿပီးၿပီ ဟုတ္။ ၿပသာနာက call() ေရာ apply() က ခ်က္ၿခင္း အလုပ္လုပ္(execute) လုပ္တာပါပဲ။ event handler အေနလုပ္တဲ့ အခါ event ကို ရိုတ္ထုတ္ (fire) လိုက္တဲ့ အခ်ိန္မွ မတ္သတ္(method) ကို အလုပ္လုပ္(Run) တာမဟုတ္ပဲ ခ်က္ၿခင္းအလုပ္လုပ္ တာက ၿပသာနာပါ။ ဒီအတြက္ ေနာက္ထပ္လူ သိနည္းတဲ့ function တစ္ခုရိွေနပါတယ္။ အလြန္အသံုး၀င္တဲ့ function ပါ။

ဆက္ရန္။

အာေကလာ(akela)
Augest 18, 2007 11:21 pm
Scope in JavaScript (part 2)
(JavaScript မွာရိွေသာ နယ္နိမိတ္ သေဘာတရား) - အပိုင္း ၂


(အပိုင္း ၁ ကို အရင္ဖတ္ၾကည့္ေစခ်င္ပါသည္။)

တကယ္လို ့ event handler က Inline ဖန္တီးထားတယ္ဆိုရင္၊ this က အားလံုးနဲ ့ဆိုင္တဲ ့ window object ကို ညြန္းပါတယ္။

<script type="text/javascript">
function click_handler()
{
alert(this); // alerts the window object
}
</script>
…..
<button id='thebutton' onclick='click_handler()'>Click me!</button>


တကယ္လို ့ မ်ား event handler ကုိ javaScript ကေနတဆင့္ ဖန္တီးထားတယ္ဆိုရင္၊ this က event ကို ရိုက္ထုတ္လိုက္တဲ ့ DOM (Document Object Model) ကို ညြန္းပါလိမ့္မယ္။


<script type="text/javascript">
function click_handler()
{
alert(this); // alerts the button DOM node
}
function addhandler() {
document.getElementById('thebutton').onclick = click_handler;
}
window.onload = addhandler;
</script>
...
<button id='thebutton'>Click me!</button>


scope က ဘယ္လို ့ ရွဳပ္ေထြးတာလဲ..

ကဲ၊ ကၽြန္ေတာ္တို ့ ေနာက္ဆံုး ဥပမာေလးကို ပဲ ထပ္ၿပီးၿပင္ၾကမယ္။ button ကို ႏိွပ္လိုက္တဲ့အခါတုိင္း click_handler ကို အလုပ္လုပ္ခိုင္း မဲ့ အစား aboutMe ဆိုတဲ့ method ကို ေမးခြန္းေမးပါမယ္။ ကုဒ္ေတြက ရိုးရွင္းပါတယ္။ ေအာက္မွာၾကည့္ပါ။



<script type = “text/javascript”>
function aboutMe(answer)
{
this._answer = answer;
this.tell = function() {
alert(this._answer);
}
}
function addhandler()
{
var _president = new aboutMe(“I am the president.”),
var the_button = document.getElementById('thebutton');
the_button.onclick = _ president.tell();
}
window.onload = addhandler;
</script>


ဟုတ္တယ္ဟုတ္ :D။ ရွင္းရွင္းေလးပဲမလား။ ဘာမ်ားရွဳပ္လို ့လဲဗ်ာ။ button ကို ႏိွပ္လိုက္တဲ့အခါ _president.tell() ကို အလုပ္လုပ္ေစပါတယ္။ ဒီေတာ့ I am the president ဆိုတဲ့ စာအစဥ္အတန္း(string) ကို ရိုက္ထုတ္ၿပမယ္ေလ။ ဟုတ္.. ဘာမွမရွဳပ္ဘူး။ ဒါေပမယ့္ web browser က တကယ္တမ္းဘာရိုက္ထုတ္ၿပလဲ။ စမ္းၾကည့္ေစခ်င္ပါသည္။

စမ္းၿပီးၿပီ..ဟုတ္။ :) ၾကည့္... ဘာမ်ားအမွားလုပ္ခဲ့ပါလိမ့္။ :|

ၿပသာနာကေတာ့..။ ကၽြန္ေတာ္တို ့ tell() ကို button ရဲ ့ onclick event ကို ကိုင္တြယ္ဖို ့ reference အၿဖစ္ပို ့ ေပးခဲ ့ ပါတယ္။ (the_button.onclick = _president.tell();)။ အဲဒီအခါ tell() ဟာ ( event handler အၿဖစ္ အလုပ္လုပ္ေနတဲ့ အတြက္) မတူကြဲၿပားတဲ့ execution context တစ္ခုထဲမွာ အလုပ္လုပ္(Run) ပါတယ္။ လြယ္လြယ္ ေၿပာရရင္ေတာ့ tell() ထဲမွာရိွတဲ့ this keyword က event ကို ရိုက္ထုတ္လိုက္တဲ့ DOM (Document Object Model) (ဒီေနရာမွာေတာ့ button ေပါ့) ကို ညြန္းပါတယ္။ သူဟာ aboutMe ရဲ ့ object မဟုတ္ေတာ့ပါဘူး။ DOM Element ၿဖစ္တဲ့ button မွာ _answer ဆိုတဲ့ property မရိွပါဘူး။ ဒါေၾကာင့္ browser က “I am the president” အစား underfined ကို ရိုတ္ထုတ္ၿပပါတယ္။

ဒီလို ၿဖစ္ရပ္မ်ိဳးက ကၽြန္ေတာ္တို ့ program ေတြမွာ မေမ်ာ္လင့္ ပဲၿဖစ္တက္ပါတယ္။ ေနာက္ၿပီး အမွားကို ရွာဖို ့ တခါတေလ မွာ အေတာ္ခက္ခဲ ပါတယ္။ ဥပမာ - ကၽြန္ေတာ္တုိ ဖန္တီးထားတဲ့ object (ဒီေနရာမွာ aboutMe ေပါ့) ရဲ ့ property နာမည္ (name) က event ကို ရိုတ္ထုတ္လိုက္တဲ့ DOM ရဲ ့ property နာမည္ (name) နဲ ့ သြားတူေနခဲ့မယ္ဆိုရင္ လြယ္လြယ္ အေၿဖရွာဖို ့ မၿဖစ္ႏိုင္ေတာ့ပါဘူး။

ဆက္ရန္။

အာေကလာ(akela)
August 17,2007 3:40 pm

မွတ္ခ်က္။ ။ပိုစ္တစ္ခုနဲ ့တစ္ခုၾကား အခ်ိန္ကြာဟလြန္းေနပါတယ္။ ေနာက္ဆို မကြာေအာင္ေရးသြားပါမယ္။

Saturday, August 4, 2007

Scope in JavaScript (part 1)
(JavaScript မွာရိွေသာ နယ္နိမိတ္ သေဘာတရား) - အပိုင္း ၁

Scope ဆိုတာ JavaScript programming ဘာသာရပ္မွာမွာ အေၿခခံက်တဲ့ အၿမင္ (aspects) တစ္ခုပဲၿဖစ္ပါတယ္။ တစ္ခါတေလ ရွဳပ္ေထြးတဲ့ ပရိုဂရမ္ေတြကို ေရးတဲ့အခါ ဒုကၡအေရာက္ဆံုး အရာလည္းၿဖစ္ႏိုင္ပါတယ္။

JavaScript ပရိုဂရမ္တစ္ပုဒ္ရဲ ့ဘယ္အစိတ္အပိုင္းမဆိုဟာ Execution Context တစ္ခု ဒါမွမဟုတ္ အၿခား Execution Context တစ္ခုထဲ မွာ လုပ္ကိုင္ရပါတယ္။ Execution Context ေတြကို ကၽြန္ေတာ္တို ့ ကုဒ္ေတြပါ၀င္တဲ့ အိမ္နီးနားခ်င္းေတြလို ့ ယူဆႏိုင္ပါတယ္။ ကုဒ္တစ္ေၾကာင္း တိုင္းဟာ သူဘယ္ကေနလာတယ္။ သူ ့ရဲ ့အိမ္နီးနားခ်င္းေတြက ဘယ္သူေတြပါ။ဒါေတြကို ေၿပာၿပပါလိမ့္မယ္။ ဒီ Execution Context ေတြဟာ အေရးၾကီးပါတယ္။သူတုိ ့ကို ပြင္ေန ့တဲ ့၊ ဖြင့္ ထားတဲ့ အပိုင္း အခြဲငယ္ေလးေတြလို ့ယူဆတာထက္၊ အစည္းအတား ရိွတဲ့ ဆက္ သြယ္မွဳ ့နယ္ပယ္ေလးေတြ (gated communities) လို ့ယူဆရင္ပိုေကာင္းမယ္လို ့ ထင္ပါတယ္။

ဒီအစည္းအတား နယ္ပယ္ေတြကို ကၽြန္ေတာ္တို ့က scope လို ့ ေၿပာဆိုၾကတယ္။ သူတို ့ဟာ ဒီ Execution Context တစ္ခုစီရဲ ့ ဥပေဒသ သေဘာသဘာ၀ (Ruls and Laws) ေတြ ရဲ ့သက္ေရာက္မွဳ ့ကို သတ္မွတ္ေပးမွာၿဖစ္လို ့ အေရးၾကီပါတယ္။ ဒါကို Execution Context ရဲ ့ Scope Change လုိ ့ေခၚ ပါတယ္။ Execution Context တစ္ခုထဲမွာ ရိွတဲ့ ကုဒ္ေတြဟာ အဲဒီ Execution Context ရဲ ့ Scope Change မွာ ပါ၀င္တဲ့ စာရင္း (list) အတိုင္းပဲ Variable ေတြကို အသံုးၿပဳလို ့ရပါတယ္။

method တစ္ခု ကို အလုပ္လုပ္ခိုင္း(Evaluate) ၿပီဆိုရင္ Execution context အသစ္တစ္ခုကို ဖန္တီးတည္ေဆာက္ပါတယ္။ ၿပီးေတာ့ သူရဲ ့ scope ကို အဲဒီ method ကိုေက်ညာထားတဲ့ ေနရာမွာရိွတဲ့ scope chain ထဲမွာ သြားၿပီးေပါင္းပါတယ္။ Execution Context တစ္ခုရဲ ့scope ကိုၾကည့္တဲ့အခါ အတြင္းမွ အၿပင္ကို (locally then globally)တဆင့္ၿခင္းတက္ၿပီးၾကည့္ပါတယ္။ ဒါကဘာကိုေၿပာတာလဲဆိုေတာ့ အတြင္း (local) က အၿပင္(global ) ထက္ပိုၿပီးဦးစားေပးခံရပါတယ္။ ဥပမာ - နာမည္တူေနတဲ့ variable ႏွစ္ခု၊ တစ္ခုု က အတြင္း (local) ၊ အၿခားတစ္ ခုကအၿပင္ (Global) ဆိုၿဖစ္ခဲ့တယ္ဆိုပါေတ့ာ။ ဘယ္ variable ကို ယူမလဲဆိုရင္ local variable ကို ပဲ ယူပါတယ္။

this? ဘာလဲ this ဆိုတာ။

Execution context တိုင္းက scope chain ကို ဖန္တီးတည္ေဆာက္ရံုုမက this ဆိုတဲ့ keyword ေလးတစ္ခုလည္းရိွပါေသးတယ္။ ပံုမွန္အား ၿဖင့္ဆိုရင္ေတာ့၊ ဒီ this ေလးက identity function ေလးပါ။ အိမ္နီးခ်င္း context ေတြကို သူ တို့ ကိုသူတို ့ဘယ္လို ၿပန္ၿပီး ညြန္လို ့ရႏိုင္မလဲ ဆိုတာ က္ုိလည္း ေၿပာၿပပါတယ္။ ဒါေပမယ့္. ကၽြန္ေတာ္တို ့ဟာ ဒီအခ်က္ေပၚမွာ အၿမဲတမ္း မွီတည္ ေနလို ့ မရပါ ဘူး။ အၿခားအိမ္နီးခ်င္း context ေတြထဲကို ဘယ္လို ေရာက္သြားတာလဲအေပၚမူတည္ၿပီး this ရဲ ့အဓိပါယ္က လံုး၀ကြဲၿပားသြားပါတယ္။ အၿခားအိမ္နီးခ်င္း context ေတြထဲ ဘယ္လို ေရာက္သလဲဆိုတာဟာ this ေလးက လက္ရိွ ဘာကို ညြန္းေနလဲလို ့ဆိုလိုတာပါ။

Object-oriented programming မွာ လက္ရိွ ရိွေနတဲ့ လုပ္ကိုင္ေနတဲ့ object ကို ၿပန္လည္ညြန္းၿပီးသံုး ႏိုင္ဖို ့အတြက္ နည္းလမ္းလို ပါတယ္။ this က ဒီလို အပ္ခ်က္ကို ၿဖည့္စည္းေပးပါတယ္။ object ေတြကို သူတို ့ကို သူတို ့ၿပန္ညြန္းဖို ့နဲ ့၊ သူတို ပိုင္ဆိုင္တဲ့ properties ေတြ၊ methods ေတြကို ၿပန္သံုးဖို ့ this က လုပ္ေပးပါတယ္။ ေအာက္ပါ အခ်က္ ၄ ခ်က္က စဥ္းစားဖိုေကာင္းပါတယ္။

၁။ Calling an Object’s Method (Object တစ္ခုရဲ ့ method ကို ေခၚၿခင္း)

<script type = “ text/javascript”>
var _phoLay = {
_answer: “I’m Pho
Tay.”,
tell:function() {
return this._answer;
}
};
var _whoAmI = _phoLay.tell ();
</script>


ဒီကုဒ္ေလးေတြဟာ _whoAmI ဆိုတဲ့ object တစ္ခုကို ဖန္တီးပါတယ္။ ၿပီးေတာ့ သူရဲ ့ property ၿဖစ္တဲ့ _answer ဆိုတဲ ့variable ထဲကို “I’m Pho Tay.” ဆိုတဲ့ စာအစဥ္အတန္း (String) တစ္ခု ထည္ပါတယ္။ေနာက္ tell ဆိုတဲ့ method တစ္ခုကိုေၾကညာပါတယ္။ ဒီ method ကို အလုပ္လုပ္ခိုင္းတဲအခါ JavaScript က execution context တစ္ခု တည္ေဆာက္ပါတယ္။ this ကိုေတာ့ ေနာက္ဆံုးး “.” (dot) ရဲ ့ ေရွမွာ ရိွတဲ့ ဘယ္ object ကိုမဆို ညြန္းခုိင္းပါတယ္။ ဒီမွာ ေတာ့ _whoAmI ေပါ့။ (_whoAmI.tell() ေလ။) tell() ဆိုတဲ့ method ေလးထဲ မွာေတာ့ this က ေနတဆင့္ သူပိုင္တဲ့ property ကိုၾကည္ပါတယ္။ ၿပီးေတာ့ အဲဒီ property ၊ this._answer ထဲက တန္ဖိုးကို return ၿပန္ပါတယ္။ (I’m Pho Tay.)။

၂။ Constructor (Constructor ကို ေခၚၿခင္း)


အေပၚကလို ပါပဲ။ new ဆိုတဲ့ keyword ကို သံုးၿပီး function တစ္ခုကို constructor အၿဖစ္သံုးတဲ့ အခါ၊ this ကို ဖန္တီးခံရတဲ့ object ကို ညြန္းတဲ့ အရာအေနနဲ ့ သံုးႏိုင္ပါတယ္။


<script type = “text/javascript”>
function aboutMe(answer) {
this._answer = answer;
this.tell = function() {
return this._answer;
}
}
var _phoLay = new aboutMe(“I’m pho lay.”);
var _whoAmI = _phoLay.tell();
</script>


ဒီကုဒ္မွာ ေတာ့ phoLay object ကုုိ ကိုယ္တုိင္တိုက္ရိုက္ိ explicitly ဖန္တီးမယ့္အစား ၊ aboutMe ဆိုတဲ့ function တစ္ခုကို ေရးလိုက္ပါတယ္။ ၿပီးမွ phoLay ကို aboutMe ရဲ ့ instance အၿဖစ္ new keyword ကေနတဆင့္ ရယူပါတယ္။ new aboutMe() ဆိုတဲ့ method ေလးကို အလုပ္လုပ္(execute)လုပ္ခိုင္းတဲ့အခါ ၊ ေနာက္ကြယ္မွာ လံုး၀ကြဲၿပာၿခားနားတဲ့ object တစ္ခုကို ဖန္တီးတည္ေဆာက္ပါ တယ္။ aboutMe() ကိုေခၚတဲ့အခါ ၊ this ကို အဲဒီ ဖန္တီးထားတဲ့ object ကို ညြန္းေစပါတယ္။ this က တၿခား variable ေတြလို scope chain ကေန ရယူတာမဟုတ္ပါ။ ဒါေပမယ္ သူက context by context ေပၚမူတည္ၿပီး ညြန္းတာေၿပာင္းလည္းပါတယ္။ context တစ္ခုကေန တစ္ခုကိုေၿပာင္းရင္ reset လုပ္ခံရပါတယ္။

၃။ Function Call (Function ေခၚၿခင္း)


တကယ္လို ့ ပံုမွန္ေရးသလို ပဲေပါ။ ေန ့စဥ္ေရးေလ့ရိွတဲ့ function လိုမ်ိဳး ရွဳပ္ေထြးတဲ့ object ေတြမပါခဲ့ဘူးဆိုရင္ this က ဘာကိုဆိုလိုသလဲ။


<script type = “text/javascript”>
function testing_this() {
return this;
}
var whatIsThis = testing_this();
</script>

ဒီမွာ this က ဘာကိုညြန္းပါသလဲ။ new keyword ကိုသံုးၿပီး context တစ္ခုလည္းမလုပ္ထားဘူး။ သူဘာကိုညြန္းပါသလဲ။ ဒီေနရာမွာ this ဟာ Global အက်ဆံုးအရာကို ညြန္းပါတယ္။ ဥပမာ - web page ေတြမွာဆိုရင္ global အက်ဆံုးက window object ပါ။ this က window object ကို ညြန္းပါလိမ့္မယ္။

၄။ Event Handler (Event မ်ားကို ကိုင္တြယ္ၿခင္း)


နည္းနည္းပိုၿပီးရွဳပ္ေထြးတဲ့ function calling ေတြမွာ၊ ဥပမာ- onclick event ကို ကိုင္တြယ္ဖို ့ function တစ္ခုသံုးမယ္ဆိုပါစို ့။ event ၿဖစ္ပြားတဲ့ အခါ this ကဘာ ကို ညြန္းမလဲ။ ဒီအတြက္ ရိုးရွင္းတဲ့အေၿဖတစ္ခုကို မေပးႏိုင္ခဲ့ၾကပါဘူး။

ဆက္ရန္။

အာေကလာ(akela)
August 4,2007 1:50 am

မွတ္ခ်က္။ ။ဖတ္မိေသာ article တစ္ခုကို ၾကိဳက္မိ၍ တက္နိုင္သမွ် ၿမန္မာလို ၿပန္လည္ေရးသားထာပါတယ္။
ေပ်ာ္ရြင္ခ်မ္းေၿမ ့ၾကပါေစ။



Wednesday, August 1, 2007

ေရးသူ - သန္ ့ေဇာ္မင္း
ေန ့စြဲ - july 31,2007
----------------------------------

C++ Programming Language (အပိုင္း - ၂)

Variable Declaration

ဒီတေခါက္ ကၽြန္ေတာ္တို႔ variable declaration အေၾကာင္းစလိုက္ရေအာင္။ variable declaration ဆိုတာက ကၽြန္ေတာ္တို႔ေရးတဲ႔ programမွာ အသံုးျပဳမယ္႔ variable ေတြကို ၾကိဳတင္ေၾကျငာတာ ျဖစ္ပါတယ္။ ကၽြန္ေတာ္တို႔ program အလုပ္လုပ္ေနခ်ိန္မွာ user (ကၽြန္ေတာ္တို႔ programကို အသံုးျပဳသူ) ေတြဆီကေန တန္ဖိုးတခုခုကို လက္ခံေတာ့မယ္ဆိုရင္၊ လက္ခံရရွိမယ့္ dataေတြကို သိမ္းထားမယ္႔ေနရာတခုကို ၾကိဳျပီး ေၾကျငာေပးထားရပါတယ္။ ဒါကို variable declaration လုပ္တယ္လို႔ ေခၚပါတယ္။ variable တခုကို ေၾကျငာလုိက္ျပီဆိုရင္ programကို အသံုးျပဳေနတဲ႔ computerရဲ့ memoryေပၚမွာ အဲဒီ variableအတြက္ ေနရာတခုကို createလုပ္ေပးပါတယ္။ အဲဒီေနရာမွာ ကၽြန္ေတာ္တို႔က dataေတြကို အခ်ိန္အတိုင္းအတာ တခုအထိ သိမ္းထားလို႔ရပါတယ္။ variable တခုကို ေၾကျငာေတာ့မယ္ဆိုရင္ အပိုင္း၂-ပိုင္း သိဖို႔လိုအပ္ပါတယ္။ variable ရဲ့ နံမယ္နဲ႔ သိမ္းခ်င္တဲ႔ dataရဲ့ အမ်ိဳးအစားတို႔ ျဖစ္ပါတယ္။ ဥပမာအားျဖင့္ variableမွာ numberကို သိမ္းခ်င္တယ္၊ စာသားကို သိမ္းခ်င္တယ္၊ စသည္ျဖင့္ ေျပာေပးရပါတယ္။ C & C++ မွာ သံုးလို႔ရတဲ့ data type ေတြက ေအာက္ပါအတိုင္းျဖစ္ပါတယ္။
Variable တခုကို ေၾကျငာတဲ႔ ပံုစံကေတာ့ ဒီလိုျဖစ္ပါတယ္။

ဆက္ဖတ္ရန္...
C++ Programming အပိုင္း ၂

မွတ္ခ်က္။ ။ ကိုသန္ ့ေဇာ္မင္း ရဲ ့ဘေလာမွာ july 31, 2007 6:05pm က သူကိုယ္တိုင္ေရးထားတာကို ခြင့္ေတာင္းၿပီး ၿပန္လည္ ေဖၚၿပထား ၿခင္းၿဖစ္ပါတယ္။ ကိုသန္ ့ေဇာ္မင္းကို ေက်းဇူးတင္ပါတယ္။
loiyoes

Tuesday, July 31, 2007

Mobile Device Troubleshooting 2
Unable to Debug/Traces in .net IDE with Mobile Device 5.0

တခါတေလမွာ သံုးေနတဲ့ mobile device နဲ ့ .net IDE တို ့ဟာ Breakpoint ေထာက္ ၿပီး Debugging လုပ္လို ့မရတဲ့အေၿခအေနကို ၾကံဳေတြ ့ရတက္ပါတယ္။ ဒါဟာ mobile developer တစ္ေယာက္အတြက္ေတာ့ ငရဲ ခန္းပါပဲ။ အရင္ကမွ Debugging လုပ္ရတာ ခက္ရတဲ့ အထဲ လုပ္လို ့မရဘူးဆိုရင္ သြားၿပီပဲ။ ဒီပိုစ္မွာ ၿဖစ္ႏိုင္ေခ်ရိွတဲ့ ၿပသာနာေတြထဲက တစ္ခုကို ေဖာ္ၿပလိုက္ပါတယ္။

ခင္းဗ်ားတို ့ရဲ ့ moblie version ကို ၿပန္စစ္ပါ။ compact framework version ဘယ္ေလာက္ ကို တင္ထားသလဲဆိုတာ ကို ၿပန္စစ္ပါ။ တကယ္လို ့ခင္ဗ်ားတို ့ရဲ ့ mobile device က compact framework version 2 တင္ထားတယ္ဆိုရင္ ခင္ဗ်ားတို ့ရဲ ့ PC ကိုလည္း version အတူတူတင္ဖို ့လို အပ္ပါတယ္။ compact framework 2.0 service pack 1 ကို ၿမင့္ (upgrade) လုပ္ထားတယ္ဆိုရင္လည္း PC ကို လည္းလုပ္ေပးရပါမယ္။ ဒီလို မွ မဟုတ္ရင္ ေတာ့ Visual Studio 2005 က version အေဟာင္းၾကီးကိုပဲသံုးေနၿပီး Debug လုပ္လို ့မရ ၿဖစ္ေနပါလိမ့္မယ္။

mobile device အတိုင္း PC ကို compact framework version အတူတူ ထည့္ ထားလိုက္ ရင္ အားလံုးအဆင္ေၿပပါလိမ့္မယ္။

ဒါကေတာ့ compact framework 2.0 service pack 1 download လင့္ခ ေလးပါ။

Compact Framework 2.0 Service pack 1 Download

အာေကလာ (akela)
july 31, 2007 8:19 pm

Saturday, July 28, 2007

ေရးသူ - သန္ ့ေဇာ္မင္း
ေန ့စြဲ - july 26,2007
--------------------------------

C++ Programming Language (အပိုင္း - ၁)

Programming language
Programming language ဆိုသည္မွာ ကြန္ပ်ဴတာကို ခိုင္းေစေသာ ဘာသာစကား ျဖစ္ပါသည္။ ကြန္ပ်ဴတာကိုခိုင္းေစသည္ ဆိုရာ၀ယ္ monitor ေရွ႕ တြင္ထိုင္ microsoft word, excel စသည့္ application ၁ခုခုကိုဖြင့္ keyboard ကိုတေဖ်ာင္းေဖ်ာင္းရိုက္၍ စာမ်ားေပၚလာေအာင္ ျပဳလုပ္နိုင္ျခင္းကို မဆိုလိုေပ။ ထိုသူမ်ားကို ကြန္ပ်ဴတာအသံုးျပဳသူ (user)မ်ားဟုေခၚေပသည္။ ထိုသူမ်ား အသံုးျပဳနိုင္ေအာင္ application မ်ားေရးသားျခင္း (ျပဳလုပ္ေပးျခင္း) ကိုသာ ဆိုလိုေပသည္။ ထိုသို႔ျပဳလုပ္သူမ်ားကို program ေရးသားသူ (programmer) မ်ားဟု ေခၚေပသည္။

အဂၤလိပ္လူမ်ိဳး တေယာက္နွင့္ ဆက္သြယ္ေျပာဆိုလိုလွ်င္ အဂၤလိပ္စာ၊ အဂၤလိ္ပ္စကား တက္ရန္လိုေပမည္။ ထို႔အတူ ကြန္ပ်ဴတာကို ဆက္သြယ္ခိုင္းေစရန္ ကြန္ပ်ဴတာနားလည္ေသာ ဘာသာစကားကို တက္ေျမာက္ရန္လိုေပသည္။ ဤနည္းအားျဖင့္ programming language မ်ားကို တီတြင္ေရးသားလာၾကသည္။ Assembly, C, Java, VB, .NET စသည္ျဖင့္ programming language မ်ားစြာရွိပါသည္။ အစကနဦး အသံုးျပဳခဲ႔ၾကေသာ language မ်ားမွာ ကြန္ပ်ဴတာကို တိုက္ရိုက္ခိုင္းေစနိုင္ရန္ ေရးသားရေသာေၾကာင့္ ေရးသားသူ လူသားတို႔အတြက္ နားလည္ရန္ခက္ခဲေလ့ရွိသည္။ ထို႔ေၾကာင့္ ေနာက္ပိုင္းတြင္ program ေရးသားသူမ်ားအတြက္ အဆင္ေျပေစရန္ ပိုမိုလြယ္ကူ၊ ပိုမိုေကာင္းမြန္ေသာ language မ်ားကို တီထြင္ဖန္တီး လာၾကသည္။ (ေနာင္တခ်ိန္တြင္ ကြန္ပ်ဴတာကို ပါးစပ္ျဖင့္ အမိန္႔ေပး ခိုင္းေစနိုင္လာေပလိမ့္မည္။)

ဆက္ဖက္ရန္......
C++ Programming အပိုင္း ၁


မွတ္ခ်က္။ ။ ကိုသန္ ့ေဇာ္မင္း ရဲ ့ဘေလာမွာ
july 26, 2007 8:41pm က သူကိုယ္တိုင္ေရးထားတာကို ခြင့္ေတာင္းၿပီး ၿပန္လည္ ေဖၚၿပထား ၿခင္းၿဖစ္ပါတယ္။ ကိုသန္ ့ေဇာ္မင္းကို ေက်းဇူးတင္ပါတယ္။
loiyoes

Thursday, July 26, 2007

Mobile Device Troubleshooting 1
SQL Query Analyzer.


ဒီေန ့အလုပ္လုပ္ရင္းၾကံဳလိုက္ရတဲ့ ၿပသာနာတခုပါ။ ပရိုဂရမ္ အလုပ္လုပ္ ေနတဲ့ mobile device က SQL Query Analyzer ကအလုပ္မလုပ္ေတာ့ဘူး။ နည္းစနစ္ဆိုင္ရာ ဗိသုကာ( Programm Architect) ကို ေမးၾကည့္ေတာ့ တခ်ိဳ ့ dlls ေတြကိုသြင္း ရမယ္လို ့ေၿပာတယ္။ သူေၿပာတဲ့ dlls ေတြက-

၁. sqlce30.dev.ENU.ppc.wce5.armv4i.CAB (*)
၂. sqlce30.ppc.wce5.armv4i.CAB (**)

တို ့ပါဘဲ။ mobile device ထဲမွာက SQL Query Analyzer က ရိွကို မရိွေတာ့တာ။ ဒါနဲ ့ sqlce30.dev.ENU.ppc.wce5.armv4i.CAB ကို သြင္းၾကည့္လိုက္တယ္။ SQL Query Analyzer ကို ၿမင္လာရတယ္။ OK ၿပီဆိုၿပီး Database ဖိုင္ (.sdf) ကို ဖြင့္ၾကည့္တဲ့အခါ အမွား ေတြတက္လာပါတယ္။ အမွားသတိေပးခ်က္( Error Message) ကေတာ့ -

Failed to initialize the provider. Please make sure that SQL Server
Mobile Edition is properly installed

ပါတဲံ။နည္းစနစ္ဆိုင္ရာဗိသုကာ (program Architect) ကလည္း ဘာေၾကာင့္လည္းဆိုတာမသိဘူး။ ဒါနဲ ့ ဆက္လက္ရွာေဖြမိတယ္။ ဒီလို နဲ ့ေတြ ့ပါတယ္။

qlce30.repl.ppc.wce5.armv4i.CAB (***)

ကို သြင္း (install) ပါတဲ့။ ဒီ .CAB ဖိုင္ကို သြင္းၿပီးသြားတဲ့အခါမွာေတာ့ အားလံုး အဆင္ ေၿပသြားပါတယ္။

ဒီဖိုင္ အားလံုးဟာ

C:\Program Files\Microsoft Visual Studio 8\SmartDevices\SDK\SQL Server\Mobile\v3.0\wce500\armv4I

ေအာက္မွာ ရိွပါတယ္။

။ ။ Mobile မွာ ဒီ ကဘ္(.CAB)ေတြကို ဘယ္လုိ သြင္းရမွန္းမသိသူေတြအတြက္ပါ။
Mobile မွာ သြင္း(install) ရတာလြယ္ပါတယ္။ သြင္းခ်င္တဲ့ ဖိုင္ေတြကို Mobile ရဲ ့ Explore Root ေအာက္တဲ့တဲ့မွာ သြားထားပါ။ Mobile Explore ကို ဖြင့္ခ်င္တယ္ဆိုရင္ ပံုမွန္ ကြန္ၿပဳတာရဲ ့ Explore ကေနလည္းသြားလို ့ရသလို ၊ Microsoft ActiveSync သံုးရင္းလည္း သူ Icon ကို ၾကြက္ရဲ ့ညာကို ႏွိပ္ ၿပီး Explore ဆိုရင္လည္းရပါတယ္။ ခုနက (.CAB) ဖိုင္ေတြကို Root ေအာက္မွာဘဲ Copy/Paste လုပ္ခ်ပါ။
ၿပီးရင္ Mobile ထဲကေန ၿပီး ခုနက ဖိုင္ေတြကို သြား ၿပီး Run ပါ။ ေအာင္ေအာင္ၿမင္ၿမင္ သြင္း(install) လို ့ရတယ္ ဆိုရင္ Successfully insatlled ဆိုတာေပၚလာပါမယ္။ ။


ေပ်ာ္ရြင္ၿငိမ္းခ်မ္းၾကပါေစ။

အာေကလာ (Akela)
July 26, 2007 2:05 pm

Sunday, July 22, 2007

Regular Expression (စကာလံုးအစုပံုစံ)

စကားလံုးအစုပံုစံ မိတ္ဆက္
(Introduction of Regular Expression)

:. ၁.၁
စကားလံုးအစုပံုစံ (Regular Expression) တစ္ခုဆိုတာ (ကြန္ၿပဴတာေလာက အသံုးအႏွဳန္းအားၿဖင့္္) string အမ်ိဳးအစားမ်ိဳး ၿဖစ္ပါတယ္။ သတ္မွတ္ထားတဲ့ ပံုစံ စည္းမ်ဥ္းစည္းကမ္းမ်ားအတိုင္း စကာလံုး (character) ေတြကို ရွာေဖြဖို ့၊ စကားလံုးအစု (a set of characters)တစ္ခုနဲ ့ အၿခား စကားလံုးအစု တို ့ကို တိုင္ဆိုင္ စစ္ေဆးခ်င္တဲ့ အခါမ်ိဳး၊ အဲဒီလို အခါေေတြမွာ သံုးေလ့ရိွပါတယ္။

တကိုယ္ေရသံုးကြန္ၿပဳတာေတြကို သံုးဖူးတဲ့သူေတြ ဆိုရင္ပဲ ဒီ စကာလံုးအစုပံုစံ (Regular Expression) ကို သံုးဖူးၾကမွာပါ။ စကားလံုးအစုပံုစံကိုသံုးေနတယ္လို ့ သိခ်င္မွေတာ့ သိပါမယ္။ ဥပမာ- ဖိုင္ေတြကို ရွာေဖြခ်င္တဲ့အခါမ်ိဳးေတြမွာေပါ့။ ဖိုင္နာမည္ data နဲ ့ စတဲ့ ဖိုင္အားလံုးကို ရွာခ်င္တယ္ဆိုပါေတာ့။

စက္ထဲမွာ က -
၁. data.doc ၊
၂. data1.doc ၊
၃. data2.doc ၊
၄. dataTXT.txt ၊
၅. dataEXE.exe ၊
၆. dataB.bat

ဆိုၿပီးရိွမယ္လို ့ယူဆၾကမယ္။ ဒါဆို ရွာေဖြတဲအခါ data*.doc ဆိုးၿပီးရိုက္ ထည့္လိုက္။ ၿပီးလို ့ search ဆိုတဲ့ button ေလးကို ႏိွပ္လုိက္ရင္ ခုနက အေပၚဆံုးဖိုင္ ၃ ဖိုင္ကို ကြန္ၿပဳတာ စီမံခန္ ့ခြဲေရးစႏွစ္ (Operating System - OS) က ရွာေပးပါလိမ္မယ္။ တကယ္လို ့ data?.* လို ့ရိုက္ထည့္ခဲ့မယ္ဆိုရင္ေတာ့ ၂ ၊ ၃ နဲ ့ ၆ တိုကို ရွာေပးပါ လိမ့္မယ္။ data*.* ဆိုရင္ေတာ့ ၆ ဖိုင္လံုးေပါ့။

wildcard characters ေတြလို ့ေခၚခဲ့ ၾကတယ္။ ရိုးရိုးရွင္းရွင္းေတြေပါ့။ အခုေၿပာမယ့္ စကားလံုးအစုပံုစံ မွာက ဒီထက္အမ်ားၾကီး က်ယ္ၿပန္ ့ပါတယ္။ အနည္းငယ္လည္း ခတ္မယ္။ wildcard characters ေတြက အေတာ္အသံုးက်ေပ့မယ္လို ့ အကန္ ့့အသတ္ ရိွတယ္။ သူတို ့ေတြဟာ စကားလံုးပံုအစုပံုစံ (Regular Expression) ရဲ ့ သေဘာတရား ကို မိတ္ဆက္ေပးခဲ့ပါတယ္။

:. ၁.၂
စကားလံုးအစုပံုစံရဲ ့ မူလဇစ္ၿမစ္ဟာ သီ၀ရီသေဘာတရားဆိုင္ရာကြန္ၿပဳတာသိပံၸ (theoretical computer science) ရဲ ့ အစိတ္အပိုင္းေတြၿဖစ္ၾကတဲ့ automata theory နဲ ့ formal language theory တို ့ပဲၿဖစ္ၾကပါတယ္။ စကားလံုးအစုပံုစံ ကို formal language theory နဲ ့ ေဖာ္ၿပေရးသားရပါတယ္။ (ေလ့လာလိုသူမ်ား ဆက္ၿပီးေလ့လာၾကပါ။ ဒီေၾကာင္း ေတြက ဒီပိုစ္နဲ ့မဆိုင္ပါ။)

:. ၁.၃
စကားလံုးအစုပံုစံ (Regular Expression) ကိုသံုးၿခင္းအားၿဖင့္

- အခ်က္အလက္ မွန္ကန္ေၾကာင္း စစ္ေဆးၿခင္းမ်ား (Data Validation & Verification)

ဥပမာ - ၀င္ေရာက္လာတဲ့ တယ္လီဖုန္းနံပါတ္ က ကိုယ္လိုခ်င္တဲ့ စံပံုစံ (pattern) ဟုတ္မဟုတ္စစ္ေဆးၿခင္း ၊ လိုခ်င္တဲ့ ပံုစံက ၉၀a-၃၄-၅d-၃ ဆိုပါေတာ့၊ အဲဒီပံုစံမဟုတ္ပဲ ၉၀3၅၅-၅%၇၅၄ ဆိုရင္္ စံပံုစံ (pattern) အားၿဖင့္ မွားတယ္။

- စာမ်ား အစားထိုးၿခင္း (Replace Text)

ဥပမာ - I love you very much. No matter what you are, I love you. ေပါ့။ဒီလို စာေတြ စာရြက္ေပါင္း မ်ားစြာရိွမယ္ဗ်ာ။ ဒါကို (ႏွစ္အနည္းငယ္ၾကာလာတဲ့အခါ) love အစား hate နဲ ့အစားထုိးခ်င္တယ္ ဆိုပါေတာ့။အဲဒီလို အခ်ိန္မွာ သိပ္အသံုးက်တယ္။

- စာအစဥ္အတန္း (String) တစ္ခုထဲကေန ကိုယ္လို ခ်င္တဲ့ အစိတ္အပိုင္း ေလးတစ္ခုကိုပဲ ထုတ္ယူၿခင္း (Extract text)

ဥပမာ - အေပၚက စာထဲကပဲ love ဆိုု တဲ့ စာလံုးကိုပဲ ထုတ္ယူခ်င္တဲ့အခါမ်ိဳး။
စသည္တုိ ့ေတြမွာ အလြန္ အသံုး၀င္ပါတယ္။

စာအစဥ္အတန္း (String) ေတြကို ကိုင္တြယ္တဲ့ေန ရာမွာ နာမည္မၾကီးတဲ့ javascript လို ပရိုဂရမ္ ဘာသာရပ္ေတြမွာ စကားလံုးအစုပံုစံ (Regular Expression) က အသံုးက် ၾကပါတယ္။

ဆတ္ရန္။

ရည္ညြန္း။ ။ MSDN, Wikipedia - the free encyclopedia

အာေကလာ (Akela)

july 21, 2007 2:42 am

မွတ္ခ်က္။ ။ ပိုစ္ေတြကို ကၽြန္ေတာ္ စာလံုးမ်ားကို တက္ႏိုင္သေလာက္ ၿမန္မာမွဳၿပဳထာပါတယ္။ ပညာရွင္မဟုတ္တဲ့ အတြက္ စာလံုးေတြက ေထာက္ေနပါတယ္။ ကၽြန္ေတာ္ကိုယ္တိုင္ ေရးေနရင္းနဲ ့ ခဏခဏရယ္ၿဖစ္ပါတယ္။ ဒါေပ့မယ္ေပါ့ေလ တက္ႏိုင္သမွ်ေတာ့ ၾကိဳးစားၿပီးၿမန္မာ လို ပဲေရးပါမယ္။ အခုအစၿပဳမိရင္ ေနာင္က်ေတာ့ဒီထက္ေကာင္းတဲ့ အဓိပၸါယ္ၿပည့္စံုတဲ့ ၿမန္မာစာလံုးေတြ ထြက္လာႏိုင္တယ္လို ့ေမွ်ာ္လင့္ပါတယ္။



Saturday, July 21, 2007

စကားလံုးအစုပံုစံ ၀ါက်
(Regular Expression Syntax)

:. ၂.၁
စကားလံုးအစုပံုစံ (Regular Expression) ဆိုတာ စာကားလံုးမ်ားကိုသံုးထားတဲ့ ပံုစံ (pattern of Text) ၿဖစ္တဲ့အတြက္ သူ ့မွာ သာမန္ စကားလံုးမ်ား (ordinary characters - a မွ z အထိ) ၊ အထူး စကားလံုးမ်ား (special characters or metacharacters) ေတြပါ၀င္ပါတယ္။

ေအာက္ပါ ဇယားကြက္မွာ အထူး စကားလံုးမ်ား (metacharacters**) နဲ ့ သူတို ရဲ ့ ၿပဳမွဳ ႏိုင္တဲ့စြမ္းရည္ (behavior) တိုကို ေဖာ္ၿပထားပါတယ္။

စကားလံုးမ်ား (Characters)

အဓိပါယ္ဖြင့္ဆိုခ်က္(Description)



\

သူေနာက္က စာလံုးကို special characters ၊ သို ့ literal အၿဖစ္ ၿပဳမွဳေပးပါတယ္။ ဥပမာ -ပံုမွန္ဆိုရင္ ‘n’ က စာလံုး “n” နဲ ့ တိုက္စစ္ (Match) ပါတယ္။ ဒါေပမယ္ ‘\n’ ၿဖစ္သြားရင္ေတာ့ ေနာက္ အသစ္တလိုင္း (newline character) ၿဖစ္သြားပါတယ္။ ‘\\’ က “\” နဲ ့တိုက္ၿပီး ၊ “\(” က “(” နဲ ့တိုက္စစ္ပါတယ္။

^

၀င္လာတဲ့ စာအစဥ္အတန္း (Input string )ရဲ ့ ပထမဆံုး ေနရာ (position at the beginning) ကို တိုက္စစ္္ပါတယ္။

$

၀င္လာတဲ့ စာအစဥ္အတန္း (Input string )ရဲ ့ ေနာက္ဆံုး ေနရာ (position at the end) ကို တိုက္စစ္္ပါတယ္။

*

သူရဲ ့ေရွမွာ ရိွေနတဲ့ စာလံုး(character) သို ့မဟုတ္ စာလံုးအစုငယ္ (subexpression) ေတြကို 0 or more အၾကိမ္အေရအတြက္ တိုက္ပါတယ္။ ဥပမာ - “zo*” က “z” and “zoo” ကို တိုက္ပါတယ္။ * က {0,} နဲ ့ အတူတူပဲ ၿဖစ္ပါတယ္။ သေဘာက o က လံုး၀မပါရင္လည္းၿဖစ္တယ္။ တစ္လံုးထက္ပိုပါရင္လည္း ၿဖစ္တယ္။

+

သူရဲ ့ေရွမွာ ရိွေနတဲ့ စာလံုး(character) သို ့ စာလံုးအစုငယ္ (subexpression) ေတြကို one or more အၾကိမ္အေရအတြက္ တိုက္ပါတယ္။ ဥပမာ - “zo+” က “zo” and “zoo” ကို တိုက္ပါတယ္။ ဒါေပမယ့္ “z” ကို မတိုက္ပါဘူး။ + က {1,} နဲ ့ အတူတူပဲၿဖစ္ပါတယ္။ သေဘာက o က အနည္းဆံုး ၁လံုးပါရတယ္။ တစ္လံုးထက္ပိုပါရင္လည္း ၿဖစ္တယ္။

?

သူရဲ ့ေရွမွာ ရိွေနတဲ့ စာလံုး(character) သို ့ စာလံုးအစုငယ္ (sub expression) ေတြကို 0 or 1 အၾကိမ္အေရအတြက္ တိုက္ပါတယ္။ ဥပမာ - “do(es)?” က “do” and “does” ကို တိုက္ပါတယ္။ ? က {0,1} နဲ ့အတူတူပဲၿဖစ္ပါတယ္။ သေဘာက o က လံုး၀မပါရင္လည္းၿဖစ္တယ္။ တစ္လံုးတည္းပါရင္လည္း ၿဖစ္တယ္။

{n}

ဒီမွာ n က အႏုတ္ကိန္းမဟုတ္ရပါ။ n ၾကိမ္အေရအတြက္ အတိ အက် တိုက္ပါတယ္။ ဥပမာ - ‘o{2,}’ လို ့ဆိုရင္ “Bob” ထဲမွာ ရိွ တဲ့ o နဲ ့မတိုက္ပါဘူး။ ဒါေပမယ့္ “food” ထဲမွာရိွတဲ့ o ႏွစ္လံုးနဲ ့ ေတာ့ တိုက္ပါတယ္။

{n,}

ဒီမွာ n က အႏုတ္ကိန္းမဟုတ္ရပါ။ အနိမ့္ဆံုး n ၾကိမ္ အေရ အတြက္္နဲ ့ တိုက္ပါတယ္။ ဥပမာ - ‘o{2}’ လို ့ဆိုရင္ “Bob” ထဲမွာ ရိွ တဲ့ o နဲ ့မတိုက္ပါဘူး။ ဒါေပမယ့္ “fooooood” မွာရိွတဲ့ o အားလံုးနဲ ့ ေတာ့တိုက္ပါတယ္။ ‘o{1,}’ က အထက္မွာ ေဖၚၿပခဲ့တဲ့ ‘o+’ နဲ ့အတူတူပဲၿဖစ္ပါတယ္။

{n,m}

ဒီမွာ n နဲ ့ m က အႏုတ္ကိန္းမဟုတ္ရပါ။ n က m ထက္ ငယ္ရင္ငယ္ ၊ မငယ္ရင္ ညီရပါမယ္ (n <= m)။ အနိမ့္ဆံုး n ၾကိမ္ ၊ အၿမင့္ဆံုး m ၾကိမ္ အေရအတြက္ နဲ ့့ တိုက္ပါတယ္။ ဥပမာ - ‘o{1,3}' ဟာ “fooooood” မွာရိွတဲ့ ပထမ o သံုးလံုးနဲ ့ တိုက္ပါတယ္။ ‘o{0,1}’ က အထက္မွာ ေဖၚၿပခဲ့တဲ့ ‘o?’ နဲ ့ အတူတူပဲၿဖစ္ပါတယ္။ “o{1,}” က အထက္မွာေဖၚၿပခဲ့တဲ့ ‘o+’ နဲ ့ တူၿပီး ၊ “o{၀,}” ကေတာ့့ ‘o*’ နဲ ့ အတူတူပဲၿဖစ္ပါတယ္။

?

ဒီ ? က (*,+,?,{n},{n,},{n,m}) တို ရဲ ့ ေနာက္မွာ ခ်က္ခ်င္း ရိွေနတယ္ဆိုရင္ အဲဒီပံုစံကို non-greedy pattern လုိ ့ေခၚပါ တယ္။ non-greedy pattern ဆိုတာ တုိက္စစ္တဲ့အခါ နည္းႏိုင္ သမွ်နည္းေအာင္တုိက္စစ္ပါတယ္။ ပံုမွန္ ပံုစံ(pattern) က မ်ား ႏိုင္သမွ်မ်ားေအာင္တုိက္စစ္ပါတယ္။ ဥပမာ - “oooo” ဆို တဲ့ စာအစဥ္ အတန္း (string) မွာ ၊ ‘o+?’ က ‘o’ တစ္လံုးတည္းနဲ ့ တိုက္စစ္ၿပီး ၊ ? မပါ တဲ့ ‘o+’ က ‘o’ အားလံုးနဲ ့တိုက္စစ္ပါတယ္။

.

“\n” (newline character) ကလြဲရင္ ‘.’ (dot) ကေလးဟာ စကာလံုးအားလံုးနဲ ့ တိုက္စစ္ပါတယ္။ “\n” ကိုပါ တိုက္စစ္ခ်င္ တယ္ဆိုရင္ေတာ့ ‘[\s\S]’ ဆိုတဲ့ ပံုစ(pattern) ံကို သံုးႏိုင္ပါတယ္။

x|y

သူက ‘ x ’ ဒါမွမဟုတ္ ‘ y ’ ကိုတိုက္စစ္ပါတယ္။ ဥပမာ- “z|food” ဟာ “z” ဒါမွမဟုတ္ “food” နဲ ့ တိုက္ပါတယ္။ “(z|f)ood” က်ေတာ့ “zood” ဒါမွမဟုတ္ “food” နဲ ့တိုက္ စစ္ပါတယ္။ “|” ဒီစာလံုးေလးက or (တစ္ခုမဟုတ္တစ္ခု) ဆိုတဲ့ အဓိပါယ္ရိွပါတယ္။

[xyz]

သူကေတာ့ စကားလံုးအစုပါပဲ။ ေဒါင့္ကြင္း([]) ထဲမွာ ရိွတဲ့ ဘယ္စကားလံုးနဲ ့ မဆို တိုက္စစ္ပါတယ္။ ဥပမာ- [abc] က

“plain” ထဲက “ a ” နဲ ့တိုက္စစ္ပါတယ္။

[^xyz]

သူကေတာ့ စကားလံုးအစုပါပဲ။ ေဒါင့္ကြင္း([]) ထဲမွာ ရိွတဲ့ စကားလံုးမ်ား နဲ ့မတူတဲ့ အၿခားစကားလံုးမ်ားကို တိုက္စစ္ ပါတယ္။ ဥပမာ- [^abc] က “plain” ထဲက “ p ” ၊ “ l ” ၊ “ i ” ၊ “ n ” တိုက္စစ္ပါတယ္။ ^ က မဟုတ္ (not) ဆိုတဲ့ အဓိပါယ္ရိွ ပါတယ္။

[a-z]

သူကေတာ့ စကားလံုး အတိုင္းအတာ (range of characters) တစ္ခုပါပဲ။ဥပမာ - [a-m] ဟာ a နဲ ့ m ၾကားမွာရိွတဲ့ မည္သည့္ စကားလံုးကို မဆို တိုက္စစ္ပါ တယ္။

[^a-z]

သူကေတာ့ စကားလံုး အတိုင္းအတာ (range of characters) တစ္ခုပါပဲ။ဥပမာ - [^a-m] ဟာ a နဲ ့ m ၾကားမွာရိွတဲ့ စကားလံုးမ်ားမွ လြဲ ၿပီး မည္သည့္စကားလံုးနဲ ့မဆို တိုက္စစ္ပါ တယ္။^ က မဟုတ္ (not) ဆိုတဲ့ အဓိပါယ္ရိွ ပါတယ္။

ဆက္ရန္။

ရည္ညြန္း။ ။ MSDN, Wikipedia - the free encyclopedia, Google

့့့အာေကလာ(Akela)

july 22, 2007 2:42 am

july 26,2007 00:02 am (midinght) (modified)

မွတ္ခ်က္။ ။ ပိုစ္ေတြမွာ ကၽြန္ေတာ္ စာလံုးမ်ားကို တက္ႏိုင္သေလာက္ ၿမန္မာမွဳၿပဳထာပါတယ္။ ပညာရွင္မဟုတ္တဲ့ အတြက္ စာလံုးေတြက ေထာက္ေနပါတယ္။ ကၽြန္ေတာ္ကိုယ္တိုင္ ေရးေနရင္းနဲ ့ ခဏခဏရယ္ၿဖစ္ပါတယ္။ ဒါေပ့မယ္ေပါ့ေလ တက္ႏိုင္သမွ်ေတာ့ ၾကိဳးစားၿပီးၿမန္မာ လို ပဲေရးပါမယ္။ အခုအစၿပဳမိရင္ ေနာင္က်ေတာ့ဒီထက္ေကာင္းတဲ့ အဓိပၸါယ္ၿပည့္စံုတဲ့ ၿမန္မာစာလံုးေတြ ထြက္လာႏိုင္တယ္လို ့ေမွ်ာ္လင့္ပါတယ္။