Sunday, June 13, 2010

Яахаа мэдэхгүй л байна

Надад ямар ч асуудал тулгараагүй, гэхдээ л ямар нэгэн зүйл хийх хэрэгтэй үе нь тулж ирчихээд байдаг.

Sunday, June 6, 2010

Код унших

Vim гэдэг хөгжүүлэгчийн хэрэгсэл хэрэглэсээр нэлээн удаж байгаа билээ. Харин "help" гэдэг хэсгээр нь зугаалж явж байгаад "tag" үүсгэх гэдэг хэсгийг нь оллоо маш хэрэгтэй эд байна.

ctags - команд нь ямар нэгэн хэл дээр бичигдсэн эх кодыг уншиж классын зарлагаа эсвэл функцийн зарлагаа глобал хувьсагч эд нарыг бүртгэж "tags" гэдэг нэртэй файлд бүртгэдэг. Ингэснээр vim ашиглаж байх үед ямар нэгэн мэдэхгүй класс, функц гарч ирвэл түүн рүү шууд үсрэх боломжийг олгодог. Хэрвээ суулгаагүй бол:

$ sudo apt-get install exuberant-ctags

Албан ёсны сайтынх нь хэлж буйгаар 41 хэлний синтаксийг уншиж чадна гэсэн байна.

#Одоо өөрийнхөө ажиллаж байгаа төслийнхөө хавтас руу орно.
$ cd your_project
#Си хэл дээр төслөө бэлдэж байлаа гэж бодъё тэгвэл бүх Си хэл дээр бичсэн эх кодуудыг
#ctags командаар бүртгэх хэрэгтэй.
$ ctags *.c
#tags гэсэн файл тухайн хавтас дотор үүсэх болно. Одоо vim рүүгээ ороод мэдэхгүй
#ямар нэгэн зарлагаа эсвэл функц дээр курсороо гүйлгэж очоод Ctrl+] дар.

Мэдээж өөр ямар нэгэн хэл хэрэглэж байгаа бол ар талын өргөтгөлийг нь дараах маягаар өөрчлөөд байх хэрэгтэй:

# Python хэлэнд
$ ctags *.py
# Ruby хэлэнд
$ ctags *.rb

гэх мэтчилэн. ctags команд дэд хавтсууд руу автоматаар орж бичдэггүй юм байна лээ. Тэгэхээр бүх директороос хайна гэвэл:

$ find . -name '*.py' -print | ctags -L -

Өмнө нь tags файл үүсгэсэн байгаад түүн дээр нэмж бичихээр бол "-a" горимыг тавьж өгөх хэрэгтэй. Си хэлний хувьд өөрийнх нь стандарт функцүүдийн тусламжийг авахаар бол "Shift+K" дарна. Стандарт функцийн мэдээллүүд нь ctags гэсэн файлд бүртгэгддэггүй.

Python хэлний хувьд Джанго фрэймворкийг ctags бүртгүүлчихвэл бүр амар.
$ find /usr/local/lib/python2.6/dist-packages/django/ -name '*.py' -print | ctags -L -
Дараа нь өөрийнхөө прожектийг бас бүртгүүлчих хэрэгтэй.
$ find my_project_directory -name '*.py' -print | ctags -a -L -
Одоо ингээд хэдэн файлуудын дунд ганцхан товч дараад л үсрээд байж дээ :) Буцаж үсрэхдээ Ctrl+O

Wednesday, June 2, 2010

Бууж өгье гэвэл зөндөө боломж байна, гэхдээ ганцхан л давж гарах боломж бий

Дөнгөж сая бараг уйлахаас цаагуур зүйл болоод өнгөрлөө. Тэгэхдээ алдлаа гээд уйлах гэсэн нулимс гардаггүй сонин юм. Ажлын компьютерээсээ зөөврийн компьютер луу нэвтэрч орчихоод явж байгаад дипломоо тэр чигээр нь устгачихваа. Зөөврийн компьютер маань үндсэн 2 партишнд хуваагдсан нэг нь өгөгдлөө хадгалдаг NTFS, нөгөөх нь яг ажиллагааны EXT4 дээр нь линукс суусан хоёр хэсэгтэй.

Азаар NTFS-ээ маунт хийж холбодог байсан учир энэ партишн тийм ч идэвхтэй биш устгасан өгөгдлүүд хэсэгтээ байж байдаг. Гэхдээ анхаараарай "Ямар нэгэн файл устахад дискэн дээрээс чинь файл устдаггүй, зөвхөн файлын бүртгэлд зориулсан орон зайгаас л бүртгэлийг нь устгадаг" тийм учраас түүнийг сэргээх найдвар бий.

Линукс үйлдлийн систем маань "ntfsundelete" гэдэг жижигхэн түүлтэй хамт ирдэг. Энэ түүлийн тусламжтайгаар сэргээж болно. Гэвч миний тохиолдолд энэ нь маш хүнд байсан. Манай ажлын ах маань Линукс дээрээс NTFS партишн дээрх өгөгдлийг устгавал сэргээх ямар ч боломжгүй сонссоноо хэлэхэд их айсан шүү. Энэ нь ч үнэний ортой юм билээ. Яагаад?

NTFS партишн дээрээс файлыг устгах үед түүний нэрийг нь хамт устгадаг. Ийм үед ямар нэртэй файл байж байгаад устгагдсан нь мэдэгдэхгүй.

sudo ntfsundelete /dev/sda5 -s -f

гэх үед бүх файлууд чинь гарч ирэх болно. Иймэрхүү:


38650 FR.. 100% 2007-10-16 83 <none>
38652 D... 0% 2008-08-23 0 <none>


Гарч ирж байгаа мэдээллийн хамгийн арын баганад файлын нэр байх ёстой боловч минийх дээр бүгд None байв. Эхний багана нь файлыг давтагдашгүй дугаарлаж байдаг inode, дараагийн багана нь файлын төрөл, арынх нь нас, тэр он сарыг нь мэдэхгүй юм байна. Бодвол үүсгэсэн өдөр байх. Харин дараагийнх нь хэмжээ байдаг.

Хэрвээ нас нь 0% гэж байвал авралгүй гэж ойлго. Тэгэхээр би өгөгдлөө устгаад дөнгөж удаагүй байсан учраас бүх 100%-тай файлуудыг авахаар шийдсэн. Тэгтэл 100%-тай 14890 файл байдгийм байна. Тэгээд л багшаасаа сурсан чаддаг шелл скриптээ бичив. Энэ бараг цаг шахуу ажилласан:

#Сэргээх боломжтой файлуудын ID-г шүүрдэж байна.

sudo ntfsundelete /dev/sda5 -s -f | grep "100%" | sed -re \
's/^[0-9]+ .*$/\1/g'> 100percentfiles

#Одоо сэргээх боломжтой файлуудынхаа нэрийг мэдэхгүй байсан учраас
#түүний id-гаар нь файл үүсгэж өгөгдлүүдийг нь оруулна:

while read x; do
sudo ntfsundelete /dev/sda5 -u -f -i $x -o $x
done < 100percentfiles

Ажиллах горимын үед -u гэдэг нь сэргээх, -o гаралтын файлыг заана, -f гэдэг нь хүчээр компьютерээ унтраасан үед гарч ирдэг, -i нь файлын id-г зааж байна. Зиак ингээд ажиллуулна. Ингээд 14890 ширхэг файл үүснэ. Бүгд дугаарлагдсан. Харин би яаж энэ дундаас диплом дээр хийсэн программаа олж авах уу? grep коммандыг ашигласан :)

Grep-ийг ашиглахын тулд маш сайн хүний санах ойтой байх хэрэгтэй. Ямар файл би устгасан билээ, гол файл нь main.py гэдэг нэртэй gst гэсэн модулийг импортолж байсан гээд л санаж гарваа. Тэгэхээр main.py гэсэн файл дотор
import gst

гэсэн мөр байж л байгаа.
$ grep -rE "import gst" .

гээд ажиллуултал:

Binary file ./22569 matches
Binary file ./21129 matches
Binary file ./20738 matches
Binary file ./20431 matches
Binary file ./22568 matches
...

гээд л 10 мөр файл олдсон мэдээлэл гарч ирсэн. Тэгээд файл болгоныг нь дэлгээд үзэж байтал нэг нь миний хайж байсан файл мөн болов. Файлын төгсгөл хэсэгт жаахан бинар мэдээлэл нэмэгдсэн байсан боловч би олох зүйлээ олсон шууд copy/paste. Тэгээд олсон файлаа дэлгээд үзтэл бусад импортууд.

import settings
import window_manager
...

гэх мэтчилэн ар араасаа хөврөв. Тэгээд л би утасны нэг үзүүрийг атгаад авсан. Ийм юм импортолж байсан юм чинь энэ файл чинь ийм класс дотор нь зарласан байх ёстой гээд л дахиад grep командаа ажиллуулаад нөгөө арван хэдэн мянган файл дундаас олоод атгасан жижиг утасны үзүүрээрээ дамжуулан бүгдийг нь би авсан юм. Хэрвээ бууж өгье гэвэл бууж өгөх олон шалтгаан байлаа "устгасан, файлын нэр нь устчихаж ..." . Твиттерчиддээ баярлалаа дэмжсэнд.