Badral's personal blog
Интернет миний ертөнцийг хардаг цонх …

June, 2007Archive for

Болор толь

Tuesday, June 26th, 2007

Сүүлийн хоёр гурван өдөр ажлынхаа зав чөлөөгөөр Болор хэмээх тольтойгоо ноцолдов. Энийг би өөрийн хувийн хэрэглээнд хэрэглэдэг боловч ОпенМН-ы шинэ вэбийг хийж дуусахад холбосон байх ёстой. Одоогоор зөвхөн англиас монгол – монголоос англи хувилбар нь ажиллаж байгаа ба клиент програмыг нь зав чөлөөндөө бичиж л сууна. Энэ програмыг үнэ төлбөргүй нээлттэй эх бүхий гаргах бодолтой байна. (Шинэчлэл: Хамтран ажиллах хэн нэгэн хүн гарч ирээгүй тул цааш өөрөө хөгжүүлж хэлний мэргэжилтэн хөлслөн арилжааны програмаар гаргахаар болсон.) Болор толийн гол онцлог нь бүх хэрэглэгчийн тусламжтай цаашид үргэлж шинэчлэгдэж (p2p маягийн зарчмаар) явах ба мөн миний бараг хийж дууссан байгаа онлайн орчуулгын порталтай холбогдон түүгээр хийгдсэн орчуулгуудаар баяжиж сайжраад явах юм. Мөн өөрөө өөрийгөө анализ (synonym-ын анализ гэхиймуу даа) хийгээд автоматаар өөрийгөө сайжруулах функцыг бичиж байгаа болно. Ямар ч гэсэн урт удаан хугацаагаар амьдрах чадвартай систем гарахыг хичээж байна. Архитектурын хувьд цаашид хэдэн ч хэл нэмэгдэх боломжтой. Одоогоор серверийн хувьд альфа хувилбарыг түр байрлуулсан байгаа хаяг: http://dic.openmn.org Эхний хувилбар гарсан. Хаяг: http://www.bolor-toli.com
Хүсвэл та бүхэн туршиж үзнэ бизээ. Нүүр царайг нь хараахан хийгээгүй байгаа. Монгол үгээр хайя гэвэл үгээ шууд монголоор оруулахад хангалттай.

Monconv 1.1

Tuesday, June 19th, 2007

Хэдэн жилийн өмнө бичиж байсан Monconv хэмээх windows1251 <-> UTF-8 хөрвүүлэгч бяцхан програм маань шинэчлэгдлээ. Henri de Solages төгрөгийн тэмдэгт болон no-break тэмдэгтүүд буруу хөрвүүлэгдэж байна гэсний дагуу зарим тусгай тэмдэгтүүд буруу хөрвүүлэгдэж байсныг заслаа.
Энэ нь энгийн текст файлуудын хувьд линүкс/юникс үйлдлийн системүүд дээр ажиллана.
Та түүнийг миний олон жилийн өмнөөс эрхлэн гаргаж байсан http://badaa.mngl.net хаягаас татаж авч болно. Энэ програмыг би LGPL лицензтэй гаргаж байгаа тул та бизнесийн ч бай нээлттэй эх ч бай хамаагүй өөрийн програмдаа чөлөөтэй ашиглаж болно. Харин ашиглах ганцхан нөхцөл нь толгойн хэсгийг тайрч хаяхгүй байх. (LGPL)
Гэрт виндовс байхгүй тул виндовс хувилбарыг нь дараа боломж гарвал засъя.

PHP -р хэрхэн арай илүү програмчилах вэ?

Tuesday, June 19th, 2007

PHP програмчлалын талаар зарим нэг зөвлөгөө өөрийн туршлага дээр үндэслэн өмнө бичиж байсан дээрээ нэмье! Хэрэв та гурваас дээш жилийн туршлагатай бол минийхээс илүү тул цааш унших хэрэггүй байхаа.

1. Харьцуулах үйлдэл.
PHP маш өргөн боломж олгодог сайхан хэл. Гэхдээ зарим тохиолдолд энэ нь найдвартай байдал алдаанд өртөмхий байдалд муугаар нөлөөлөх нь бий. Та PHP хэл дээр харьцуулах үйлдэл хийхдээ аль болох === оператор хэрэглэж байх хэрэгтэй. Бид ихэнх тохиолдолд нэгэн төрлийн хувьсагч шалгадаг. Жишээлбэл if ($action==”list”) гэхэд $action String төрөлтэй байна. Хэрэв та == оператор ашиглавал янз бүрийн төрөлтэй харьцуулахболомжтой ба ямар нэг тэмдэгт мөр төрлийн утгатай хувьсагч ийг бүхэл тоотой харьцуулах үед 0 утга руу шилжүүлдэг тул тэр үед алдаа гардаг тохиолдол бий. Гэхдээ гол ач холбогдол нь === оператор == оператораас хамаагүй хурдан. Төрөл шалгахгүй, төрөл шилжүүлэхгүй гээд бодохоор мэдээж хэрэг.
Мөн харьцуулах үйлдэл хийх үедээ эхлээд утга дараа нь хувьсагчаа бичиж байвал зүгээр. Жишээлбэл: if ($action==”list”) оронд if (“list”==$action) гэх мэт. Учир нь бид яарсан үедээ == оронд = бичих тохиолдол гардаг ба PHP нь нөхцөл шалгахбүтцэдээ утга олгох үйлдл ийг дэмждэг харьцуулах гэж байсан хувьсагчид утга олгоод явчихдаг. жишээлбэл: if ($action=”list”) үед $action хувьсагчийн утга list болж дарагдах ба нөхцөл ямар ч үед үнэн болно. Тийм учраас тест хийх үе шатанд ийм алдаа илрүүлэхэд ядаргаатай байдаг. Хэрэв if (“list”=$action) гэж харьцуулбал PHP интерпретер алдаа заана, амар.

2. Хувьсагч функц дуудаж програмын үр ашгийг дээшлүүлэх
Сүүлийн үед миний бичсэн зарим класс 1000 аас дээш мөр бүхий хэтэрхий том болоод ирэв. Энэ нь мэдээж хурданд муугаар нөлөөлж байгаа. Учир нь дуудалт бүрт санах ойд тэр том файлыг ачаалах нь утгагүй хэрэг. Тиймээс ийм классыг задалж багасгах хэрэг гарав. Өгөгдлийн баазтай харьцуулбал normalisation хийх л юм уу даа. Жишээлбэл нэг класст banner нэмдэг, хасдаг болон баннерийн эзэмшигчийг нэмдэг, хасдаг үйлдлүүд цуг байлаа гэж бодъё. Энэ үед бид banner болон bannerOwner-ийг тус тусад салган класс болгоод 2 саланга файлд хадгална. Ингээд үйлдлүүдээ салгах хэрэгтэй болно.
Жишээлбэл баннер нэмэх үед баннер классаас баннер нэмэх функц дуудна. Баннер эзэмшигчийн хаяг засварлах үед баннерЭзэмшигч классаас хаяг засварлах функц дуудна. Өмнө нь нэг том файлд байх үед ямар ч үйлдэл хийсэн тэр том файлаа ачаалаад л хийнэ гэсэн үг.
Үүнийг дараах байдлаар зохицуулж болно.

$bannerFuncs = array (
      'add'=> 'addbanner',
      ...
    );
$bannerOwnerFuncs = array (
       'editAddr'=>'editAddress',
       ...
    );
   if (in_array($action,array_keys($bannerFuncs)) ) {
      require_once 'Banner.php';
      $banner = new Banner($db);
      if (isset($bannerFuncs[$action])) {
        $banner->$bannerFuncs[$action]();
      } else {
        $banner ->defaultFunction();
      }
    } elseif (in_array($action,array_keys($bannerOwnerFuncs))) {
      require_once 'BannerOwner.php';
      $bannerOwner = new bannerOwner ($db);
      if (isset($bannerOwnerFuncs[$action])) {
        $bannerOwner->$bannerOwnerFuncs[$action]($op);
      } else {
        $bannerOwner->defaultFunction();
      }
    } else {
      require_once 'Banner.php';
      $banner = new Banner($db);
      $banner ->defaultFunction();
    }

Иймэрхүү байдлаар салгахад таны програм илүү хурдан ажиллах болно. Үүнээс гадна яагаад би үйлдэл сонгох үед switch case эсвэл elseif statement ашиглаагүй вэ гэвэл мөн л хурдтай холбоотой. Массиваар авбал аль алинаас нь илүү хурдан.
Мөн нэг классын зарим функц олон параметртэй зарим нь параметргүй байж болно. Үүнийг хялбархан шийдэх боломжтой тул та өөрөө хийнэ бизээ.
Би энд зөвхөн хэрхэн үр ашигтай оптимал програмчлахыг авч үзсэнээс яаж хурдлуулах тухай бичсэнгүй. Жишээлбэл Zend, eaccelerator зэрэг багажууд ашиглаад програмын эхээ байт кодонд хөрвүүлэн хурдасгах техникийн аргууд байдаг. Гэхдээ оптимал програмчилж чадаагүй програмыг хэчнээн техникийн хүчээр үзээд үзээд оптимал програмчиллаас төдийлөн дээрдэхгүй.
Эцэст нь нэг стандарт шахуу болсон зүйл сануулахад: Та ямар ч програмчлалын хэл ашиглаж байсан Классын нэрийн эхний үсгийг томоор функцийн нэр болон хувьсагч, объектын нэрийн эхний үсгийг жижгээр бичиж заншвал код хамаагүй цэвэрхэн ойлгомжтой харагддагийг мэдэх бизээ.

Програм хангамжийн төслийн шинжилгээ

Wednesday, June 13th, 2007

Өмнө Үүргийн дэвтэр гээч зүйл хийж байхдаа би системийн тодорхойлолт (Зорилгын дэвтэр байсныг солив) гээч зүйл хийх тухай дурдсан. Одоогоор өөрийнхөө төслийнхийг хийж дуусаагүй л байгаа.
Өнөөдөр ганц нэг стандарт харж суугаад өмнө дурьдаж байсан Шаардлагын тодорхойлолтод хамаатай нэгэн зүйлийг зайлшгүй тэмдэглэх нь зүйтэй мэт санагдлаа.
Германы DIN 69 905 стандартад “Үүргийн дэвтэр” англиар Requirements specification гэж аваад даалгавар олгогчийн даалгавар хүлээн авагчид тавьсан шаардлагуудыг тодорхойлсон байна гэжээ. Юу хийхэв юунд хүрэхийг тодорхойлно гэсэн үг. Харин “Системийн тодорхойлолт”-ийг англиар System specification гэж аваад бүтээгдэхүүний хэрэгжүүлэлт болон хүчин чадлыг даалгавар хүлээн авагчийн зүгээс тодорхойлон бичнэ гэжээ. Яаж хэрэгжүүлэх вэ гэдгийг тодорхойлно гэсэн үг.
Гэтэл энэ нь Sommerville -ын (түүний Software Engineering гэж маш сайн ном байдаг) тодорхойлсон “Системийн тодорхойлолт” нь загварын баримт биш ба аль болох ЯАЖ хийхийг биш систем ЮУ хийхийг тогтоох хэрэгтэй гэсэн байдагтай жаахан зөрчилдөөд байх шиг. Хий гаргадаггүй аричууд стандарт дээрээ алдаагүй л байлгүй дээ.
Нэг хэрэгтэй гэмээр зүйлийг Rombach тэмдэглэсэн байдаг. Системийн тодорхойлолтын хамгийн чухал зүйл нь 4 С гээд: Clarity, Completeness, Consistency, Correctness гэж тодорхойлсон байдаг.
Германы DIN 66901 нормоор Үүргийн дэвтэрийг
1. Зорилгын тодорхойлолт
1.1 Гарцаагүй – Болзол
1.2 Хүсэлт – Болзол
1.3 Хязгаарлалт Болзол
2. Бүтээгдхүүний хэрэглээ
2.1 Хэрэглээний хүрээ
2.2 Хэрэглэх бүлгүүд
2.3 Хөдөлгөх нөхцлүүд
3. Бүтээгдхүүний нөхцлүүд
3.1 Програм хангамж
3.2 Техник хангамж
3.3 Байгууллага
3.4 Бүтээгдэхүүний интерфейсүүд
4. Бүтээгдхүүний функц
5. Бүтээгдхүүний хүчин чадал
6. Хэрэглэгчийн интерфейс
7. Чанарын тодорхойлолт
8. Глобал тестүүд
9. Нөхөлтүүд
гэж тодорхойлжээ.
Програм хангамжийн инженерчилэлд Үүргийн дэвтэр ба Системийн тодорхойлолт харилцан эргэх холбоотой байна гэж үздэг, заадаг, тодорхойлдог.
Аричууд Нэр томъёо (Terminology) гэдэг маш чухал гээд Anforderungserhebung – RE, Anforderungsanalyse – RA, Anforderungsmanagement -RM, Anforderungsspezification – RS гэх мэтээр авч явъя гэж тогтоод үүнийгээ хэрэглэж ярьдаг. Бидэнд ч бас энэ чухал.
За яагаад би ийм утга учиргүй баахан юм холиод бичээд байгаад та гайхаж байгаа байх.
Би эдгээрээс санаа авч байгаад монгол хэл дээрээ өөрсдийн баримтлаж явах Системийн тодорхойлолтыг л зохиочих санаатай ингэж мунгинав. Бид эртхэн дээр нь нэг стандарт маягтай хэрэглэчихдэг баримттай байвал ирээдүй хойчид хэрэгтэй болов уу.
Дээрх буруу, зөв янз бүрийн тодорхойлолтуудаас миний хамгийн үнэн бөгөөд зөв гэж үзэж байгаа нь Үүргийн дэвтэр ба Системийн тодорхойлолт эргэх холбоотой гэсэн тодорхойлолт.
Тиймээс энийг сууриа болгож авъя. Өмнө гаргасан Үүргийн дэвтэрээ барих эсвэл түүнийг өөрчилөх гэсэн замаар Системийн тодорхойлолт тодорхойлогдох боллоо.
DIN 66901 стандартыг харж байхад миний өмнө хийсэн Үүргийн дэвтэрээс илүү гарах зүйл байхгүй байна. Харин энд авууштай нь өмнө миний үүргийн дэвтэрт бүтээгдхүүний шинж чанар дотор тодорхойлсон Систем ба системийн орчин гэсэн дэд бүлгийг тусад нь бүлэг болгож авсан байна.
Энэ нь сэтгэл зүйн талаасаа зүгээр санагдлаа. Учир нь систем болон системийн орчинг системийн үйл ажиллагаа болон өгөгдлийг тодорхойлохоос өмнө тодорхойлох гээд дайрчихдаг. Тиймээс үүргийн дэвтэрт үүнийгээ өөрчилж болох юм. Гэхдээ бас функцүүдийг тодорхойлж байхад түүнээс хамааран өөр орчин гарч ирэх үе ч байдаг. Бусдаар бол Системийн тодорхойлолт Үүргийн дэвтэртэйгээ дүйцүүлэн гаргая.
Нэр томъёоны хувьд
Anforderung (de) – Requirement (en) гэдгийг Шаардлага гэж авъя.
Тэгэхээр шаардлагын анализ, менежмент гэх мэтээр явна гэсэн үг. Энд харин тодруулах шаардлагатай зүйл бол Specification гэсэн үг. Энийг зарим үед тодорхойлолт, зарим үед загварчилалын баримт гэсэн утгаар авдаг. Бидний мэргэжлийн хувьд ихэнхдээ загварчилал гэдгээр нь авч явах нь зүйтэй. Specify гэхээрээ тодорхойлох гэхээсээ илүү загварчилах гэж авбал зөв гэсэн үг. Нөгөө миний харьцуулах дуртай барилгын архитектурчтай харьцуулбал Specification гэдэг нөгөө л скиз, техникийн зураг зүй нь шүү дээ. Тэд техникийн зураг зүйнхээ дагуу зурдаг бол бид UML -р зурдаг л гэсэн үг.
За та бүхнийг чилээж эхлэх шиг байна. Хариуд нь нэг зураг тавъя. Төсөл доторх холбоог Dr. Karsten Hoffmann дараах байдлаар үзүүлсэнийг хавсрагалаа. Сайн шинжлэхгүй бол ч . . .

Хагас бүтэн сайнаар амжуулсан зүйлс

Sunday, June 10th, 2007

Энэ хагас бүтэн сайнд хувийн ажилаа амжуулах гэж ийш тийш гүйсээр таарав. Үйл үгийн дагаварын хүснэгтээ ч дуусгаж чадсангүй. Aspell програмын дагаварын зохион байгуулагч нь дараалсан олон дагаварыг авч үзэж чаддагүй ээ. Арга ч үгүй биз англи, герман гээд европ хэлэнд тохируулан зохиогдсон юм хойно. Жишээлбэл байгууллагынхантайгаа гэсэн үг бай+г+уул+лага+ын+хан+тай+гаа гэж задрана. Харин англи хэлэнд ингэх битгий хэл 2 дагавар ч залгагдаж орохгүй. Ингээд бодож бодож хамтрагч Кевин Сканнелтайгаа зөвлөлдөв. Эцэст нь aspell програмд дагаварын дүрмээ оруулахын тулд бүх дагаваруудаа боломжит комбинацуудаар нь холбоод дан дангаар нь залгах байдлаар би хүснэгтээ зохиохоор боллоо. Мэдээж энэ гараар хийх ажил биш. Комбинацууд хэдэн арван мянга хүрэх биз. Тиймээс affix хүснэгт үүсгэх скрипт бичих ажилтай болвоо.
Жаахан залхуу хүрээд өөр юм хиймээр санагдахаар нь гэрээсээ явуулаад жил хагас болж буй Цахим радиогийн 5-р суваг -ынхаа дуунуудыг жаахан шинэчлэв. Удахгүй дуунуудаа ангилж цаг цагаар явуулж байхаас гадна сонсогчиддоо зориулж вэбээр дууны захиалга авах функц нэмнэ. Эцэст нь зав чөлөө гарвал Цахим радио болон түүнтэй төстэй урсгал тоглуулагч хийх санаатай. Яагаад гэвэл би энэ радиогоо 56 кб/с стериогоор цацдаг тул интернэтийн хурднаас шалгаалж монголоос бусад газарт байгаа хүмүүс ихэнхдээ сонсдог. Монголд байгаа хэрэглэгч нарт зориулан цацахын тулд арай бага хэмжээтэй урсгалаар цацах хэрэгтэй болов. Тиймээс тухайн хэрэглэгчийн интернэт хурдаас шалгаалж үүнийгээ ямар урсгал сонгохыг нь автоматаар зохицуулчихдаг тоглуулагч хийвэл хамгийн цэвэрхэн зөв шийдэл болох гээд байгаа юм. Мөн америкаас Ганболд анд 4-р сувгийг хамтран цацдаг тул сонсогчидоо олон сувгийн хооронд төөрөлдүүлэхгүйн тулд эдгээр сувгуудаа тогтмол зоогоод хооронд нь чөлөөтэй солих боломжоор хангах юм. Одоо ч уг нь нэг юм XML-р winamp болон Win media player дээр цувуулаад харуулаад л хооронд нь солиод л байгаа. Өөр нэг гоё боломж нь ямар нэг зар эсвэл хүсэлтийг дэлгэцэн дээр бичгээр үзүүлдэг болгочих юм. Ямар ч гэсэн хийнээ. Хэзээ гэдгийг харин хэлж чадахгүй нь.

Үг зүй – Жинхэнэ нэрийн дагаваруудын хүснэгт

Thursday, June 7th, 2007

Монгол хэл маань бидний сурч байсан үеэс хойш их өөрчилөгджээ. Гэхдээ энд зөвхөн үг зүйг (Morphology) авч үзье!
Хамгийн том өөрчилөлт нь 7 тийн ялгал маань 8 болж чиглүүлэхийн тийн ялгал нэмэгдсэн юм байна. Энэ тухай англи хэл дээрх wikipedia дээрээс олж мэдэв.
Тэгэхээр чиглүүлэхийн тийн ялгал гэхээрээ луу лүү, руу рүү болж таарах нь. Тэгвэл эдгээр нь бидний үед үргэлж үндсэн үгийнхээ араас тусдаа ордог байсан. Одоо харин залгагдаж ордог болсон юм болов уу? Энэ талаар мэдээлэл олж чадсангүй. Та бүхэн юу гэж бодож байна?
Хэл шинжлэлийн доктор Саруул-эрдэнэ андаас үг зүйн талаар имэйлээр лавлахад монгол үгсийн аймаг одоогоор 8 гэж тооцдог гэв. Үүнд
1. Жинхэнэ нэр; нар, сар, ном, дэвтэр
2. Үйл үг; явах, ирэх, суух
3. Тэмдэг нэр; шар ногоон, том, жижиг
4. Тооны нэр; арав, хорь, нэгдүгээр
5. Төлөөний үг; чи, би, ингэх, тэгэх, энэ тэр
6. Орон цагын нэр; дээр доор, урьд өмнө
7. Холбох үгс; ба, бөгөөд, буюу
8. Чимэх үгс; даа, шуу, л, ч, сан гэх мэт.
болно гээд үүнээс жинхэнэ нэр, үйл уг 2 маш олон нөхцөл авахыг дурдав. Жинхэнэ нэр гэхэд тоо, тийн ялгал, хамаатуулах нөхцөл авдаг. Үйл үг эхлээд хэв, дараа нь байдал, тэгээд 4 юмны нэгийг авна. Тэр 4 нь захирах хүсэх, цаг заах, тодотгон холбох, нөхцөлдүүлэн холбох.
Эдгээр нь их олон тул бүгдийг бичих нь хүнд байгааг дурьдав.
Харин олзуухууштай сайхан зүйл нь аль нөхцөл алиний араас орох хатуу тогтсон дэс дараа байртай байдаг юм байна. Ямар ч гэсэн үгийн сангаа дээрх 8 бүлгийн дагуу хуваан ангилах нь зүйтэй юм байна.
Ганболд ахын сэтгэгдэлд бичсэн зүйлийг харгалзан интернэтээс олдсон зарим баримт дээр тулгуурлан өөрийн гаргасан зөвхөн ЖИНХЭНЭ НЭРИЙН дагаваруудын (affix) хүснэгтээ жагсааж танилцуулъя. Яараад нилээн бага хугацаанд хийсэн тул мартаж санасан, орхисон эсвэл буруу зүйл олон байгаа. Тиймээс тэдгээрийг нөхөж сэтгэгдэлд оруулж болгооно уу. Нөхцөл гэсэн багана холбох нөхцөлүүдийг заана. Хоосон – шууд залгах, [] дотор байвал язгуур үгийн төгсгөлүүд жишээ нь [а] байвал а-р төгссөн үг [^а] а-с бусдаар төгссөн үг н[] байвал нөхцөлөөр н жийрэглэнэ, []н байвал нөхцөлөөр н гээгдэх гэсэн утгуудыг илэрхийлнэ.

Жинхэнэ нэр
Дагавар Нөхцөл Жишээ болон тайлбар
аа талх-талхаа, аав-ааваа
[а]а аяга-аягаа
г[а] Гажилт: харандаа – харандаагаа
ээ нэр-нэрээ, тэрэг-тэргээ
г[э] Гажилт: тэмээ – тэмээгээ
өө хөдөлмөр-хөдөлмөрөө
г[ө] Гажилт: хөрөө – хөрөөгөө
ууд сайд-сайдууд
н[ямар үед?] ном-номнууд
г[н] байшин-байшингууд
хэзээ гээгдэх юу байж болох уу?
үүд ээж-ээжүүд
[хэзээ гээгдэх?] цэрэг-цэргүүд
г[н] байшин-байшингууд
н[ямар үед?] тэрэг-тэрэгнүүд
чууд монгол-монголчууд
чүүд эр-эрчүүд
д мэргэн-мэргэд, дуучин-дуучид
[н]н мэргэн-мэргэд, дуучин-дуучид
о[д] од-одод, мод-модод
[д]й, өөр? нохой-ноход
и[ч], өөр? төлөөлөгч-төлөөлөгчид
с үг-үгс
ын Харъяалах Т.Я. эр үг аав-аавын
гээгдэх эгшиг? Харъяалах Т.Я. эр үг хавар-хаврын
ны [аоуяёюиы] Харъяалах Т.Я. эр үг хурга-хурганы
и[ь]ь Харъяалах Т.Я. эр үг хонь-хонины
д Өгөх орших Т.Я. эр үг аав-аавд
ан[гийгүүлэгч] Өгөх орших Т.Я. эр үг нар-наранд
он[гийгүүлэгч] Өгөх орших Т.Я. эр үг онгоц-онгоцонд
ин[ь] Өгөх орших Т.Я. эр үг морь-моринд
гээгдэх эгшиг? Өгөх орших Т.Я. эр үг юу байж болох вэ?
т [грсв] Өгөх орших Т.Я. эр үг адаг-адагт,асар-асарт
ыг Заах Т.Я. эр үг аав-аавыг
[ао]ао Заах Т.Я. эр үг арга-аргыг
гээгдэх эгшгийн дүрэм? Заах Т.Я. эр үг авдар-авдрыг
г [аоуяёюиын] Заах Т.Я. эр үг шороо-шороог, нохой-нохойг
аас Гарах Т.Я. эр үг аав-ааваас
н[аоуяёюиын][гийгүүлэгч] Гарах Т.Я. эр үг чарга-чарганаас
г[н] Гарах Т.Я. эр үг дуран-дурангаас
ин[ь] Гарах Т.Я. эр үг агь-агинаас
и[ь]ьа Гарах Т.Я. эр үг хань-ханиас
гээгдэх эгшиг? Гарах Т.Я. эр үг жишээ?
оос Гарах Т.Я. эр үг оргил-оргилоос
н[аоуяёюиын][гийгүүлэгч] Гарах Т.Я. эр үг овоо-овооноос
ин[ь] Гарах Т.Я. эр үг морь-мориноос
г[н] Гарах Т.Я. эр үг сонин-сонингоос
гээгдэх эгшиг? Гарах Т.Я. эр үг орон-орноос
аар Үйлдэх Т.Я. эр үг аав-ааваар
[ауяёюиын]а Үйлдэх Т.Я. эр үг чарга-чаргаар
г[урт эгшиг] Үйлдэх Т.Я. эр үг харандаа-харандаагаар
г[н] Үйлдэх Т.Я. эр үг дуран-дурангаар
и[ь]ьа Үйлдэх Т.Я. эр үг унь-униар
гээгдэх эгшиг? Үйлдэх Т.Я. эр үг савар-савраар
оор Үйлдэх Т.Я. эр үг онгоц-онгоцоор
[оуяёюиын]о Үйлдэх Т.Я. эр үг торго-торгоор
[урт эгшиг] Үйлдэх Т.Я. эр үг шороо-шороогоор
г[н] Үйлдэх Т.Я. эр үг сонин-сонингоор
и[ь]ьа Үйлдэх Т.Я. эр үг морь-мориор
гээгдэх эгшиг? Үйлдэх Т.Я. эр үг орон-орноор
тай Хамтрах Т.Я. эр үг аав-аавтай
той Хамтрах Т.Я. эр үг онгоц-онгоцтой
ийн Харъяалах Т.Я. эм үг ээж-ээжийн
[ь]ь Харъяалах Т.Я. эр язгуур үгэнд эм үгийн дагавар агь-агийн
гээгдэх эгшиг? Харъяалах Т.Я. эм үг цэрэг-цэргийн
ний Харъяалах Т.Я. эм үг чих-чихний
д и Өгөх орших Т.Я. эм үг ээж-ээжид
эн[гийгүүлэгч] Өгөх орших Т.Я. эм үг дэрс-дэрсэнд
өн[гийгүүлэгч] Өгөх орших Т.Я. эр үг төгрөг-төгрөгөнд
ин[гийгүүлэгч] Өгөх орших Т.Я. эр үг хөөргөгч-хөргөгчинд
гээгдэх эгшиг? Өгөх орших Т.Я. эм үг юу байж болох вэ?
т [грсв] Өгөх орших Т.Я. эм үг цэрэг-цэрэгт, дэлгүүр-дэлгүүрт,хэлтэс-хэлтэст,сэдэв-сэдэвт
ийг Заах Т.Я. эм үг ээж-ээжийг
[үэөеюий]үэө Заах Т.Я. эм үг хөрөнгө-хөрөнгийг
гээгдэх эгшгийн дүрэм? Заах Т.Я. эм үг цэрэг-цэргийг
г [үэөеюийн] Заах Т.Я. эм үг тэмээ-тэмээг, хөвөн-хөвөнг
ээс Гарах Т.Я. эм үг ээж-ээжээс
н[үэөеюийн][гийгүүлэгч] Гарах Т.Я. эм үг тэмээ-тэмээнээс
гээгдэх эгшиг? Гарах Т.Я. эм үг цэрэг-цэргээс
г[н] Гарах Т.Я. эм үг тэн-тэнгээс
өөс Гарах Т.Я. эм үг төр-төрөөс
н[үэөеюийн][гийгүүлэгч] Гарах Т.Я. эм үг хөшөө-хөшөөнөөс
гээгдэх эгшиг? Гарах Т.Я. эм үг өндөг-өндөгнөөс
г[н] Гарах Т.Я. эм үг хөвөн-хөвөнгөөс
ээр Үйлдэх Т.Я. эм үг эмээл-эмээлээр
[үэөеюийн]э Үйлдэх Т.Я. эм үг эрдэнэ-эрдэнээр
[урт эгшиг] Үйлдэх Т.Я. эм үг хэрэгцээ-хэрэгцээгээр
гээгдэх эгшиг? Үйлдэх Т.Я. эм үг цэрэг-цэргээр
г[н] Үйлдэх Т.Я. эм үг цэн-цэнгээр
өөр Үйлдэх Т.Я. эм үг цөл-цөлөөр
[үэөеюийн]ө Үйлдэх Т.Я. эм үг өнгө-өнгөөр
[урт эгшиг] Үйлдэх Т.Я. эм үг хөрөө-хөрөөгөөр
гээгдэх эгшиг? Үйлдэх Т.Я. эм үг өрөм-өрмөөр
г[н] Үйлдэх Т.Я. эм үг хөвөн-хөвөнгөөр
тэй Хамтрах Т.Я. эм үг ээж-ээжтэй, хөрөнгө-хөрөнгөтэй

Үг зүйн талаар

Monday, June 4th, 2007

Арван хэдэн жилийн өмнө үзсэн болоод тэрүү монгол хэлнийхээ үг зүйн дүрмийг сайн санадаггүй ээ. Үг зүйн шинжилгээ хийх үед дараах хүндрэлүүд гарав. Сэтгэгдэлд та бүхэн зааварчилгаа үлдээнэ үү.
Үйл үгийн төрлөө 4 үндсэн бүлгээр авлаа.
№1 Нэр үг
№2 Үйл үг
№3 Тэмдэг нэр
№4 Үйлт нэр
Өөр бүлэг байх боломжтой юу? Байвал ямар шинж чанартай байх вэ? Монгол хэлний үг зүйн талаар материал байвал скандаад өгөх буянтай хүн байна уу?
Үгийн төрлийг автоматаар таних функц бичихэд, дээрх бүлгүүдийн шинж чанарын ялгаа чухал хэрэгтэй болоод байгаа юм.

Хоёрдугаарт угтвар, дагаварын дүрэмийг эмхэтгэх гэж үзэв.
Долоон тийн ялгалын 14 – ын^2, д/т, ыг^2, аар^4, аас^4, тай^2
Олон тооны 8 – ууд^2, нууд^4 с, чид
Үгүйсгэгч 4 – гүй^4,
Өнгөрсөнг илтгэгч 14 – сан^4, чихсан^4, лаа^2 жаа^4
Давталт илтгэгч 5 – даг^4, чихдэг
Эелдэг хэлбэр 2 – хсан^2
Дуудах 4 – aa^4
Үйлээс нэр үүсгэгч 4 – ч, чин, гч, лт
Үйлээс тэмдэг нэр үүсгэгч 4 – ан^4
Орон зай эсвэл хэмжээний 1 – х
Нөхцөлт 8 – уут^2, нгуут^2, вал^4
Хамаатуулагч – 4 хаа^4

Эдгээр нь бүх дагаварыг хамарч чадаж уу? Угтвар харин монгол үг зүйд байхгүй билүү санадаггүй ээ.

Үг үсгийн алдаатай тэмцэе

Sunday, June 3rd, 2007

Энэ хагас бүтэн сайнд aspell хэмээх үг үсгийн алдаа шалгагч програмд оруулсан монгол хэлнийхээ дэмжилтийг сайжруулж өнжив. Энэ удаад зөвхөн үгийн санг сайжруулж, нэмэхээс гадна монгол хэлний угтвар, дагаварын дүрмийг оруулах нь гол зорилго байгаа билээ.
Тиймээс монгол хэлнийхээ (ядаж) энгийн дүрмүүдийг хамарсан загварыг гаргах шаардлагатай юм. Түүнийг гаргачих санаатай аль эртнээс бодож явсан боловч 3 сарын өмнө монгол хэлний үгийн сан үүсгэх зорилготой вэбээр үг түүгч програм бичих үедээ үг шалгахдаа нэгмөсөн оруулчих гээд нилээн барьж авч оролдов. Эхнээс нь ганц нэг дүрэмийн загвар гаргаж байтал хэтэрхий их онцгой тохиолдол, гажилтууд гарч ирээд байхаар нь дургүй хүрээд бүтэхгүй нь гээд хаячихсан байснаа өнөөдөр нэг гоё санаа орж ирээд жаал нухав. Энэ санаа бол ерөнхий дүрэмд захирагдах универсал загвар гаргах нь бараг бүтэшгүй эд юм гэж үзээд дүрмүүдээ гажилтууд тооцохгүй загварчилаад түүсэн үгийн баазтайгаа үгээ ангилан холбох эсвэл бүр үг тус бүрээр нь флаг тодорхойлон (myspell, ispell шиг) холбох нь монгол хэлний дүрмийн асуудлыг ямар ч гэсэн бүрэн шийдэх боломжтой гэдгийг олж харсан явдал юм. Тун энгийн боловч гоё санаа. Формал тодорхойлолт ашиглаад батлаж болох байх. Хэн нэг нь хийвэл их баярлана. 😉 Харин үгийн баазаа маш сайн чанартай бүрдүүлэх хэрэг гарч байгаа юм. ОпенМН-ы шинэ вэбийг дуусах үед би үг түүгчээ холбосон байх ба хүн бүр ороод үг шалгахад оролцох боломжтой болохоор ямар ч гэсэн энэ ажил амжилттай болох байх гэж найдаж байна. Ингээд дүрмүүдээ гажилт тооцохгүй загварчилж сууна.
Үг түүгч болон онлайн орчуулгын програмаа Perl болон PHP хэл ашиглан хийж байгаа тул эдгээр хэлний форматад тохируулан энгийн илэрхийлэлүүдээ (regular expression) бичиж байна. Зарим энгийн илэрхийлэлүүдийг бичихэд нилээн хүндрэл гарч цаг нилээн алдаж сууна.
Ер нь үг үсэг, тэмдэгт мөртэй ажиллахад хамгийн их хэрэг болдог одоогоор хамгийн хүчирхэг хэрэгсэл бол энгийн илэрхийлэл “regular expression” юм. Хэрэв өөр хэрэгсэл байдаг бол сэтгэгдэлд үдээнэ үү. 😉
Ингээд энгийн илэрхийлэлийн хэдэн мета тэмдэгтийг тайлбарлавал хэрэг болох байх гэж бодоод жагсаая. Эдгээр нь Posix стандартыг барьсан болно.

. – Цэг. Цэг нь ямар нэг дан тэмдэгтүүд орлоно. Харин дөрвөлжин хаалт [ ] дотор бол энгийн цэг гэсэн утгаараа үлдэнэ. Жишээлбэл: “a.cd” нь “abcd” илэрхийлэх бол [a.cd] нь “a” эсвэл “.” эсвэл “c” эсвэл “d” байж болно.
[ ] – Дөрвөлжин хаалт нь хаалт доторх тэмдэгтүүдээс нэг дан тэмдэгтийг илэрхийлнэ.
Жишээлбэл [abc] нь “a”, “b”, эсвэл “c”. байна. [a-z] нь ямар нэг жижиг латин үсгийг илэрхийлнэ. Харин монгол үсэг тэмдэглэх бол кодоор нь бичих хэрэгтэй болно. Жишээлбэл “\xd0\xb0” нь жижиг юникод кирил а -г илэрхийлнэ.
[^ ] – Хаалттай малгай нь хаалтан дотор байхгүй нэг дан тэмдэгтийг илэрхийлнэ. Жишээлбэл: [^abc] нь “a”, “b”, эсвэл “c” -с бусад тэмдэгтийг илэрхийлнэ.
^ – Малгай нь мөрын эхлэлийг илэрхийлнэ. Олон мөртэй бол ямар нэг мөрийн эхлэл.
$ – Доллар нь мөрын төгсгөлийг заана.
( ) – Хаалт нь дэд илэхийлэл буюу тухайн энгийн илэрхийлэл доторх блокыг илэрхийлдэг.
\n – Латин н нь 1-9 цифр байвал n дүгээр дэд илэрхийлэл буюу блокыг илэрхийлнэ. Энэ бүтэц нь үнэндээ онолын хувьд энгийн бус илэрхийлэл тул өргөтгөсөн энгийн илэрхийлэлд хэрэглэгдэхгүй санахад илүүдэхгүй.
* – Ямар нэг тэмдэгтийн ардаас Од орвол тухайн тэмдэгтийн тэг болон олон хуулбарыг илэрхийлдэг. Жишээлбэл “ab*c” нь “ac”, “abc”, “abbbc” гэх мэтээр цааш заах ба “[abc]*” matches “”, “a”, “b”, “ca”, “cba” гэх мэтээр заана. Дээр дурдсан мета тэмдэгтүүдтэй хоршин хэрэглэгдэнэ.
За цааш нь Гүүглээс дэлгэрүүлэн харж олж үзэж болно.

Үг үсгийн дүрэм шалгах загвараа http://www.shuleg.org дээр тавигдсан хэлний материалыг ашиглан гаргаж байгаа тул үүнийг оруулсан хүмүүст талархал илэрхийлье. Жигтэйхэн их алдаатай бичдэг нөхөр болхоороо би энэ тал дээр их анхаарал хандуулж байгаа юм болов уу.