Showing posts with label үбүнтү. Show all posts
Showing posts with label үбүнтү. Show all posts

2013/03/13

Windows DLL + Wine = Linux Program

Өнгөрсөн жил роботоор оффис цэвэрлүүлдэг төсөл дээр ажиллав. Тоос сорогч чирсэн (200 мянган евроны үнэтэй) хүн шиг том робот оффисийн өрөө болгоноор шагайгаад шал хаагуур халтар байгааг камер ашиглаж computer vision-ы тусламжтайгаар тогтооно. Хэдэн зуун өрөөтэй оффис цэвэрлэх тул цаг болон мөнгөө хэмнэж зөвхөн тэр халтар болсон хэсгийн л тоосыг нь сорно. Тоос сорсныхоо дараа цэвэрхэн болсон эсэхийг шалгана. Хэрвээ хэд хэдэн удаа тоос сорсон ч гэсэн цэвэрхэн болохгүй бол 3D scanner-аар тэр бохирдсон хэсгийг хэмжинэ. Энэ хэмжилтийнхээ тусламжтайгаар зүгээр будаг болсон толбо уу эсвэл бохь наалдсан овойж товойсон бохирдолт уу гэх мэтээр ангилаад мэдээллийн сан руу хийнэ. Сүүлд нь 7 хоногт нэг удаа ч юм уу цэвэрлэгч ирээд тэр мэдээллийн сан дээр хадгалагдсан арилдаггүй толбуудыг арилгана.

Надаа 3D scanner-аар хэмжилт хийх ажил нь оногдов. Цаанаас нь Shapescan3D хэмээх scanner өгөв. Зөвхөн Windows дээр ашиглаж болдог эд аж. API гээд нэг header файл болон DLL library дагаж ирсэн байлаа. Бид нар робот програмчлахдаа Robot Operating System (ROS) гэж middleware ашигладаг, тэр нь зөвхөн Ubuntu дээр л ажиллана. Тэгээд scanner-аа Ubuntu дээр хэрхэн ажиллуулах вэ гэж баахан толгойгоо гашилгав. IDA ашиглаж dissassemble хийж үзсэн болов ч туршлага дутаад олигтой амжилт олсонгүй. Wireshark ашиглаж scanner болон компьютер хоорондох communication-ийг чагнаж үзэв. Binary protocol ашиглаж байсан учир бас л сүртэй амжилт гаргасангүй.

Тэгээд аргаа бараад Wine ашиглахаар шийдэв. Урьд нь Wine ашиглаж Windows программ ажилуулж үзэж байснаас өөрөө программ бичиж DLL library дуудаж үзэж байгаагүй тул болох эсэхийг нь сайн мэдэхгүй байв. Scanner-дагаж A3DSensor.dll болон A3DSenshor.h гэж файлууд дагаж ирсний header нь иймэрхүү функцүүдтэй:


Энэ функцуудыг Wine ашиглаад Linux программаас дуудчихвал хамаг юм болчих гээд байлаа. Интернэтээс олсон энэ зааврын дагуу хийж үзэхээр шийдэв. Санасныг бодоход хялбар юм байна. DLL файлаа LoadLibrary method ашиглаж санах ойруу хуулаад GetProcAddress method-ын тусламжтайгаар дуудах гэж байгаа method-уудыхаа хаягийг олдог аж. DLL library-гаа ашиглаж дууссаныхаа дараа FreeLibray method ашиглаж санах ойноосоо буцааж устгана. Энэ гурван method гурвуулаа Windows-API.

Хамгийн түрүүнд DLL library-аа санах ойд ачааллана:


GetProcAddress method ашиглаж байгаа тул дагаж ирсэн header файлыг шууд ашиглаж болохгүй. Тиймээс бүх method-уудаа бага зэрэг өөрчлөөд дахиж шинээр зарлана. Жишээ нь


гэсэн method-ыг доорх байдлаар зарлана:


Дараа нь энэ method-ыхоо хаягийг олох хэрэгтэй:


Ингэснийхээ дараагаар method-уудаа яаг Windows дээр яаж ашиглах ёстой тэрэн шиг нь ашиглах боломжтой болно.

Программ бүтнээрээ:


Wine суулгахад wineg++, winegcc гээд compiler-ууд дагаж ирдэг. Энэ compiler-ыхаа тусламжтайгаар программаа build хийнэ:
wineg++ shapescan3d.cpp
Үүссэн программаа Linux дээр дуудхад ингэж гарч ирж байна:
$ ./a.out
Version: 2500

Яаг энэ аргаар бусад бүх method-уудаа зарлаад scanner-аа 100% Linux дээр ашиглаж болдог болгов. Wine ашигласны нэг сайн чанар нь бичиж байгаа программандаа Linux-API, Windows-API дураараа хольж болдог юм байна. Тэгээд бичсэн программ маань Linux программ гэхэд ч хэцүү Windows программ гэхэд ч хэцүү hybrid юм болвоо хөөрхий :)

2010/06/25

Үбүнтү/Дэбиан машинуудад ижил програм суулгах

Өмнөх сараачсан зүйлүүд дээр бяцхан чөтгөр дээрх суугдсан портуудыг хэрхэн нэг машинаас нөгөө машинд зөөвөрлөж болох талаар өгүүлсэн байдаг. Энэ хэсэгт би үбүнтү ба дэбиан машинууд дээр хэрхэн тэгж болдог тухай нэг сараачаадхая :)

За тэгэхээр эхлээд суугдсан пакетуудыг харах тушаал:

# dpkg --get-selections
ack-grep                                        install
acl                                             install
acpi                                            install
acpi-support                                    install
acpid                                           install
addressmanager.app                              install
adduser                                         install
aespipe                                         install
aisleriot                                       install
akonadi-server                                  install
alacarte                                        install
alien                                           install
alsa-base                                       install
alsa-oss                                        deinstall
alsa-source                                     install
alsaplayer-alsa                                 install
alsaplayer-common                               install
alsaplayer-gtk                                  install
anacron                                         install
anki                                            install
[...]

Ингээд дээрх тушаалыг ашиглан зэрэгцүүлэх машин дээрээ эхлээд пакет жагсаалт бэлдэнэ:

# dpkg --get-selections | grep -v deinstall > dpkg-get.txt

Одоо суулгах машин дээрээ файлаа хуулж тавиад дараах тушаалаар суулгана:

# dpkg --clear-selections
# cat dpkg-get.txt | dpkg --set-selections
# apt-get dselect-upgrade

Хэрэв эхний машины /etc/sources.list файл нь хоёр дахь машиныхтай зөрүүтэй бол адил болгох хэрэгтэйг анхаараарай.