Monday, April 5, 2010

C# 2008 ийн онцлогууд: Далд төрөлтэй дотоод хувьсагч (Implicitly Typed Local Variables)

C# 2008-нд гарсан нэг шинэ зүйл далд төрөлтэй дотоод хувьсагч зарлах боломжтой болсын байна. Энэ скрипт (script) хэлүүдэд ихэвчлэн ашиглагддаг хувьсагч хэрэглэлтйин техникыг авч хэрэгжүүлсэн байна. Энэ хүснэгт-1 болон хүснэгт- 2 дээрх жишээн дээр тулгуурлан тайлбарлъя.

static void DeclareExplicitVars()

{

//Энгийн хувьсагчдын зарлалт;

int myInt = 0;

bool myBool = true;

string myString = "Time, marches on...";

}

Хүснэгт- 1. Энгийн төрөл зарлалттай функц

Хүснэгт-1 функцад бидний мэдэх int, bool, string түлхүүр үгүүдийг ашиглаж хувьсагчийн зарлалтаа хийсэн байна.

static void DeclareImplicitVars()

{

// Далд хувьсагчын зарлалт

// var variableName = initialValue;

var myInt = 0;

var myBool = true;

var myString = "Time, marches on...";

// Print out the underlying type.

Console.WriteLine("myInt is a: {0}", myInt.GetType().Name);

Console.WriteLine("myBool is a: {0}", myBool.GetType().Name);

Console.WriteLine("myString is a: {0}", myString.GetType().Name);

}

Хүснэгт- 2. Далд төрлийг ашигласан функц

Харин хүснэгт-2д var гэсэн шинэ түлхүүр үг гарч ирсэн байна. Энэ тохиолдолд компайлар автоматаар myInt, myBool, myString-д харгалзан System.Int32, System.Boolean, System.String санах ойн хувиарлалт хийдэг.

Одоо массив, ерөнхий төрөл мөн хэрэглэгчийн тодорхойлсон төрөл дээр хэрхэн ашиглахыг хүснэгт-3д харууллаа.

static void DeclareImplicitVars()

{

...

// Зарим далд өгөгдлын төрөлтэй дотоод хувьсагч

var evenNumbers = new int[] { 2, 4, 6, 8 };

var myMinivans = new List();

var myCar = new SportsCar();

Console.WriteLine("evenNumbers is a: {0}", evenNumbers.GetType().Name);

Console.WriteLine("myMinivans is a: {0}", myMinivans.GetType().Name);

Console.WriteLine("myCar is a: {0}", myCar.GetType().Name);

}

Хүснэгт- 3. Далд хувьсагчийг бусад өгөгдлийн төрөлд ашиглах нь

Уг жишээнд Системийн жагсаалт, массив өгөгдлийн төрөл болон хэрэглэгчийн тодорхойлж өгсөн SportsCar төрлийн зарлалт, болон утга оноолтыг харуулсан байна. Зураг-3 DeclareImplicitVars() функцыг ажиллуусан үр дүнг харууллаа.

Зураг-3 DeclareImplicitVars() гаралтын үр дүн


Foreach дэх var төрөлтэй хувьсагч

Далд төрөл нь int массиван var төрлийн хувьсагчид дараалсан давталтанд хэрхэн хандахыг хүснэгт-4д харуулав.

static void VarInForeachLoop()

{

var evenNumbers = new int[] { 2, 4, 6, 8 };

// “var” foreach давталданд ашиглах нь .

foreach (var item in evenNumbers)

{

Console.WriteLine("Item value: {0}", item);

}

}

Хүснэгт- 4. “var” foreach давталтанд ашиглах нь

Мөн давталт дотроо хүснэгтийн төрлийг хатуугаар зааж өгч гүйх боломжтой хүснэгт-4 ийн кодыг ийм байдалд өөрчилснөөр харуулбал(Хүснэгт-5).

static void VarInForeachLoop()

{

var evenNumbers = new int[] { 2, 4, 6, 8 };

// System.Int32 төрлийг хатуугаар заасан байна.

foreach (int item in evenNumbers)

{

Console.WriteLine("Item value: {0}", item);

}

}

Хүснэгт- 5. foreach давталтанд төрөл хатуугаар заах

Далд төрөлтэй хувьсагч дахь хязгаарлагдмал байдал

Бид уг хувьсагчийг method болон propterty-д зөвхөн дотоод хувьсагчын хүрээнд л ашиглаж болно. Мөн var түлхүүр үгийг функцийн буцаах утга, параметр, field –үүдэд хэрэглэвэл алдаатай(Хүснэгт-6).

class ThisWillNeverCompile

{

//field өгөгдөлд ашигласан, алдаа!

private var myInt = 10;

// буцаах утга болон параметерт хэрэглэсэн, алдаа!

public var MyMethod(var x, var y){}

}

Хүснэгт- 6. Алдаатай код

Бусад хориглолт болон байж болох хувилбаруудыг хүснэгт-7д жишээгээр харууллаа.

//Утга олгоогүй, алдаа!

var myData;

//Зарлалтын үед утга олгоогүй, алдаа!

var myInt;

myInt = 0;

//Null утга олгосон, алдаа!

var myObj = null;

//Утга олголгдсоны дараа заалт төрөлтэй болох учир энд ямар нэгэн алдаа үүсэхгүй

var myCar = new SportsCar();

myCar = null;

// Зөв!

var myInt = 0;

var anotherInt = myInt;

string myString = "Wake up!";

var myData = myString;

//буцаах утгын төрөл нь int бөгөөд далд төрөл нь таарч байна, зөв!

static int GetAnInt()

{

var retVal = 9;

return retVal;

}

Хүснэгт- 7. Зарим алдаатай болон зөв бичлэг

Далд төрөлтэй дотоод массив

Хүснэгт-8 жишээгээр далд төрөлтэй массиван хувьсагчийн хэрхэн заралхыг харууллаа.

static void DeclareImplicitArrays()

{

// int[].

var a = new[] { 1, 10, 100, 1000 };

Console.WriteLine("a is a: {0}", a.ToString());

// double[].

var b = new[] { 1, 1.5, 2, 2.5 };

Console.WriteLine("b is a: {0}", b.ToString());

// string[].

var c = new[] { "hello", null, "world" };

Console.WriteLine("c is a: {0}", c.ToString());

// SportsCar[].

var myCars = new[] { new SportsCar(), new SportsCar() };

Console.WriteLine("myCars is a: {0}", myCars.ToString());

Console.WriteLine();

//System.Object төрлийн массивыг үүсгэх боломжгүй. Хувьсагчийн төрөл холилдно, алдаа!

//Компайларын алдаа гарна

var d = new[] { 1, "one", 2, "two", false };

}

Хүснэгт- 8. Далд төрөлтэй массив

Далд төрөлтэй хувьсагчыг LINQ технолгид ашигладаг учир нь query илэрхийлэлийг буцаах утга нь тодорхойгүй байдаг бөгөөд үүнийг далд төрөлтэй хувьсагч ашиглан барьж авдаг.

Thursday, April 1, 2010

Таны өмнөөс семантик вэб ...

Мэдээллийн технологийн салбар хурдацтай хөгжиж байгаа нь мэдээж түүнийг ажиллуулагч техник хангамж хөгжиж байгаатай салшгүй холбоотой. Бид хөдөө орон нутагт, аялал зугаалга дээр байсан ч интернэттэй байнга хамт явах боломжтой болжээ. Энэ нь эргээд интернэт худалдаа үйлчилгээ вэбийн хэрэглээг өргөтгөж хөгжүүлэлт хийхийг шаардаж байна. Өнөөгийн вэбэд вэб 2.0 технологи хувьсал хийгээд удаагүй байгаа боловч хүмүүсийн интернэт болон вэб хэрэглээг дэмжсэн дутагдалтай талыг үгүй болгосон, далдалсан дараа дараагийн шинэ өндөр түвшний технологиуд гарч ирсээр.
Хайлтын хаан болох google-ийг хэрэглэж үзээгүй интенэт хэрэглэгч байхгүй бизээ. Google нь түлхүүр үгэнд суурилсан хайлтыг хэрэглэгчдэд санал болгоод нилээдгүй хугацаа өнгөрчээ. Энэ хугацаанд тэд текстээс яаж хурдтай олж, хэрэглэгчдэд дэлгэцлэх үү, олон вэб сайтыг хэрхэн бүртгэж, эрэмбэ тогтоох вэ? гэсэн асуудлууд дээрээ хангалттай ажиллаж үр дүнд хүрч чадсан. Тэд нэг хайлтын үр дүнд хэдэн сая бичлэг вэб хуудас буцаагаад үүнээс яг өөрийн хэрэгцээт мэдээллээ олох хамгийн төвөгтэй ажиллагааг хэрэглэгчдэд өөрсдөд нь үлдээж орхижээ. Яг л биднээс шалтгаалах зүйл бүгд болсон. Одоо таны ажил үлдсэн гэсэн шиг. Үнэндээ энэ л үйлдэл тэдгээрийн өөрсдийнх хийх ёстой гол ажил байж болох юм. Учир нь хэрэглэгчид бид өвсөн тодроос зүү хайх нарийн төвөгтэй үйл ажиллагаа хийсний үндсэн дээр аз таарвал өөрийн хайсан мэдээллээ олж үүнийг өөрийн туршлаганд суурилсан мэдлэгийг бий болгох чадвар дээрээ үндэслэн өөрийн болгож авдаг. Өөр нэг асуудал бол электрон арилжааны салбар дээр гардаг. Худалдан авагч өөрийн хайсан барааг олж авахын тулд олон худалдааны вэб сайт дамжин тэдгээрээс мөн л түлхүүр үгэн хайлт хийж үздэг. Нөгөө талаас бид дэлгүүр, худалдааны төвөөс бараа бүтээгдэхүүн авахдаа маш сайн судалж, ярилцсаны үр дүнд сая нэг сонголтоо хийдэг. Тэгвэл дээр дурьдагдсан барааны хайлт нь эргэлзээгүй сонголт хийх тухайн барааны хангалттай мэдээллийг өгч чадахгүй. Мөн хэрэглэгч үүнтэй төстэй ямар нэгэн бараа бүтээгдэхүүн байдаг эсэх бас бараа үйлдвэрлэгчийн мэдээллийг авах сонирхол их байдаг. Энэ бүхнийг одоогийн вэб технологи ашиглан бүтээсэн вэб сайтууд хангаж чадахгүй байна.
Дээр дурьдагдсан асуудлууд бүхэн хэрэглэгчдэд ачаалал өгч байна. Тэгвэл хэрэглэгчдийн өмнөөс бүгдийг нь хийгээд өгчихдөг тийм вэб байх боломтой юу? 6 жилийн өмнөөс W3C болон томоохон их сургуулийн эрдэмтэн, судлаачид бидний хэрэглэж байгаа вэб сайтын сул талыг арилгах зорилготойгоор ажиллаж эхэлсэн байна. Жишээлбэл: өөрийн хүссэн мэдээллийг хайхад уг мэдээллийг буцаадаг нэмэлтээр таньд мэдлэгийг олгох чадвар бүхий вэб сайт мөн Wikipedia-д хүмүүс мэдлэгийг бий болгож өгдөг бол өөрөө автоматаар мэдлэг бий болгодог зэрэг вэб бүтээх боломжийг хайсаар иржээ. Ингээд тэд тодорхой үр дүнд хүрч уг хүндэрлүүдээс гарах гарцыг олж чадсан бөгөөд энэ нь вэб 2.0 технологийн дараагийн үе болох семантик вэб технологи юм.
Семантик вэб нь хүн шиг мэдээллийг боловсруулж шинэ мэдлэгийг үүсгэх чадвартай байдаг. Энд мэдээлэл гэдгийн цаана тухайн вэб нөөц яригдаж байна. Вэб нөөц нь хүний мэдэх юу ч байж болно. Жишээлбэл: сургууль, хичээл, өрөө, цэцэг гэх мэт. Вэб ийнхүү боловсруулалт хийж чадаж байна гэдэг нь эдгээр вэб нөөц, өгөгдөл нь машин хандах боломжтой ойлгохуйц байх шаардлагатай. Өнөөгийн вэб дахь хамгийн том дутагдал бол вэбийн агуулга өгөгдөлд машин хандах боломжгүй, машин ойлгож чадхааргүй байдал юм. Семантик вэбийн дэд зорилго нь машин ойлгохуйц, боловсруулалт хийж болохуйц вэб нөөц, өгөгдлийг бүтэцлэх байдаг. Уг дэд зорилгыг хангахын тулд уламжлалт вэб технологид хэрэглэгддэг технологи болон бусад шинжлэх ухааны салбарууд дахь санаа ойлголтыг авч компьютерийн шинжлэх ухаанд хэрэгжүүлсэн байна.
Семантик вэб технологи нь дээр дурьдагдсан боломж, дэд зорилгоо хангахын тулд RDF(Resource Definition Language), RDFS (RDF shema), OWL(Ontology Web Language) гэсэн шинэ технологийг тодорхойлсоноос гадна математикийн шинжлэх ухааны логик, философийн шинжлэх ухааны онтологи гэсэн ойлголтуудыг авч ашигласан. Мөн метадата гэсэн ойлголтыг тухайн өгөгдлийг өөрийг нь ойлгохын тулд хэрэгжүүлдэг байна.
R. Studer онтологийг ”Онтологи бол агуулгын хэлбэрдсэн, илэрхий тодорхойлолт.” хэмээн хэлжээ[1](Semantic web primer 11). Ерөнхийдөө онтолги нь нэр томъёонуудын хоорондын холбоос тэдгээрийн хязгаарлагдсан жагсаалтаас бүрддэг. Нэр томъёо гэдэг нь ямар нэгэн үйл ажиллагааны ухагдахуун ойлголт гэсэн санаагаар энд ашиглагдаж байна. Жишээлбэл: их сургуулийн хүрээнд оюутан, багш, хичээл, курс гэх мэт ойлголт байдаг. Вэбэд онтологи нь үйл явцын дундын ойлголт, харилцааг дэмждэг. апликэшиенүүд нь магадгүй нэг ижилхэн ойлголтыг ялгаатайгаар утгачилсан байж болох юм. Жишээлбэл: Их сургуульд курсыг өөрөөр анги гэж нэрлэж болох юм энэ тохиолдолд тэдгээр апликэшиенүүд нь дундын ойлголтыг ашиглах шаардлагатай болж байна. Онтологи дээр суурилсан семантик вэбийг бүтээдэг дараах технологиуд гарч ирсэн.
• RDF (Resource Definition Language) бол обьектуудын өгөгдлийн загвар болон тэдгээрийн холбоосыг гаргадаг. Энэ загвар нь энгийн ухаалаг өгөгдлийн загварыг бий болгодог ба XML бичлэгтэй.
• RDF Schema нь RDF-ийн классууд болон шинжүүдийг нь тодорхойлдог үгийн сангийн дүрслэл. Класс болон шинжүүдийн шатлалыг ерөнхийлдөг.
• OWL бол класс болон шинжүүдийн хоорондын холбоос, тэнцэтгэл, шинж чанарын төрлийг илүү дэлгэрэнгүй тодорхойлсон дүрслэлтэй байдаг.

RDF
RDF (Resource Description Framework) бол чухал ач холбогдолтой өгөгдлийн загвар юм. Объект-Шинж чанар-Утга гэсэн мэдэгдэл (statement) гэж нэрлэгдэх тулгуур элемент дээр суурилсан.
RDF нь хэрэглэгчдийн тодорхойлсон нэр томъёог агуулах RDF схемтэй хамтран үйл ажиллагааг тодорхойлдог. Өөрөөр хэлбэл RDF нь бие даан ямар нэгэн үйл ажиллагааг дүрслэж чадахгүй бөгөөд RDF схемийн тусламжтайгаар утга санаагаа хэрэгжүүлдэг. XML схем нь XML –ийн бүтцийг агуулдаг шиг RDF схем нь RDF өгөгдлийн загварт ашиглагдаж байгаа үгийн санг тодорхойлдог.
RDF бол вэб нөөцийг хангахад хэрэглэдэг машин ойлгохуйц мета өгөгдлийн хэлбэрдсэн загвар юм. RDF –ийн тулгуур ойлголт нь нөөцүүд, шинж чанар болон мэдэгдэл. Өөрөөр өгүүлэгдэхүүн, өгүүлэхүүн, объект гэж бас тодорхойлдог.
• Өгүүлэгдэхүүн нь эд юмсыг түүний URL –ээр адилтгасан
• Өгүүлэхүүн нь мета өгөгдлийн загвар болон URL –ээр нь адилтгадаг
• Объект нь мета өгөгдлийн төрлийн утга юм.

RDFS
RDF нь нөөцүүд, тэдгээрийн эзэмшил үгийн санг тодорхойлдог боловч ямар нэгэн үйл хэргийн оюун ухаанлаг байдлыг тодорхойлж чададгүй. Харин үүнийг RDF схем тодорхойлж чадвартай байдаг. RDF схем нь вэб онтологи хэлний суурь болдог.

OWL
Онтологи хэл нь хэрэглэгчдэд үйл ажиллагааны загварын агуулгыг хэлбэрдсэн бөгөөд илэрхий бичих боломж олгодог. Үндсэн шаардлагууд нь аятайхан тодорхойлогдсон бичлэг, ашигтай бодох чадварыг дэмжсэн, хэлбэрдсэн сургалт(өөрөө сурах), хангалттай ухаалаг, илэрхийллийн аятайхан байдал юм.
Аятайхан тодорхойлогдсон бичлэг гэдэг нь програмын хэл шиг маш тодорхой дүрмийн бичлэгтэй байна. Энэ нь мэдэллийг машин боловсруулах зайлшгүй нөхцөл болдог.
Хэлбэрдсэн сургалт гэдэг нь мэдлэгийг нарийн ойлгохыг хэлж байна. Энд нарийн гэдэг нь өөр хүмүүс эсвэл машин ялгаатайгаар ойлголт авахгүй байх гэх мэтийг тодотгож болно.
Бодох чадварыг дэмжих гэдэг нь дараах гурван зүйлийг хэлнэ.
• Мэдлэг болон онтологийн дэс дараалалыг шалгах
• Классуудын холбоосын тохиолдлуудыг шалгах
• Автоматаар класс үүсгэж ангилах

Машин мэдлэгийг бүтээх процесс нь нийлээд нарийн дүрэм журам, нэмэлт тэмдэглэгээ, үндсэн өгөгдөлөөс гадна туслах олон өгөгдлүүдийг тодорхойлдог. Үүнийг нэг бүрчлэн хүн хийхэд төвөгтэй гэдэг нь харагдаж байна. Семантик вэбийн хөгжүүлэгч нэмэлт түүлүүд бидний өмнөөс зарим зүйлийг автоматаар хийж өгөх юм.