Badral's personal blog

Интернет миний ертөнцийг хардаг цонх …

Archive for the ‘Нэт програмчилал’ Category

Warriors of the Net – What is internet?

Monday, June 1st, 2009

2002 онд сүлжээний технологи гэсэн хичээл дээр (University RWTH-Aachen) үзүүлж байсан нэгэн видеог youtube дээр байхыг хараад холбочихлоо. Ердөө 13-хан минутын бичлэг. Хөөрхөн видео байгаа. ;-) Манай телевизүүдийн боловсрлын хэлтэсүүд иймэрхүү зүйлсийг орчуулаад тавиад байдаг болоосой.

Болор Агуулга Удирдах Системийн талаар товчхон

Saturday, February 16th, 2008

За сүүлийн үед зарим нэг сонин хүмүүсээс Болор АУС-ын харилцахаар хачин хачин мэйл ирсэнийг хараад энэ тухай мэдээлчихье гэж бодлоо.
“Suhee” suhee_ba86 эт yahoo.com гэсэн хаягаар “Joomla zaschihsan CMS yum bishuu yamar aimaar unetein.” гэсэн мэйлд хамгийн их эгдүү хүрлээ. Хэрвээ ямар нэг сайт руу ороод уншдаг бол http://www.bolorcms.com дотор яаж хийсэн тухай концепт, архитектур нь монгол, англи хэл дээр хүртэл бий.
Харин ч ёстой ямар нэг CMS-c нэг үсэг ч хуулсан зүйл байхгүй тул ам бардам хэлье! Хууллаа заслаа гэхэд явж явж муу joomla-г сонгоно ч гэж юу байхав дээ. Маш нарийн ярьвал LGPL лиценз бүхий 1 ширхэг л өөр хэрэгсэл ашигласан бөгөөд тэр нь TinyMCE editor.
Ямар ч CMS-с санаа авсан юмуу хулгайлсан зүйл байхгүй. Харин ч ямар нэг системийн код харчихвал дуурайгаад өөрөө сэтгэхгүй юм болох вий гэдгээс айгаад ямар нэг зүйл интернэтээр ч хайж үзээгүй ээ бичсэн систем. Вэб програмчлал гадарладаг хүнд бол ч уг нь ямар нэг системийн хуулбар биш болох нь мэдэгдэнэ л дээ. Өөрөө програмын архитектур, загвараа гаргаад концептоо боловсруулаад кодоо ганцаараа бичсэн. Одоогийн байдлаар бүх модуль болон үндсэн системийн эх код 13 МБ болсон байгаа бөгөөд үнийн хувьд өөрийнхөө чадвартай эн зэрэгцэх системүүдээс хэд дахин хямд байгаа. Хэдийгээр олон зарагдаагүй байгаа ч худалдаж авсан хэрэглэгчид ямар ч гэсэн сэтгэл хангалуун байгаа.
Худалдан авч хэрэглэж байгаа хүмүүстэй баталгаа гаргаж өөрийн хийсэн зүйлсээ энэ мэт хардлагаас сэргийлэх үүднээс энэ зун монголд очихдоо зохиогчийн эрх патент гэрчилгээг нь авъя даа. Өөр ч юу хэлэхэв.

UTF-8 substring function

Wednesday, February 6th, 2008

Сүүлийн үед янз бүрийн монгол вэбүүдийг харж байхад юникод бичвэр автоматаар тасалж авахдаа шууд PHP substr функц ашиглаад нөгөөдүүл нь эвдэрч харагдах нь их болжээ. Жишээлбэл computertimes.mn дээр

Өнөөдөр дэлхийн мэдээллийн технологи (МТ)-ийн зах зээл асар хурдацтайгаар хүрээгээ тэлж улам бүр глобал шинжтэй болж&nbs ; байна. Дэлхий дээр энэ салбарт зардаг мө�…

Сүүлийн 3 цэгийн өмнө UTF-8 тэмдэгт эвдэрсэн байгааг та бүхэн харж байна. Иймэрхүү асуудлуудыг засахад зориулж бичсэн дараах функцыг та бүхэнд толилуулж байна.

function utf8_substr($str, $offset, $length= false) {
preg_match_all(‘~[\x09\x0A\x0D\x20-\x7E]
| [\xC2-\xDF][\x80-\xBF]
| \xE0[\xA0-\xBF][\x80-\xBF]
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}
| \xED[\x80-\x9F][\x80-\xBF]
| \xF0[\x90-\xBF][\x80-\xBF]{2}
| [\xF1-\xF3][\x80-\xBF]{3}
| \xF4[\x80-\x8F][\x80-\xBF]{2}
~xs’, $str, $match);
if ($length !== false) {
$a= array_slice($match[0], $offset, $length);
} else {
$a= array_slice($match[0], $offset);
}
return implode(”, $a);
}

Сонголтын зовлон. Ajax – Dojo, Prototype MooFX эсвэл JQuery

Tuesday, July 17th, 2007

За өнөөдөр нэг жижигхэн AJAX програм бичих хэрэгтэй боллоо. Дарга маань америкаас ирж инспекторуудад холбоо дутаж байна олон улсын яриа байнга хийх зардал ихтэй тул байгууллагынхаа дотоод хэрэгцээндээ зориулсан нэг чаат хийж чадах уу гэж байна. За бололгүй яахав ийм жижигхэн эдийг амралтаа эхлэхээс өмнө хийчихнэ гээд ам гарчихав. Анх авахдаа бэлэн нээлттэй эх бүхий Ajax чаат ашиглачихъя гэж бодсон юм.
Ингээд сүлжээнээс ухаж байтал гэнэт тийм бэлэн юм ашиглахаар энэ хүмүүсийн шуураад байгаа Ajax-ыг жаахан судлаад авъя гэж бодоод өөрөө хиймээр санагдчихлаа. Гэхдээ янз янзын санаа толгойд бууж байнаа. Ер нь энэ интернэтийн хурд ихсэж байгаа юм чинь нөгөө вэб үйлдлийн системүүд ч хүчээ авах шинжтэй. Олон нийтээрээ хамтран ажиллах зүйлс дээр олон сайн талыг вэб үйлдлийн системүүд олгож болох юм байна шүү!
Ингээд ер нь вэб үйлдлийн систем маягийн юм эхлүүлчихье гэж бодоод ажилынхаа нэрээр imcios гэсэн нэртэй Ajax төсөл эхлүүлчихлээ. Ийм юм тийм юм хийгээдэх гэхээр нь нэмээд явчихвал амар санагдаад.
Ингээд гол сууриар юуг сонгохоо шийдэж чаддаггүй ээ. Маш олон фрэмворк үүссэн юм байна. Урьд нь prototype мэр сэр ашиглаж үзсэн болохоор тэр маань хамгийн түрүүнд санаанд буулаа. Ингээд moofx хоршуулан хэрэглэвэл гайгүй хөнгөн хурдөн болох юм болов уу гэж бодож байтал Qooxdoo, mochikit, scriptaculo.us, dojo, JQuery, GWT гээд олон юм гарч ирж байнаа.
Эдгээрээс өөрийнхөө хэрэгцээг хангах сонголт хийх болов. Сонгол хийнэ гэдэг хамгийн хэцүү зовлон. Аль нь хурдан бол? Аль нь хүчирхэг бол гэж бодохоос гадна аль нь цааш байнга тогтвортой хөгжих бол гээд янз бүрийн асуулт гарч ирнэ. Эдгээр дотроос ямар ч гэсэн GWT-н ард гүүгл, Dojo -н ард IBM, SUN гээд том том нөхдүүд байгаа тул удаан тогтвортой хөгжих болов уу гэсэн таамаг бууж нилээн ухлаа. Dojo хүчирхэг юм, гэхдээ арай нүсэр удаан юмаа. GWT ч бас сүртэй хурдан юм мэдэгдсэнгүй харин дүрэм нь нилээн дотно санагдлаа. GWT нь Eclipse SWT дүрэмтэй төстэй юм. Хэдий хүчтэй ивээн тэтгэгчтэй боловч нэг л сайн таалагдсангүй.
Ингээд цааш жаахан харлаа. Qooxdoo нь германы karlsruhe их сургуулийнхан хөгжүүлсэн систем тул тун сүрхий цэвэрхэн, эмх цэгцтэй байж магадгүй гэж бодоод жаал харлаа. Алдсангүй ээ. Сайхан цэгцтэй объект хандалтат програмчилсан байна. Аричууд энэ системтэй, эмх цэгцтэй тал дээр ч үнэхээр айхтар даа. Ганц муу юм нь дезайны мэдрэмж л яг над шиг. :-) Юу ч байхгүй. Энэ төсөл дээр ч бас иймэрхүү л харагдаж байна даа. Энийг засаж уг нь болох л байлгүй үүнийг сонголтод үлдээв.
Цааш жаахан хартал JQuiry дүрэм нь хялбархан хурдан хөгжүүлж болмоор санагдав. Бас хурдан хөнгөн юмаа. Урьд үүний тухай сонсож байгаагүй тул итгэл жаахан муу л байна. Сонссон сурсан дассанаараа Prototype, MooFX -ээ л ашиглачихмаар санагдаад байх юм. Prototype ч бас л олон юмны суурь болж өгсөн нилээн бат бэх харьцангуй доод төвшиний эд.
Та Ajax програмчилал хийдэг бол энэ тал дээр туршлагатай бол саналаа үлдээгээрэй. 1. JQuery, 2. Prototype, 3. Qooxdoo гурвын аль нь дээр вэ? Хэн нэгнээс хариу ирэхгүй бол Jquery дээр л буух санаатай.

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 зэрэг багажууд ашиглаад програмын эхээ байт кодонд хөрвүүлэн хурдасгах техникийн аргууд байдаг. Гэхдээ оптимал програмчилж чадаагүй програмыг хэчнээн техникийн хүчээр үзээд үзээд оптимал програмчиллаас төдийлөн дээрдэхгүй.
Эцэст нь нэг стандарт шахуу болсон зүйл сануулахад: Та ямар ч програмчлалын хэл ашиглаж байсан Классын нэрийн эхний үсгийг томоор функцийн нэр болон хувьсагч, объектын нэрийн эхний үсгийг жижгээр бичиж заншвал код хамаагүй цэвэрхэн ойлгомжтой харагддагийг мэдэх бизээ.

Хүн болох багаасаа, хүлэг болох унаганаасаа

Tuesday, May 29th, 2007

Нэг програмтай зууралдаад ойрд зав гардаггүй. Ямар програм болохыг нь удахгүй задланаа. ;-)
Аливаа зүйл багаас эхэлдэг. Тиймээс та PHP хэлний чадвараа нэмэгдүүлэхийг хүсэж байвал дараах хэдэн зүйлийг санаж програмаа бичиж байхад илүүлэхгүй. Ямар ч гэсэн хамгийн энгийн 10 зүйлийг энд дурдая. Тэрнээс уртыг бичих зав гарахгүй байх.
1. Давхар хашилтын (“) оронд дан хашилт хэрэглэж байх. Жишээлбэл: “Хариу: $result” -ийн оронд ‘Хариу: ‘. $result гэх мэт. PHP хөрвүүлэгч (интерпретор) давхар хашилт доторх зүйлсийг шалгадаг ба дан хашилтад байгаа зүйлсийг шууд залгадаг тул таны програмын хурдад эерэгээр нөлөөлнө. Мөн кодын эмх цэгцэд сайнаар нөлөөлнө.
2. If нөхцөл шалгахдаа хамгийн магадлалтай зүйлсээ эхэнд шалгаж байх хэрэгтэй. Таны програмын хурдад сайнаар нөлөөлнө.
3. Цикл хэрэглэх болбол аль болох for, foreach, while (each() list()) гэсэн дарааллаар хэрэглэж байх хэрэгтэй. Учир нь for, foreach while (each() list()) хурдан байдаг.
Жишээлбэл: for ($i=0; $i<$len; ++$i) бусад хувилбаруудаасаа хамгийн хурдан нь.
For цикл дотроо нөхцөл шалгахдаа функц бүү дууд! Жишээлбэл: for ($i=0; $i<$strlen($str); ++$i) биш $len=strlen($str); ($i=0; $i<$len; ++$i); хэрэглэвэл таны код илүү оптимал хурдан ажиллана. Мөн PHP4 шинжээчийн хувьд Postfix буюу ($i++) алхамын оронд prefix (++$i) алхам хэрэглэвэл таны код шинжээчээр илүү хурдан шалгагдах тул бас хурдыг бага ч гэсэн нэмэгдүүлнэ. PHP5-ын хувьд онцын ялгаа мэдэгдэхгүй болсон байсан.
4. Юникод өгөгдөлтэй ажиллаж байгаа бол та өгөгдлийн баазад бичилт хийхийнхээ өмнө
mysql_query(‘SET character_set_client=utf8′);
mysql_query(‘SET character_set_connection=utf8′);
функцүүдийг заавал дуудаарай. Тэгвэл таньд өгөгдөлийн кодчилолын асуудал гарахгүй.
5. mysql_escape_string() функцийн оронд mysql_real_escape_string хэрэглэж бай. Учир нь mysql_real_escape_string функц тухайн өгөгдлийн кодчилолыг харгалзаж үздэг тул илүү найдвартай.
6. Энгийн илэрхийлэл ашиглахдаа ereg функцүүд биш preg функцүүд ашиглаж байвал илүү хурдан.
7. Өгөгдөл хэвлэхдээ echo, print, printf гэсэн дарааллаар функцүүдээ сонгох хэрэгтэй. Яагаад эхлээд echo -г сонгох хэрэгтэй вэ гэвэл өгөгдлийг шууд гаралт руу тушаадаг тул энэ 3 дотроо хамгийн хурдан нь. Урьд нь PHP3 дээр print хамгийн хурдан нь гэгддэг байсан боловч PHP4-с хойш биш болсон.
8. Ховдог байх хэрэггүй. :-) Өгөгдлийн баазаас өгөгдөл уншихдаа хаа сайгүй SELECT * FROM table гэж авах хэрэггүй. Зөвхөн хүссэн талбараараа авч байх хэрэгтэй.
SELECT fieldname FROM table гэх мэт. Адгийн наад зах нь хүснэгт шалгах үйлдлийг хэмнэнэ.
9. Заагч (Reference) ашиглаж байх хэрэгтэй. Ямар нэг хувьсагчид хуулбарлаад яваад байвал таны серверийн физик санах ойд хадгалагдах ба серверийн хүчин чадалд муугаар нөлөөлнө. Жижиг хэмжээний скриптүүд дээр сүртэй ялгаа мэдэгдэхгүй боловч томоохон хэмжээний програмууд дээр илэрхий ялгаа ажиглагддаг. PHP5 аас өмнөх хувилбар дээр хуулбартай ажиллах нь илүү хурдан гээд хөгжүүлэгчид ихээхэн ашигладаг байсан бол PHP5-с хойш эсрэгээр эргэсэн.
10. Залхуу холболтоос зайлсхий. PHP файлын толгой бүр дээр шууд файлуудыг холбоод яваад байх нь утгагүй. Яг зайлшгүй хэрэгтэй газар нь функц дотроо холбоод явах нь илүү үр ашигтай. Зарим үйлдэлд огт хэрэггүй үед бүхэл бүтэн файл эсвэл класс үргэлж холбох нь утгагүй.

Эцэст нь кодыг маш эмх цэгцтэй, тайлбартай бичиж явах нь туйлын чухал. Яаж эмхэлж цэгцлэх талаар янз бүрийн жишээ баримтууд инэтээр дүүрэн бий. Олж аваад уншицгаана бизээ.

Форум модул ба өгөгдлийн баазын загвар

Monday, May 21st, 2007

Өнгөрсөн долоо хоногт Болор агуулга удирдах системийнхээ (АУС) форум модультай зууралдсаар өнгөрүүлэв. Энэ модуль нь бусад модулийг бодвол нилээн интерактив интерфейстэй тул цаг нилээн авлаа.
Энэ модул нь үндсэндээ хэлэлцүүлэгийн ангилал удирдах хэсэг, хэлэлцүүлэг удирдах хэсэг, сэдэв удирдах хэсэг, бичлэг удирдах хэсэг. тохиргооны хэсэг гэсэн үндсэн 5 дэд модульд хуваагдав.
Эхний 2 хэсэг харьцангуй амархан тул нэг их цаг алдалгүй амжуулав. Сэдэв ба бичлэг удирдах хэсэгт нилээн цаг зарсаны нэг нь хэрэглэгчид BBcode орууулахыг зөвшөөрөх BBcode parser класс болон хэрэглэгчид заавал код бичүүлэхгүй шууд оруулах интерфейс хийх байлаа. Regular Expression (энгийн илэрхийлэл гэж орчуулагдах уу?) бичээд маш жижигхэн класс үүсгэв. Хэрэглэгчийн интерфейс хэсэгт Болор АУС-ийн WYSIWYG засварлагчаар ашигласан TinyMCE -г ашиглалаа.
Мөн найдвартай байдлын үүднээс хэрэглэгчээс HTML, PHP, TAG (тэмдэглээс гэж орчуулагдах уу) зөвшөөрөхгүй гэхээр хэрэглэгчид PHP, HTML код оруулж хэлэлцэхэд бэрх болох гээд байсан тул зөвшөөрөхөөр оруулж оруулсан өгөгдлийг шинжлэн найдвартай хадгалах гэж жаал цаг зарлагадав. Модул одоогоор ерөнхийдөө дууссан бөгөөд сэдэв эхлүүлэгчид өөрийнхөө сэдвийг засварлах, төлөв тогтоох, модераторуудад сэдэв болон бичлэг удирдах боломжуудыг нэмэх л үлдэв.
Энд төлөв тогтоох гэдэг дээр наалттай юу зарлал уу гэсэн биш энэ сэдэв шийдэгдэж хаагдсан уу үгүй юу? Шийдэл баталгаатай юу үгүй гэдгийг заах юм. PHPBB ч юм уу vbulletin дээр ийм боломж байдаг эсэхийг мэдэхгүй. Ямар ч гэсэн надад тун хэрэгтэй мэт санагдаад ийм боломж нэмэв.
MYSQL өгөгдлийн баазын загвар гаргахдаа би DBDesigner хэмээх үнэгүй програм хангамжийг ашигладаг. Ямар ч гэсэн миний хэрэгцээг хангаад байдаг сайн програм. Линүкс виндовс аль алин дээр нь асуудалгүй ажиллана. Энэхүү програм ашиглан гаргасан форумын өгөгдлийн баазын загварын хураангуй хэлбэрийг доор хавсаргав. (MSSQL өгөгдлийн баазын загвар гаргахдаа би visio ашигладаг.)
Болор форумын өгөгдлийн баазын загвар
Өгөгдлийн баазын загвар гаргаж явах нь тухайн бүтээгдэхүүнийг гаргасаны дараа арчилан сайжруулах, баримтжуулах зэрэгт онцгой ач холбогдолтой байдаг. Хэрэв та загвараа эхлэж гаргадаггүй бол өнөөдрөөс эхлэн үргэлж загвар гаргаж явж байгаарай.