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

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

Is it time to upgrade my php source code to 5.x?

Friday, January 21st, 2011

За Болор АУС-ээ анх PHP 4.1- дээр хөгжүүлж эхэлжээ. Гэтэл өнөөдөр маш олон сервер дээр 5.x явж байдаг. Код маань хэдий объект хандалтат боловч нөгөө л 4.x-тэйгээ зохицож ажиллаж байхын тулд хуучин загвараа барьсаар л байдаг. Гэтэл сүүлийн үед шууд PHP 5.3 болон түүнээс хойшхи хувилбарт зориулаад шинэчлэлт хийчихмээр санагдах боловч бас маш олон/ихэнхи сервер дээр PHP 4.x ажилласаар байдаг. Энэ талаар та бүхэнд хийсэн судалгаа байна уу? Та аль хувилбарыг нь хэрэглэж байна?
Одоо байгаа нэгэн модулийнхаа хэр объект хандалт хийж байгааг үзүүлбэл:

require_once BASE_DIR . ‘module/basemodule/ListModule.php’;
class Index extends ListModule {
var $modHandler;
var $someclassglob;
var $staticvar;
function Index($db) {
parent :: ListModule($db, ‘category’);
$this->catHandler = new CategoryModHandler($db, $this->user->getLogin());
$this->start();
}
…..
…..
function xxxxx() {
…..
}
…..
}
$db = new MySQL($host, $dbUser, $dbPass, $dbName);
// Instantiate the Auth class
$auth = new Auth($db, SECRET);
// For logging out
if (isset ($_GET[‘action’]) && $_GET[‘action’] == ‘logout’) {
$auth->logout();
}
$index = new Index($db);
…..

Энэ нь 4-с эхлээд өнөөг хүртэл бүх хувилбар дээр ажиллана. Хөөрхий 4.x-н хийж байгаа л боломж нь энэ. Уг нь жинхэнэ объект хандалтат бөгөөд арай найдвартай болгоё гэвэл:

require_once BASE_DIR . ‘module/basemodule/ListModule.php’;
class Index extends ListModule {
private $modHandler;
protected $someclassglob;
private static $somestaticvar;
public function __construct($db) {
parent :: __construct($db, ‘category’);
$this->catHandler = new CategoryModHandler($db, $this->user->getLogin());
$this->start();
}
…..
…..
private function xxxxx() {
…..
}
…..
}
try {
$db = new MySQL($host, $dbUser, $dbPass, $dbName);
// Instantiate the Auth class
$auth = new Auth($db, SECRET);
// For logging out
if (isset ($_GET[‘action’]) && $_GET[‘action’] == ‘logout’) {
$auth->logout();
}
$index = new Index($db);
} catch ( exception $e ) {
echo ‘caught exception: ‘ . $e->getMessage () . ‘, error trace: ‘ . $e->getTraceAsString ();
}

гэх маягаар хиймээр байдаг. Нэг талаас PHP5 руу шилжиж protected, private, final, abstract, interface, static members, __construct, __distruct, class constant, try catch ашигламаар байдаг. Нөгөө талаас PHP4 кодууд маань асуудалгүй ажиллахын дээр ихэнх хост дээр байсаар байдаг. Яая даа байз. Хэдийгээр PHP4 маань объект хандалтыг муу дэмжсэн ч PHP5 шиг объект хандалт хийх гээд Объект хандалтат аргачлалыг элэг бөөрөөр нь задлаад, нийлүүлж кодчилж суусаар объектын бүтцийг маш сайн сургадаг юм шиг санагдсан шүү. Ялангуяа маш оновчтой арга замыг олох гээд яаж reuse, singleton зэргийг хийх үү гээд л мөн ч их бодсон санагдана. Болор АУС-н MySQL класс л лав zend/php-н mysqli -с дутахааргүй хүчин чадал болон оновчтой болсон юмдаг.

Some words to network protocolls

Sunday, January 9th, 2011

Компьютерын сүлжээний протоколын талаар маш энгийн бөгөөд ойлгомжтой тайлбарлахыг хичээе. Тийм их цаг гаргаж чадахгүй тул маш товч бичнэ.
Үүнийг бичих болсон шалгаан нь манай залуус онолыг цээжээр мэдээд, практик дээр мөн сүлжээгээ сүрхий тавьчихдаг хэрнээ тэр 2 холбож сайн мэдэхгүй юм. Энэ манай их дээд сургуулиудын сургалттай холбоотой байх.
Би 1998 онд КТМС-т Мөнхбаяр хэмээх багшаар сүлжээний хичээл заалгаж байсан бөгөөд тухайн үед сургуульд интернет орж ирээд ч удаагүй байж, Мөнхбаяр багш ч шинэхэн байж хөөрхий багш маань зааж байсан хичээлээ ойлгодог ч байсан юм уу үгүй юм уу, нэг лайтай зузаан англи номыг эргүүлээд учир нь олдохгүй өгүүлбэр уншаад цээж бичиг бичүүлээд байдаг байж билээ. Заримдаа биш ээ ерөөсөө ингээд биччих гэж авдаг сан. Гэхдээ муу багшаа муулаад яахав, хөөрхий минь сүлжээний OSI reference model буюу “сүлжээний OSI загвар”, түүний 7 төвшин байдаг гэсэн ойлголтыг өгөх нь өгсөн. Түүнээс цааш харин байхгүй. Одоо харин байдал эрс дээрдсэн байх гэж найдаж байна.
Сүлжээний протокол нь хоостууд хоорондын харилцах дүрэм л гэсэн үг. Хүн дээр бол жишээ нь хэл гэж юм байна. Та англи хэл мэдэхгүй байхдаа “Apple” гэсэн үг хараад “Алим” гэж ойлгохгүй. Харин “Алим” гэж байвал аахан нэг тийм хазаад иддэг жимс байна гээд дор нь ойлгоно. Гэтэл зарим хүмүүс тэр жимсийг “Яавлаг”, “Яблок”, “Аппл” гэж ярих нь бий. (Монгол хэл гэсэн протоколыг зарим хүмүүс маш ихээр эвдэж, үр ашиггүй болгож байна.) Тэдгээрийг хөдөөнөөс орж ирсэн мань мэт нь ойлгохгүй. Ойлголцохын тулд яах вэ? Тэр жимсийг алим гэж оноож нэрлэсэн байх явдал. Тэгж оноож тодорхойлсон цаашилбал тэр ISO гээд айхтар стандартаар нь баталсан тодорхойлолтыг протокол гээд байгаа.
Энд би протоколын талаар хялбарчлан авч үзэж буй тул OSI 7 төвшин биш интернет протоколын бухлын 5 (Protocoll stack – протоколын бухал гэж өвсний бухал шиг утгаар хэрэглэв 🙂 ) төвшинд авч үзье. Ер нь бол яг нарийн авч үзвэл 5 төвшиндөө ч цэвэр салж өгдөггүй шүү дээ. Жишээлбэл маш олон протоколууд алдаанаас хамгаалахын тулд доод төвшнийхөө функцүүдийг давхар агуулсан байдаг.
За та вэб хуудас үзэхэд ямар протоколуудыг хэрэглэх вэ гэвэл HTTP(S), TCP/IP, … гэх мэт гээд л торохгүй. Тэгвэл ялгаа нь юу вэ гэхээр суучих жишээтэй. Ялгаа нь өөр өөр төвшний протоколууд юм. Өөр өөр төвшний протоколууд мэдээж ойлголцохгүй. Жишээлбэл та бичиг мэдэхгүй хүнд АЛИМ гэж бичээд нөгөө хүн чинь таныг уншиж хэлж өгөхөөс нааш яагаад ч ойлгохгүйтэй ижил. Ер нь манай багш нар юу юу гэж орчуулж хэрэглэж байгааг бүү мэд. Би өөрийнхөөрөө дээрээс нь доош нөгөө таван төвшнөө оноогоод нэрлэчие.

  1. Програмын төвшин – Хэрэглэгчийн програмууд харьцдаг тул (Application layer- махчилбал хэрэглээний төвшин)
    Энэхүү төвшинд HTTP, HTTPS, FTP, SMTP, LDAP … гэх мэт олон протоколууд хамаарна. Тэдгээр протоколууд нь програмуудад хэрэглэгддэг дээд төвшний протоколууд. Та бид програмчлалдаа энэхүү протоколууд шиг протоколууд үүсгээд програмчлах боломжтой гэсэн үг. (таны толгойд socket programming орж ирж байгаа байхаа)
    Энэ төвшний өгөгдлүүдийг зурвас буюу message гэж ярьдаг.
  2. Зөөврийн төвшин – Програм хооронд зурвас зөөдөг (Transport layer – махчилбал дамжуулах)
    Интернетийн сүлжээний хувьд энэ төвшинд нөгөө хоёр алдарт TCP, UDP хоёр орж ирнэ дээ. TCP нь тун найдвартай. Манай баруун монголчуудын “элчийн аманд өчих үг бий” гээд захиа илгээдэг шиг илгээсэн эзэн нь санаа зовохгүй унтаж болно. Харин UDP найдваргүй. Гай таарахгүй бол элчийн захиа хүрсэн ч байж болно. Гай таарвал элч дайсантай таараад захиа задарсан байж ч болно. Илгээсэн эзэнд тайван суухад хэцүү. Компьютерийн хувьд яахав бас сүртэй зардалтай биш тул юмыг яаж мэдхэв гээд дахин дахин ар араас нь адилхан зурвасаа илгээгээд байж болдог.
    Мэдээж SPX (Sequenced Packet Exchange) … гэх мэт өөр протоколууд бий. Амьдрал дээр Gateway, Content-Switch, Layer-4-7-Switch-үүдэд хэрэглэгддэг.
    Энэ төвшний өгөгдлүүдийг сегмент буюу segment гэж ярьдаг.
  3. Залгах төвшин – Хаягуудыг зааж өгдөг тул (Network layer – махчилбал сүлжээний төвшин)
    Энэ төвшин нь илгээсэн талын зөөврийн төвшний сегментүүдийг товлосон хаягийн залгах төвшний элементүүдэд нийлүүлэх үйлчилгээг үзүүлнэ. Яг л нөгөө утсаар хэн нэгэн рүү залгахдаа номероо хийдэг шиг энэ төвшин товлосон хаяглалтыг хийж өгдөг.
    Энэхүү төвшинд нөгөө алдарт IP протокол орж ирнэ. Үүнийг тайлбарлах хэрэггүй бизээ. ххх.ххх.ххх.ххх гээд л энд тэндгүй тайлбарласан харагддаг.
    Мэдээж IPsec, IPX, ICMP, IGMP, … гэх мэт өөр протоколууд бий. Амьдрал дээр Router, Layer-3-Switch-үүдэд хэрэглэгддэг.
    Энэ төвшний өгөгдлүүдийг датаграмм буюу datagram гэж ярьдаг.
  4. Сэргийллийн төвшин – Дамжуулалтад хянах код оруулж өгдөг (Link layer – махчилбал сувгийн төвшин)
    Энэ төвшин датаграмуудыг хост тус бүрийн залгах төвшин рүү дамжуулна. Эхээс товлосон хоост уруу биш замд таарах бүх зангилаа (хоост эсвэл рүүтэр) бүр дээр энэ төвшин зам заах үүрэг гүйцэтгэнэ. Тэгэхээр зангилаа бүр дээр мэдээлэл датаграмын төвшин хүртлээ задардаг гэж үзэж болно.
    Энэхүү төвшний протоколууд тухайн сүлжээний төрлөөс хамаараад янз бүр. Жишээлбэл Ethernet, WiFi, and the Point-to-Point Protocol (PPP) гэх мэт. Энэ төвшинд бит өгөгдлүүдээ блок блокоор багцалж checksum буюу шалгах кодууд багц бүрд бичиж өгдөг. Тиймээс би сэргийллийн төвшин гэж авав. Энэ өгөгдлийн алдагдлаас сэргийлэл нь TCP-гийн хяналтаас ялгаатай гэдгийг анхаарна уу.
    Энэ төвшний өгөгдлүүдийг фрейм (кадр ч гэмээр юм уу) буюу frame гэж ярьдаг. Амьдрал дээр Bridge, Switch -үүдэд хэрэглэгддэг.
  5. Физик төвшин (Physic layer)
    Энэ төвшин нь Сэргийллийн төвшний фреймүүдийг бит битээр нь нэг зангилаанаас нөгөө зангилаа руу нийлүүлэх үүрэг гүйцэтгэнэ. Энэ төвшний протоколууд нь сэргийллийн төвшинтэй адил сүлжээний төрөл дээр нэмээд дамжуулах хэрэгслээс хамаарна. Жишээлбэл
    twisted-pair copper wire, coaxial cable, single-mode fiber optics гэх мэт.
    Энэ төвшинд битүүд тухайн дамжуулах хэрэгслээс хамаараад янз бүрээр аргаар яаж ийгээд дамжигдана.
    Амьдрал дээр Repeater, Hub -үүдэд хэрэглэгддэг.

Оюутан хүн уншиж байгаа бол нэршлүүдийг багшийнхаа зааснаар орлуулж ойлгоорой.

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://cms.bolorsoft.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 ашигладаг.)
Болор форумын өгөгдлийн баазын загвар
Өгөгдлийн баазын загвар гаргаж явах нь тухайн бүтээгдэхүүнийг гаргасаны дараа арчилан сайжруулах, баримтжуулах зэрэгт онцгой ач холбогдолтой байдаг. Хэрэв та загвараа эхлэж гаргадаггүй бол өнөөдрөөс эхлэн үргэлж загвар гаргаж явж байгаарай.