2012-07-06

Android

Хуучны хобби

Хэсэг хугацаанд хувийн хоббигоор андройдыг жаал нухав. Java хэл дээр бичихгүй нэлээд удаж. Энэ хооронд дан python дээр бичиж байгаад гэнэт бичсэнийг хэлэх үү цэг таслал, хаалт, их хаалт, хувьсагчийн төрөл гээд маш их төвөгтэй санагдсаныг хэлэх хэрэгтэй. Python бол үнэхээр хялбар бичиглэлтэй юм байна. Бас дээр нь Ажиллуулаж турших, Eclipse + ADT + Emulator  маш их санах ой (2gb) хэрэглэж нэлээн нерв хөдлөгсөнийг эс тооцвол маш их дэвшил гарсаныг хэлэх хэрэгтэй. Гэхдээ дор хаяж 4gb ram тай байхгүй бол горьгүй юм байлээ. Өмнөх андройд программ хийж байсан үетэй харьцуулан анзаарсан зүйлүүдээ бичив.
Өмнөх програмыг хийхэд андройдын хувилбар тэр үед 1.6 байсан. Одоо 4.1 гээд гарч байх шиг байна.
Гол надад таалагдсан зүйл нь ADT энэ нь програмынхаа дэлгэцийг тун хялбархан өрөөд тавьчихдаг болсон байна. Өмнө нь энийг шууд XML дээр нь бичдэг байсан юм. Өрж тавих хэсэг нь ачаалал ихтэй бас алдаа ч нэлээд байсан. Одоо Emulator байхгүйгээр 300mb орчим memory хэрэглэж байна.

Дараагийн нэг зүйл нь өмнөх програмаа ажилуулаж үзэхэд асуудалгүй ажиллаж байгаа нь таалагдав. Уул нь тэр зураг яг дүүрээд таардаг байсын. Юм хөгжинө өө гэж :)

Яг дагнаж android дээр юм хийе гэж бодож байгаа бол ямар нэг Android утастай болсон нь хамаагүй цаг хэмнэх юм байлээ. 

2012-04-14

Python Metaclass


Энгийн байна гэдэг бол 
Маш олон асуудалыг шийдэх шидэт түлхүүр

Би ойрд ажил ихтэй код бичээд амралт багатай. Өлөө ирээд нухаж гарна орой болтол нухаад л байна. Гэдэг шиг ажил ихтэй завгүй талдаа л байна. Хавар цаг болоод олон хүмүүс хямралдаад за за хадуурлаа... гол хэсэгрүүгээ ороё.

Нэг сонирхолтой сэдэв нэлээд дээхэн үед Learning python гээд хальт нэг оньсого шиг юм бичсэн тэрний 1-р бичигдсэн Metaclass ийн хэрэглээний талаар товчхон ойлголт өгөх гэж оролдоё. Энэ аргийг маш өргөн хэрэглэж байгаа учраас зарим Framework ийн кодруу харж байгаад жишээ болгоод тайлбарлая. 

Django ийн талаар олон юм нурших нь илүү байх. Харин Django ийн forms.Form классыг бүгд мэдэх байх. Энэ нөхөр хэрхэн ажиллаж байгааг арай өөр өнцөгөөс харая.

Бид form class ийг бичихдээ ихэвчлэн дараах хэлбэрээр бичдэг. 

Loading ....


Энэ хэсэг бол ямар нэг илүү юм бичигдэхгүй тун жижхэн код байгаа. Хэрхэн ашиглах энэ сэдэвт хамаагүй учир орхилоо. 

Харин яаж ажиллаад байгааг нь тайлбарлая. Бидны класс forms.Form классаас удамшисан байгаа. Энэ классын зарлалт нь forms.py#L383 мөр дээр байгааг харж болно. Энэ класс нь BaseForm классаас удамшиж байгаа. Мөн нэг __metaclass__ гэсэн талбарт DeclarativeFieldsMetaclass утгыг өгсөн байгааг харж болно. 
Loading ....

Завсарлага 5 мин :)




DeclarativeFieldsMetaclass нь type классаас удамшиж байгаа энэ нь Python ийн үндсэн object классын үүсгэгч класс. энэ класс нь __new__ функцийг дахин тодорхойлож бүх талбарууд (attrs) дээр үйлдэл хийж байгааг харж болно. Энэ функ нь python ийн process үүсэх үед нэг удаа ажилладаж class төрлийн instance ийг үүсгэн бэлтгэж байгаа учираас классийн __init__ функцээс ялгаатай.

Loading ....


Дээрх кодын __new__ функц дотор get_declared_fields функцийн үр дүнг base_fields талбар үүсгэн хадгалаж байгааг харж болно. Энэ base_fields талбарийн хэрэглэж байгаа байдалийг BaseForm classын __init__ функц дотор  self.fields = copy.deepcopy(self.base_fields) гэсэн мөрийг анхаарах хэрэгтэй энэ нь яагаад copy хийж байгаа шалтгаанаа тайлбарлаж бичсэнийн анхааралтай уншаарай. Шалтгаан нь base_fields ийг шинэ Form instance -уудыг үүсгэх үед хэрэглэж байгаа учраас.

За товчхондоо metaclass ийг django дээр иймэрхүү байдалаар хэрэглэж байгаа. Энэ нь тухайн framework ийг хэрэглэж байгаа хүний бичих кодыг багасгах цэгцтэй болгох гэх мэт маш олон давуу талуудыг үүсгэж байгааг харж болно. Мөн Django ийн Model дээр metaclass хэрэглэж байгааг үзэж болно.

Цаашлаад metaclass-ийг удамшилуулах class уудын удамшилд хэрхэн нөлөөлөж байгааг хараахан ойлгож амжаагүй байгаа....