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

January, 2011Archive for

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 -с дутахааргүй хүчин чадал болон оновчтой болсон юмдаг.

Mercurial vs SVN

Saturday, January 15th, 2011

Mercurial болон SVN-г харьцуулан тавив.
Mercurial interaction
Энэ 2-г харьцуулахад тийм ч тохиромжтой биш. Учир нь нэг нь тархмал нөгөө нь төвлөрсөн удирдлагын системүүд юм. Өөр өөрийн давуу дутуу талтай. Гэхдээ яагаад би өөрийн төслүүдээ тархмал систем рүү шилжүүлсэн бэ гэвэл түүнийг төвлөрсөн удирдлагатай хэлбэрээр мөн ашиглаж болж буй явдал. Мөн дотоод болон төв агуулах руу бичих, авах (push, pull) болон дотоод агуулах руу бичих, авах (commit, checkout) гээд арай төвөгтэй мэт боловч тухайн тушаалуудыг commit дээр нь commit ба push давхар, pull дээр нь pull, checkout -г давхар хийдэг болгон тохируулж болж байгаа юм. (TortoiseHG дээр туршиж үзэв.) Ингээд ажиллагааны хувьд svn-с дутахгүй болов.
Mercurial interaction

  1. Mercurial-н хувьд бүх хөгжүүлэгчид дотоод агуулах нь байгаа тул хөгжүүлэгчийн тоогоор нөөц хувилбар байж байнаа гэсэн үг. Харин SVN-ы хувьд зөвхөн төв дээр л төслийн бүх түүх хадгалагдана. Сервер эвдрээ бол дуусаа.
  2. SVN/CVS-н хувьд merge хийхэд байнга зөрчил гарч үнэхээр мэдрэл барж ядаргаатуулдаг. Энэ тал дээр Mercurial/Git үнэхээр харьцуулашгүй диваажин. Шилжүүлэх хамгийн том гол давуу тал энэ л байлаа.
  3. SVN-ий хувьд сервер унах, интернэт тасалдах үед бидний хооронд солилцоо хийх нь боломжгүй болж байлаа. Харин mercurial-р ганц имэйл шидэлцээд солилцох боломжтой болов.
  4. SVN-ий хувьд trunk/tags/branches ялангуяа tags branch 2 толгой эргүүлээд ядаргаатай байдаг нь таалагддгүй байв.
  5. SVN-ий бүх лавлахад .svn үүсгэх нь үнэхээр тохиромжгүй байсан.
  6. Интернетэд хүчин чадлын хувьд git-г mercurial-c илүү гэсэн байсан ч миний хувьд сүйдтэй ялгаа мэдэгдээгүй бөгөөд харин ч mercurial нь маш олон IDE-д (Eclipse, NetBeans, Visual Studio …) холбогдсон бөгөөд виндовсийн хувьд TortoiseHG гэж сайхан багаж байсан нь mercurial-г сонгоход хүргэсэн билээ.

Distributed Version Control Systems

Tuesday, January 11th, 2011

За бүр аль 2003 оноос хойш хэрэглэж ирсэн CVS-ээ нүүлгэхгүй бол арай л биш болж эхэллээ. Ингээд Болорсофтод ажиллаж буй 2 залуутайгаа хамтран хөгжүүллээ эхлэх гэтэл интернет холболт нь арай л удаан байлаа. CVS-с BolorCMS бүрэн татагдаж чадалгүй тасарчихаад байх нь төвөг учруулах болсон тул тархмал хувилбар удирдлагын системүүдээс (Distributed Version Control Systems) сонголт хийх болов. Хамгийн түгээмэл git, mercurial, bazaar 3-с mericurial-г сонголоо. Учир нь энэ нь 3 системийн үндсэн зарчмууд ижил (бүгд DVCS) ба харин mericurial нь шинэхэн хэрэглэгчид илүү амархан мэт санагдав. Туршлагатай хүмүүстэй ажиллаж байхад хүнд хөнгөн нь хамаагүй арай тогтвортой сүрхийг нь бариад л туучихдаг байсан бол одоо Монголд төгссөн шинэхэн залуустай ажиллахад тэр арга барилаар явах боломжгүй болов. Тэд их сургуулиас Програм Хангамжийн Инженерчлэлийн ямар ч анхан шатны мэдэгдэхүүнгүй төгссөөр байгаа юм байна. “Програм Хангамжийн Инженерчлэлийн үндэс” гэсэн хичээл заахгүйгээр яаж Програм Хангамжийн Инженерүүд төгсгөөд байнаа монголын их дээд сургуулиудаа?! Эдийн засаг, эмнэлэг, хууль, математик гээд бусад бүх салбарт тухайн мэргэжлийнх нь үндэс гэсэн хичээл орохгүйгээр төгсгөдөг салбар монголын аль ч их сургуулиудад байхгүй л байх!!! Би 2006 онд Архангайд амарч байхдаа Батзолбоод багштай хууч хөөрч байгаад арай ч дээ одоо болтол заадаггүй юм бол тэр хичээлийг заагаач гэж сануулж л байсан. КМТС дээр Батзолбоо энэ өвлөөс эхэлж тэрхүү хичээлийг заана гээд надаас материал авч байсаныг бодоход зааж эхэлсэн байх гэж найдаж байна. Өөрөө уншиж байвал сэтгэгдлээр хариу өгнө байхаа. За сэдвээсээ хол хадуураад явчихлаа.
Сэдэв рүүгээр аажмаар оръё.
За тиймээс шинэ залуустайгаа зохицож ажиллахын тулд, бас ганц хоёр хүн удирдаж байгаа ухаантай юм болохоор нөгөө Чингис хаан мянгат/зуутын дарга сонгохдоо хамгийн бяр чадалтай баатрыг биш цэргээ хамгийн сайн удирдах чадвартай, цэргүүдийнхээ өлсөх ядрахыг нь сайн мэдэж тооцолдог хүмүүс сонгодог байсан гэдгийг санаад, шинэ хүмүүсээ аль болох ойлгож төвшинд нь тааруулж сонголт хийх нь зөв байх гэж үзэж сонголт хийдэг болж байна даа. За ямар ч гэсэн Mercurial нь git-с дутаад байх зүйл огт алга. Тушаалууд нь илүү ойлгомжтой юм. Мөн git-с ялгаатай нь энэ систем python дээр бичигдсэн (git харин С дээр) тул хөгжүүлэл нь илүү хялбар хурдан байх нь мэдээж. Суулгаад салаалуулах (branch), нэгтгэх (merge), import, checkout, update, checkin/commit хийх нөхөөс тавих (patch) зэргийг энэхүү 2 систем дээр туршиж үзэхэд хурдын хувьд сүйдтэй ялгаа мэдэгдсэнгүй. Тиймээс Mercurial!

Clean upgrade/reinstallation of debian/ubuntu with minimal effort

Monday, January 10th, 2011

Өнөөдөр нэг дебиан сервер нүүлгэх хэрэгтэй болов. Хэрэглэж байсан бүх програм хэрэглэгдэх бөгөөд харин эвдэрсэн зарим тохиргоо болон хэрэглэгчдийн хуучин өгөгдлүүдийг шилжүүлэх хэрэггүй байв. Тиймээс шууд имаж хийгээд хуулчихаж болохгүй байлаа. Ингээд нэлээн дээр үед хэрэглэж байсан нэгэн аргаа ашиглав.
Хэрэв та ашиглаж байгаа системээ шинэ сервер/компьютер рүү нүүлгэх хэрэг гарвал шинэ системээ минимал тохиргоогоор суулгаж байгаад дебиан/Үбүнтү -гийн хувьд дараах тушаалыг өгөөд л болно. Магадгүй нэлээн хэдэн жилийн өмнө би доорхи тушаалуудыг блогтоо бичиж байсан ч байж магадгүй. Мартсан тул юу ч гэсэн ахиад биччихлээ.

Суусан бүх програмын нэрийг дараах тушаалаар аваад
dpkg -l | awk ‘{print $2}’ > installed_packages.txt

шинэ систем рүүгээ installed_packages.txt -ээ хуулж байгаад дараах тушаалыг ажиллуулна.
apt-get install `cat installed_packages.txt`

Ердөө ингээд л болоо.

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 -үүдэд хэрэглэгддэг.

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