sobota, 11 grudnia 2010

Kompilacja KDE ze źródeł dla niewtajemniczonych

4 komentarze
Kilka dni temu postanowiłem zmierzyć się z wyzwaniem samodzielnej kompilacji KDE ze źródeł. To co po pierwszych próbach wydawało mi się niemal niemożliwe, ostatecznie okazało się nie tak skomplikowane jak sądziłem. Podstawowy błąd jaki robiłem na początku był taki, że kompilację uruchamiałem na starszym wydaniu Kubuntu 10.04. Jest to wersja o dłuższym okresie serwisowania (tzw. LTS - Long Term Support), więc byłem przekonany, że programiści KDE będą ją również wspierać w procesie kompilacji. Tak poza tym, to właśnie tą wersję miałem zainstalowaną na komputerze stacjonarnym i to był główny powód, dlaczego z niej skorzystałem. O problemach jakie wtedy napotkałem nie będę pisał, bo nie występowały one już w Kubuntu 10.10. Tutaj jedynym problemem było zainstalowanie wszystkich wymaganych zależności na potrzeby kompilacji.

Poniższy opis/poradnik powstał przy znacznym wykorzystaniu następujących materiałów dostępnych w Internecie:
Warto do nich zajrzeć w razie pojawienia się innych niż opisane w tym tekście problemów, lub jeśli będzie potrzeba bardziej dokładnego doczytania się co skąd się bierze, bo ja nie zawsze dokładnie to przedstawiam.
    Aktualizacja oprogramowania

    Kubuntu w podstawowej konfiguracji zawiera jedynie wpisy do przetestowanych repozytoriów, co do których w miarę jest pewność, że pakiety tam zawarte będą działać stabilnie. Nie ma dodanych tych, które zawierają rozwojowe i testowe wersje pakietów. One właśnie są potrzebne w momencie kompilacji KDE. Dodajemy zatem te repozytoria i instalujemy aktualizacje:
    sudo add-apt-repository ppa:kubuntu-ppa/backports
    sudo add-apt-repository ppa:kubuntu-ppa/beta
    sudo apt-get update
    sudo apt-get upgrade

    Nie wiem dlaczego, ale po wykonaniu tych kroków narzędzie do aktualizacji z Kubuntu poinformowało mnie (trzeba sprawdzić odpowiednią ikonkę w zasobniku systemowym koło zegara), że jeszcze nie wszystkie zostały zainstalowane. Instalujemy wszystkie aktualizacje, które zostały zaproponowane.

    Instalujemy dodatkowe pakiety

    Tak jak wspomniałem na początku tego wpisu, na potrzeby kompilacji wymagane jest zainstalowanie wielu dodatkowych pakietów. Poniższa lista została opracowana na podstawie oficjalnej dokumentacji kompilacji KDE pod Debiana i Ubuntu/Kubuntu: http://techbase.kde.org/Getting_Started/Build/KDE4/Kubuntu_and_Debian oraz na podstawie własnych doświadczeń zebranych podczas kilku prób kompilacji KDE.

    sudo apt-get install subversion git-core gcc g++
    
    sudo apt-get install build-essential xorg-dev cdbs debhelper cmake kdesdk-scripts subversion ssh xserver-xephyr doxygen dbus-x11 libxml2-dev libxslt1-dev shared-mime-info libical-dev libgif-dev libssl-dev libboost-dev libboost-program-options-dev libboost-graph-dev libgpgme11-dev libxine-dev libqimageblitz-dev libbz2-dev libdbus-1-dev libpam0g-dev libpcre3-dev libkrb5-dev libsm-dev libclucene0ldbl libclucene-dev libjpeg62-dev libxtst-dev xsltproc libxrender-dev libfontconfig1-dev automoc librdf0-dev libdbusmenu-qt-dev docbook-xsl docbook-xml libattica-dev libqt4-webkit-dev shared-desktop-ontologies libphonon-dev
    
    sudo apt-get install graphviz libqt4-dev libstreamanalyzer-dev libstrigiqtdbusclient-dev libxml2-utils libopenexr-dev libjasper-dev libenchant-dev libavahi-common-dev libaspell-dev libasound2-dev libldap2-dev libsasl2-dev libsmbclient-dev libxkbfile-dev libxcb1-dev libxklavier-dev libxdamage-dev libxcomposite-dev libbluetooth-dev libusb-dev network-manager-dev libsmbclient-dev libsensors-dev libnm-util-dev libusb-dev libcfitsio3-dev libnova-dev libeigen2-dev libopenbabel-dev libfacile-ocaml-dev libboost-python-dev libsvn-dev libsvncpp-dev libqt4-dev libqca2-dev libstreamanalyzer-dev libstrigiqtdbusclient-dev libcommoncpp2-dev libidn11 libidn11-dev libpci-dev libxss-dev libxft-dev libpoppler-qt4-dev libpolkit-agent-1-dev libpolkit-backend-1-dev libpolkit-qt-1-dev libspectre-dev
    
    sudo apt-get install kdesdk kdelibs5-dev kdebase-workspace-dev libakonadi-dev libsoprano-dev libkonq5-dev libv4l-dev
    
    sudo apt-get install flex bison libacl1-dev hspell

    Utworzenie nowego użytkownika

    Przed przystąpieniem do właściwego procesu kompilacji KDE, warto zadać sobie pytanie: w jaki sposób chcemy mieć dostęp zarówno do nowego środowiska pracy jak również do wersji stabilnej, której używaliśmy do tej pory? W Internecie można znaleźć wiele odpowiedzi na to pytanie, m.in.: skorzystanie z środowiska wirtualnego (np. VirtualBox) lub przełączanie głównej gałęzi struktury plików przy użyciu chroot. W tym poradniku zostanie opisane jeszcze inne podejście, które jest zalecane w oficjalnej dokumentacji KDE. Zostanie utworzony nowy użytkownik, na koncie którego zostanie przeprowadzona kompilacja i lokalna instalacja KDE. "Lokalna" w tym wypadku oznacza, że tylko ten użytkownik będzie mógł korzystać z tej wersji KDE.

    Tworzymy nowego użytkownika i dodajemy go do grup. Jeśli chcemy, aby użytkownik miał dostęp do trybu poleceń administratora (sudo) zamiast do grupy users dodajemy go do grupy admin.

    sudo useradd -m -G users,audio,video,cdrom,plugdev -s /bin/bash kde-devel
    sudo passwd kde-devel

    Logujemy się na konto właśnie utworzonego użytkownika:

    su - kde-devel

    Konfiguracja skryptów startowych

    Oficjalna dokumentacja zaleca, aby zaraz po zalogowaniu skonfigurować skrypty startowe w celu usprawnienia procesu kompilacji. Można to zrobić wykonując następujące czynności:
    • Robimy kopię zapasową oryginalnego pliku .bashrc:
      cp .bashrc .bashrc_backup
    • Ze strony http://techbase.kde.org/Getting_Started/Increased_Productivity_in_KDE4_with_Scripts/.bashrc kopiujemy zawartość przykładowego pliku .bashrc i wklejamy go do pliku .bashrc_KDE:
      nano .bashrc_KDE
    • Dodajemy do oryginalnego pliku .bashrc ładowanie pliku .bashrc_KDE:
      echo "source ~/.bashrc_KDE" >> ~/.bashrc
    • Wczytujemy ponownie zawartość pliku .bashrc, aby jego zawartość była widoczna również dla bieżącej sesji:
      source ~/.bashrc
    Konfiguracja narzędzia ''kdesrc-build''

    Na potrzeby kompilacji KDE najłatwiej skorzystać ze skryptu kdesrc-build, który można pobrać ze strony: http://kdesvn-build.kde.org/. Skrypt ten automatyzuje wiele zadań, takich jak pobieranie źródeł, przygotowanie i uruchamianie procesu kompilacji.

    Pobranie i konfigurację skryptu kdesrc-build wykonujemy za pomocą poniższych poleceń (na stronie projektu warto najpierw sprawdzić, czy nie ma nowszej wersji tego narzędzia):

    mkdir -p ~/kdesrc/kdesrc-build
    wget http://kdesvn-build.kde.org/releases/kdesrc-build-1.12.tar.bz2
    tar xjvf kdesrc-build-1.12.tar.bz2 -C ~/kdesrc/kdesrc-build/
    rm kdesrc-build-1.12.tar.bz2
    cp ~/kdesrc/kdesrc-build/kdesrc-build-1.12/kdesrc-buildrc-sample ~/.kdesrc-buildrc

    Uruchomienie procesu kompilacji:

    ~/kdesrc/kdesrc-build/kdesrc-build-1.12/kdesrc-build

    Domyślnie proces kompilacji jest uruchamiany w trybie zrównoleglonym (opcja -j programu make) w 2 procesach. Warto jednak pamiętać, że:
    • jeśli mamy 1 jeden rdzeń obliczeniowy to nie przyniesie to żadnego efektu;
    • w przypadku większej liczby rdzeni warto z nich skorzystać i uruchomić proces kompilacji z odpowiednio ustawionym parametrem make-options skryptu kdesrc-build. Przykład dla 4 procesorów:
    ~/kdesrc/kdesrc-build/kdesrc-build-1.12/kdesrc-build --make-options=-j4

    Problemy

    Podczas kompilacji pojawił mi się następujący komunikat o błędzie:

    Building phonon-git (3/15)
      Waiting for source code update.
      Source update complete for phonon-git: 0 files affected.
      Compiling...
      Build succeeded after 1 second.
      Installing phonon-git.
      Unable to install phonon-git!
      Overall time for phonon-git was 1 second.

    Warto podejrzeć co znajduje się w logach. U mnie odpowiedni plik znajdował się w następującej lokalizacji:
    cat ~/kdesvn/log/2010-12-05-03/phonon-git/install.log

    CMake Error at cmake_install.cmake:40 (FILE):
      file INSTALL cannot copy file
      "/home/kde-devel/kdesvn/phonon-git/qt_phonon.pri" to
      "/usr/share/qt4/mkspecs/modules/qt_phonon.pri".

    Wynika z niego, że pomimo przyjętych założeń o lokalnej instalacji KDE na koncie użytkownika kde-devel, instalator Photona próbuje umieścić coś w głównej strukturze plików. Można to wyłączyć edytując następujący plik:

    nano kdesvn/phonon-git/CMakeLists.txt

    i umieszczając w komentarzu tą linię (znajduje się ona na końcu pliku):

    #install(FILES qt_phonon.pri DESTINATION  ${QT_MKSPECS_DIR}/modules)

    Uwaga: Oczywiście nie mam pewności, czy to jest najlepsze z możliwych rozwiązań i czy później nie wpłynie to na błędy podczas używania nowego KDE. Najważniejsze jest jednak to, że kompilacja idzie dalej :-)

    Kompilujemy dodatkowe programy

    Skrypt kdesrc-build poza domyślnym zestawem modułów, które mogliśmy zobaczyć podczas jego działania, obsługuje jeszcze kilka, które domyślnie są wyłączone. Aby je włączyć do procesu kompilacji, należy wedytować poniższej wskazany plik i odkomentować potrzebne nam moduły:

    nano ~/.kdesrc-buildrc

    Zauważyłem jednak, że pewne moduły, które są tutaj umieszczone nie działają. Przykładem jest zestaw narzędzi developerskich KDE: kdevplatform, kdevelop, quanta. Problem z ich kompilacją wynika stąd, że ich kod nie jest dłużej dostępny w repozytorium subversion i został przeniesiony do repozytorium git. Mi osobiście zależało na tym, aby mieć te moduły skompilowane, dlatego poniżej znajduje się opis, jak można to zrobić samodzielnie.

    Zakładamy katalog, w którym będziemy umieszczać dodatkowe programy KDE, które będziemy samodzielnie kompilować:

    mkdir kdesoftware
    cd kdesoftware

    Pobieramy źródła programów związanych z KDevelopem:

    git clone git://gitorious.org/kdevelop/kdevplatform.git
    git clone git://gitorious.org/kdevelop/kdevelop.git
    git clone git://gitorious.org/kdevelop/quanta.git

    Tworzymy katalogi budowania:

    mkdir -p build/{kdevplatform,kdevelop,quanta}

    Uruchamiamy procedurę kompilacji i instalacji:

    cd ~/kdesoftware/build/kdevplatform/
    cmake -DCMAKE_INSTALL_PREFIX=~/kde/ ../../kdevplatform/
    make && make install
    
    cd ~/kdesoftware/build/kdevelop/
    cmake -DCMAKE_INSTALL_PREFIX=~/kde/ ../../kdevelop/
    make && make install
    
    cd ~/kdesoftware/build/quanta/
    cmake -DCMAKE_INSTALL_PREFIX=~/kde/ ../../quanta/
    make && make install

    Testowanie nowego KDE
    • Jeśli chcemy przetestować pojedynczy program z właśnie skompilowanego KDE, a zarazem nie chcemy uruchamiać całego środowiska, najlepiej skorzystać z narzędzia sux:
      sudo apt-get install sux
      sux - kde-devel
      dolphin
    • Aby przetestować działanie pełnego środowiska KDE wystarczy zalogować się na użytkownika kde-devel wybierając jako typ sesji na „Bezpieczne logowanie” i uruchomić program:
      ~/kde/bin/startkde
    •  Jeśli chcielibyśmy to zrobić „bardziej elegancko” najlepszym rozwiązaniem wydaje się przygotowanie nowego typu sesji, którą będziemy mogli wybrać podczas logowania. Należy w tym celu wykonać następujące operacje (jako użytkownik z prawami administracyjnymi):

      cd /usr/share/kde4/apps/kdm/sessions/
      sudo cp kde-plasma.desktop kde-plasma-trunk.desktop
      sudo nano kde-plasma-trunk.desktop

      Do pliku kde-plasma-trunk.desktop wklejamy poniższą zawartość:

      [Desktop Entry]
      Encoding=UTF-8
      Type=XSession
      Exec=/home/kde-devel/kde/bin/startkde
      TryExec=/home/kde-devel/kde/bin/startkde
      Name=KDE Trunk           
      Comment=The desktop made by KDE

      Teraz już podczas logowania zamiast tradycyjnej sesji KDE, wybieramy z listy sesję KDE Trunk.

    Podsumowanie
    Powyższy opis tak jak tytuł wskazuje, został przygotowany dla użytkowników początkujących lub średnio obeznanych z administracją i programowaniem w Linuksie. Domyślam się, że zaawansowani użytkownicy KDE znaleźli by tu kilka błędów, lub przedstawili bardziej zoptymalizowany proces kompilacji. Dla mnie najważniejszym jednak jest to, że kompilację udało mi się nie tylko rozpocząć, ale również zakończyć :-), co pozwala mi się czuć bardziej wtajemniczonym w obsługę tego systemu, aniżeli jeszcze kilkanaście dni temu.

    Zachęcam do zadawania pytań lub do wpisywania komentarzy, co można poprawić w powyższym poradniku. W razie problemów poszukiwanie odpowiedzi najlepiej zacząć od oficjalnej dokumentacji na stronie: http://techbase.kde.org/Getting_Started/Build/KDE4/Troubleshooting. Zostały tam opisane najczęstsze problemy i ich rozwiązania.

    czwartek, 18 listopada 2010

    Wygodna integracja Windows7 z Ubuntu za pomocą VirtualBoxa

    6 komentarze
    Pisałem ostatnio o konfiguracji lokalnego repozytorium pakietów na potrzeby sal dydaktycznych, którymi się opiekuję na Politechnice Krakowskiej. Na salach tych, o których mowa nie będzie zainstalowany jedynie Ubuntu, ale również Windows7. Aby ułatwić sobie dalszą pracę w zarządzaniu tym systemem, postanowiłem zainstalować go w maszynie wirtualnej stosując VirtualBoxa. Jest wiele innych narzędzi do wirtualizacji, jednakże po lekturze różnych porównań w Internecie przekonałem się właśnie do wyboru narzędzia firmowanego logo Oracle. Oczywiście poza moją wygodą w administracji obu systemami na raz, najważniejsza jest wygoda i prostota obsługi przez potencjalnych użytkowników, którymi są studenci różnych kierunków Wydziału Mechanicznego. Ilość osób, które przewija się przez te sale w 2 tygodniowym toku zajęć (tygodnie parzyste i nieparzyste) zdecydowanie przewyższa pół tysiąca osób. Fakt ten wymaga, aby na sali wszystko działało bez zarzutu.

    W tym poradniku chciałem przedstawić poszczególne kroki konfiguracji wirtualnej maszyny z Windows7 na potrzeby zajęć dydaktycznych. Na ile to będzie możliwe poszczególne czynności będą wykonywane za pomocą poleceń w konsoli, a nie za pomocą narzędzi graficznych.Takie podejście pozwala na pisanie skryptów, które potrafią znacznie ułatwić pracę w przypadku kiedy te same czynności należy wykonać kilka/kilkanaście razy.

    Jedną z najbardziej przydatnych, a niestety mało znanych funkcji VirtualBoxa, która zostanie omówiona jest możliwość zmiany trybu pracy dysku i przełączenie go w stan resetu danych po każdym wyłączeniu maszyny wirtualnej.

    Mam nadzieje, że przedstawione porady okażą się również przydatne dla typowego użytkownika komputera, a nie tylko dla osoby przygotowującej sale na zajęcia lub szkolenia.

    Czynności wstępne

    Na początek gorąco polecam zapoznać się z oficjalną dokumentacją narzędzia VBoxManage, które pozwala na wykonanie tych samych (a nawet więcej) czynności co ogólnie znany interfejs graficzny VirtualBoxa (strona dokumentacji tego narzędzia). Większość kroków w tym poradniku wykonanych jest za jego pomocą. Nie piszę jednak szczegółowych opisów dla poszczególnych poleceń, dlatego właśnie odsyłam do dokumentacji.

    Pierwszą czynnością administracyjną, którą polecam na początek jest przygotowanie dodatkowego użytkownika, którego możemy nazwać np. "windows". Docelowo dla tego użytkownika zostanie ustawione, aby zaraz po zalogowaniu do systemu startowała wirtualna maszyna z Windows7. Można oczywiście ten krok pominąć i skonfigurować sobie VirtualBoxa do pracy na obecnie używanym koncie użytkownika.

    Dodać nowego uzytkownika w Ubuntu możemy wybierając odpowiednio w menu:  
    System → Administracja → Użytkownicy i grupy → Dodaj.

    Instalacja VirtualBox
    Instalację VirtualBoxa najlepiej przeprowadzać zgodnie z oficjalnym opisem zamieszczonym na stronie: http://www.virtualbox.org/wiki/Linux_Downloads. W Ubuntu sprowadza się to do dodania odpowiedniego repozytorium, pobrania i dodania kluczy uwierzytelniających oraz instalacji następujących pakietów:
    sudo apt-get install virtualbox-3.2 dkms

    Utworzenie wzorcowej maszyny wirtualnej
    Przed stworzeniem pierwszej maszyny wirtualnej, która może być wzorcem do tworzenia kolejnych maszyn trzeba zalogować się na konto "windows" i tam uruchomić VirtualBoxa. Zaraz po zaakceptowaniu licencji można wyłączyć program.

    W tym momencie można jeszcze utworzyć katalog, który będzie współdzielony pomiędzy Ubuntu, a Windowsem:
    mkdir /home/windows/share

    Tworzenie maszyny wirtualnej można wykonać w prosty sposób w konsoli. Takie podejście zostanie tutaj omówione. Osobom, które nie chcą szczegółowo wgłębiać się w poszczególne parametry i czytać dokumentację VBoxManage, polecam jednak interfejs graficzny. Tam wygodny kreator poprowadzi nas za rękę i znaczną część pracy zrobi za nas w tle. Później dla przećwiczenia polecam przygotowanie odpowiednich poleceń konsoli, które zrobią dokładnie to samo, co wcześniej ustawiliśmy w narzędziu graficznym.

    Tworzenie wirtualnej maszyny dla Windows7 może składać się z następujących kroków:
    1. Utworzenie i automatyczne zarejestrowanie wirtualnej maszyny dla 32-bitowego Windows7:
      VBoxManage createvm --name Windows7_01 --ostype Windows7 --register
    2. Szczegółowa konfiguracja parametrów wirtualnej maszyny (szczegóły można doczytać w dokumentacji polecenia modifyvm):
      VBoxManage modifyvm Windows7_01 --memory 1780 --vram 40 --accelerate3d on --accelerate2dvideo on --boot1 dvd --boot2 disk --boot3 none --cpus 2 --pae on --hwvirtex on --largepages on --ioapic on --clipboard bidirectional --usb on --usbehci on
    3. Udostępnianie lokalnego katalogu dla zwirtualizowanego systemu:
      VBoxManage sharedfolder add Windows7_01 --name "share" --hostpath "/home/windows/share"
    4. Utworzenie kontrolerów IDE i SATA dla nośników danych:
      VBoxManage storagectl Windows7_01 --name "Kontroler SATA" --add sata --hostiocache on --controller IntelAhci
      VBoxManage storagectl Windows7_01 --name "Kontroler IDE" --add ide --hostiocache on --controller PIIX4
    5. Utworzenie i podpięcie dysku twardego (dysk rozszerzalny o maksymalnym rozmiarze 60GB):
      VBoxManage createhd --filename /home/windows/.VirtualBox/HardDisks/Windows7_01.vdi --size 60000
      VBoxManage storageattach Windows7_01 --storagectl "Kontroler SATA" --port 0 --device 0 --type hdd --medium /home/windows/.VirtualBox/HardDisks/Windows7_01.vdi
    6. Podłączenie napędu CD/DVD z włączoną funkcją zapisu (oczywiście ma to sens jeśli mamy nagrywarkę):
      VBoxManage storageattach Windows7_01 --storagectl "Kontroler IDE" --port 1 --device 1 --type dvddrive --medium host:/dev/sr0 --passthrough on
    Tak przygotowana maszyna powinna być już widoczna i gotowa do uruchomienia z poziomu okienkowego interfejsu VirtualBoxa.

    Zarządzanie VirtuaBoxem z poziomu konsoli
    Do innych czynności, które możemy wykonać w konsoli można zaliczyć:
    • Uruchamianie maszyny wirtualnej. Maszynę możemy uruchamiać na dwa sposoby:
      VBoxManage startvm Windows7_01
      VirtualBox -startvm Windows7_01
      Generalnie skutek wykonania obu poleceń będzie ten sam. Jedyną różnicą jaką ja zauważyłem jest uruchomienie zadania w tle przez pierwsze polecenie, w odróżnieniu od drugiego polecenia, gdzie wiersz polecenia oczekuje na zamkniecie programu VirtualBox. To drugie polecenie przyda się właśnie na etapie konfiguracji GDM (opis w dalszej części poradnika).
    • Rejestrowanie maszyny wirtualnej. Przydaje się szczególnie jeśli przekopiujemy maszynę na inny komputer i chcemy z niej korzystać.
      VBoxManage registervm /home/windows/.VirtualBox/Machines/Windows7_01/Windows7_01.xml
    • Wyrejestrowywanie. Jeśli maszyna nie będzie dłużej wykorzystywana na bierzącym komputerze, bo np. została przeniesiona na inny, warto ją usunąć z wewnętrznego rejestru maszyn wirtualnych VirtualBoxa.
      VBoxManage unregistervm Windows7_01
    Tworzenie kopii maszyny wirtualnej
    Kiedy mamy już przygotowaną wzorcową maszynę wirtualną z Windows7 i chcielibyśmy ją powielić na inne komputery, warto najpierw zmniejszyć rozmiar wirtualnego dysku. W tym celu należy wykonać dwie czynności:
    • Zerowanie pustych bloków na dysku w Windows7 (uwaga: dysk musi być w trybie normal, a nie immutable - tryby te opisane są w dalszej części poradnika). Pomocne w tej czynności będzie małe narzędzie sdelete, które można pobrać ze strony Technet Microsoft (link do narzędzia). W wierszu poleceń w systemie Windows wpisujemy:
      sdelete -c
    • Kompaktowanie dysku w VirtualBox. Stosujemy polecenie:
      VBoxManage modifyhd /home/windows/.VirtualBox/HardDisks/Windows7_01.vdi --compact
    Zabiegi te w moim wypadku pozwoliły na odchudzenie dysku wirtualnego z 9.4GB na 8.3GB. Ten 1GB potrafi zrobić różnicę podczas klonowania wielu dysków wirtualnych i ich późniejszego kopiowania na inne komputery.

    Kolejnym krokiem jest tzw. proces klonowania dysku. Jest to nic innego jak jego kopiowanie z nadaniem mu unikalnego identyfikatora.  
    VBoxManage clonehd /home/windows/.VirtualBox/HardDisks/Windows7_01.vdi /home/windows/.VirtualBox/HardDisks/Windows7_02.vdi --format VDI

    Na sam koniec, kiedy przekopiujemy katalog z ustawieniami maszyny wirtualnej oraz dysk wirtualny na inny komputer warto się upewnić, że są ustawione odpowiednie prawa dostępu dla użytkownika windows:
    sudo chown windows -R /home/windows/.VirtualBox
    sudo chgrp windows -R /home/windows/.VirtualBox

    Blokada dysków do zapisu
    Dyski w VirtualBoxie mogą pracować w różnych trybach zapisu (po szczegóły odsyłam do oficjalnej dokumentacji). Co ciekawe przełaczać się między tymi trybami można jedynie za pomocą narzędzia VBoxManage - okienkowa wersja tego nie umożliwia. Mnie osobiście poza standardowym trybem normal, zainteresował szczególnie tryb immutable, który nie zezwala na zapisywanie trwałych zmian na wirtualnym dysku. Dzięki temu po każdych zajęciach ze studentami, system Windows jest przywracany do pierwotnego, wzorcowego stanu.

    Technicznie działa to w ten sposób, że wszystkie zmiany jakie wprowadzi użytkownik podczas pracy w systemie zapisywane są na tak zwanym dysku różnicowym. Stan tego dysku jest resetowany po każdym wyłączeniu maszyny. W przypadku restartu maszyny stan nie jest kasowany, co ma zabezpieczać naszą tymczasową pracę na wypadek zawieszenia się systemu goszczącego (w tym wypadku Windows7).

    Do przełączania między tymi dwoma stanami najwygodniej będzie przygotować osobne skrypty:
    • Przejście z trybu normal do immutable:
      #!/bin/bash
      
      VBoxManage storageattach Windows7_01 --storagectl "Kontroler SATA" --port 0 --device 0 --type hdd --medium none
      VBoxManage modifyhd /home/windows/.VirtualBox/HardDisks/Windows7_01.vdi settype immutable
      VBoxManage storageattach Windows7_01 --storagectl "Kontroler SATA" --port 0 --device 0 --type hdd --medium /home/windows/.VirtualBox/HardDisks/Windows7_01.vdi
      
      echo `date`" : convert normal to immutable" >> vm_log.txt
    • Przejście z trybu immutable do normal:
      #!/bin/bash
      
      VBoxManage storageattach Windows7_01 --storagectl "Kontroler SATA" --port 0 --device 0 --type hdd --medium none
      VBoxManage modifyhd /home/windows/.VirtualBox/HardDisks/Windows7_01.vdi settype normal
      
      for file in `ls /home/windows/.VirtualBox/Machines/Windows7_01/Snapshots/*.vdi`
      do
        VBoxManage closemedium disk $file --delete
      done
      
      VBoxManage storageattach Windows7_01 --storagectl "Kontroler SATA" --port 0 --device 0 --type hdd --medium /home/windows/.VirtualBox/HardDisks/Windows7_01.vdi
      
      echo `date`" : convert immutable to normal" >> vm_log.txt
    W obu skryptach pierwszą i ostatnia czynnością jest odpowiednio odłączenie i podłączenie dysku do wirtualnego kontrolera SATA. W drugim skrypcie mamy dodatkowo odłączenie i skasowanie dysków różnicowych. Czynność ta zapewnia poprawną pracę w trybie normal i umożliwia wprowadzania dalszych zmian na wzorcowych dyskach wirtualnych (np. doinstalowanie kolejnych programów niezbędnych do zajęć).

    Konfiguracja GDM
    Do tej pory opisywane kroki należały raczej do standardowych czynności administracyjnych dotyczących zarządzania wirtualna maszyną VirtualBox. Jakiejś szczególnej wygody, o której jest mowa w tytule nie widać. Trzeba się zwyczajnie zalogować do systemu, uruchomić VirtualBoxa i wystartować maszynę z Windows7. Może nie jest to jakość szczególnie skomplikowane, ale każdorazowo wymaga wykonania kilku tych samych czynności. Aby to zmienić i nieco usprawnić uruchamianie Windowsa można przygotować specjalną sesja dla menadżera logowania GDM. Dzięki temu już podczas logowania użytkownik będzie mógł wybrać sesję z VirtualBoxem i automatycznym startem maszyny wirtualnej.

    Na początek tworzymy i edytujemy skrypt vm_start.bsh do uruchamiania maszyny wirtualnej:
    #!/bin/bash
    VirtualBox -startvm Windows7_01

    Później tworzymy nowy plik z ustawieniami dla sesji GDM:
    sudo touch /usr/share/xsessions/windows7.desktop
    sudo nano /usr/share/xsessions/windows7.desktop
    do którego wpisujemy takie ustawienia:
    [Desktop Entry]
    Encoding=UTF-8
    Name=Windows7
    Comment=Sesja skonfigurowana dla użytkownika "windows". Dla pozostałych nie działa.
    Exec=/home/windows/.VirtualBox/vm_start.bsh
    TryExec=/home/windows/.VirtualBox/vm_tools/vm_start.bsh
    Icon=
    Type=Application
    Teraz wystarczy się już wylogować i zalogować ponownie wybierając z listy sesję "Windows7". Powininna wystartować sama maszyna wirtualna bez startu sesji środowiska Gnome. Po wyłączeniu Windows w maszynie wirtualnej zamknie nam się również VirtualBox i zostaniemy automatycznie wylogowani z systemu.

    Logowanie bez podawania hasła
    Aby jeszcze bardziej ułatwić dostęp do Windowsa można wyłączyć konieczność podawania hasła przez użytkownika "windows". W tym celu logujemy się na konto z uprawnieniami roota i zmieniamy ustawienia użytkownika "windows" ustawiając opcję "Bez pytania o hasło przy logowaniu". Dzięki temu przy kolejnym logowaniu nie będzie trzeba podawać hasła i od razu wystartuje maszyna wirtualna. Warto również zwrócić uwagę, że dla użytkownika "windows" nie będzie już możliwości zmiany sesji na inną (nie pojawi się okienko wyboru sesji, tylko użytkownik od razu zostanie zalogowany).  Jeśli zależało by nam jednak na tym, aby znowu z poziomu użytkownika "windows" dostać do Gnome, w celu zmiany jakichś ustawień, to na powrót ustawiamy konieczość podawania hasła przez tego użytkownika. Można to również zrobić z linii komend poleceniem:
    • Logowanie bez podawania hasła:
      sudo usermod -a -G nopasswdlogin windows
    • Konieczność podawania hasła:
      sudo gpasswd -d windows nopasswdlogin 

    Problemy i rozwiązania
    Jedynym problemem jaki do tej pory spotkałem w korzystaniu z VirtualBoxa, było okresowe blokowanie się klawiatury w maszynie goszczącej. Zauważyłem, że dzieje się to zawsze po dłuższym czasie braku aktywności na komputerze, kiedy włączy się wygaszać ekranu w Ubuntu. Rozwiązanie oczywiście jest banalne - wystarczy wyłączyć wygaszać dla użytkownika "windows". W menu otwieramy kolejno: System → Preferencje → Wygaszacz ekranu i dla pewności ustawiamy:
    • Przejęcie w stan bezczynności po: 2 godzinach
    • Uruchomienie wygaszacza ekranu gdy komputer jest w stanie bezczynności: wyłączyć
    • Blokowanie ekranu, gdy wygaszacz jest aktywny: wyłączyć


    Podsumowanie
    Przedstawiony poradnik oczywiście nie wyczerpuje tematu konfiguracji VirtualBoxa w Linuksie. Nie jest to prawdopodobnie również jedyne rozwiązanie postawionych problemów, a pewne rzeczy może dało by się zrobić lepiej. Co sądzicie? Czekam na komentarze i spostrzeżenia z używania tego poradnika. Tylko proszę nie pisać do mnie per Pan, bo przecież nie jesteśmy na zajęciach, tylko na blogu :)

    piątek, 12 listopada 2010

    Konfiguracja lokalnego serwera pakietów Apt-Cacher NG

    1 komentarze
    W ostatnim czasie stanąłem naprzeciwko wyzwania szybkiej wymiany komputerów i oprogramowania na salach dydaktycznych, którymi się opiekuję na Politechnice Krakowskiej. Całościowy poradnik z przebiegu tej pracy przygotuję niebawem, jednakże już dzisiaj chciałem się podzielić doświadczeniami z konfiguracji lokalnego serwera pakietów Apt-Cacher NG.

    Jednym z systemów, który miał zostać zainstalowany na każdym z 20 nowych komputerów miał być Ubuntu 10.04.1 LTS w wersji 64 bitowej. Najpierw postanowiłem przeprowadzić próbną instalację na jednej z maszyn, a dopiero później na pozostałych. Nie wiem z jakich powodów, ale po instalacji systemu, instalacja dodatkowych pakietów, a raczej ich pobieranie z Internetu trwało ok. 3 godziny! Na to nie mogłem sobie pozwolić podczas właściwej instalacji, ponieważ na montaż sprzętu i instalację systemu przed pierwszymi zajęciami miałem niewiele więcej czasu. Dodam jeszcze, że instalator zakomunikował mi pobranie z Internetu ok. 350MB danych do aktualizacji.

    Sytuację udało się opanować dzięki skonfigurowaniu jednego komputera jako lokalnego systemu pakietów. Jego rolą miało być buforowanie (w slangu polsko-angielskim można by powiedzieć keszowanie ;-) ) pakietów pobranych z Internetu i udostępnienie ich innym maszynom w sieci lokalnej. W tym momencie w Ubuntu najłatwiej to osiągnąć stosując narzędzie Apt-Cacher NG (strona projektu). Poniższy poradnik udało mi się przygotować na podstawie kilku materiałów z Internetu, do których odsyłam w razie problemów:

    Konfiguracja lokalnego serwera pakietów

    Uaktualniamy lokalną bazę repozytoriów i pobieramy najnowsze aktualizacje:

    sudo apt-get update
    sudo apt-get upgrade

    Instalacja narzędzia apt-cacher-ng z repozytorium:

    sudo apt-get install apt-cacher-ng

    Konfiguracja serwera i klientów

    Uwaga: Należy pamiętać o właściwym ustawieniu adresu IP lokalnego serwera pakietów. Ja używam IP: 192.168.120.102. Należy go oczywiście zmienić na własny.
    • Konfigurujemy system pakietów apt (aplikacje apt-get, aptitude i inne), aby używał apt-cacher-ng:

      sudo echo 'Acquire::http { Proxy "http://192.168.120.102:3142"; };' | sudo tee /etc/apt/apt.conf.d/01apt-cacher-ng-proxy

      Możemy to oczywiście wyłączyć poleceniem:

      sudo rm /etc/apt/apt.conf.d/01apt-cacher-ng-proxy

    • Konfiguracja Synaptic z konsoli:

      Uwaga: Jeśli pracujemy na nowym komputerze zaraz po instalacji, należy najpierw uruchomić na nim Synaptica i odświeżyć listę pakietów. Można to zrobic również przez ssh łącząc się z opcją -X.

      sudo grep --color -i 'proxy' /root/.synaptic/synaptic.conf || sudo nano /root/.synaptic/synaptic.conf

      zamieniamy ostatnią linijkę, czyli znaki: ”};” na:

      useProxy "1";
        httpProxy "192.168.120.102";
        httpProxyPort "3142";
        ftpProxy "192.168.120.102";
        ftpProxyPort "3142";
        noProxy "";
      };

      Sprawdzamy jeszcze raz, czy wprowadzone zmiany znajdują się w pliku:

      sudo grep --color -i 'proxy' /root/.synaptic/synaptic.conf

    • Wczytujemy ponownie listę pakietów:

      sudo apt-get update

    Import lokalnych plików instalacyjnych

    Uwaga: Poniższe czynności wykonujemy tylko na serwerze!

    W tym kroku zostaną zaimportowane lokalne pliki *.deb do repozytorium apt-cacher-ng. Dzięki temu narzędzie apt-cacher-ng nie będzie pobierać ponownie już raz pobranych plików.

    test -x /var/cache/apt-cacher-ng/_import || sudo mkdir -p -m 2755 /var/cache/apt-cacher-ng/_import
    sudo mv -uf /var/cache/apt/archives/*.deb /var/cache/apt-cacher-ng/_import/

    Rozpoczynamy importowanie uruchamiając skrypt znajdujący się w dostarczonym panelu kontrolnym: http://localhost:3142/acng-report.html?doImport=Start+Import#bottom

    Panel kontrolny i dostęp do dokumentacji

    Twórcy narzędzia Apt-Cacher NG przygotowali bardzo prosty panel kontrolny (Dashboard), w którym użytkownik może zobaczyć statystyki z jego działania. Jest on dostępny pod adresem: http://localhost:3142/acng-report.html.

    Warto również zajrzeć do oficjalnej dokumentacji, która po instalacji pakietu będzie znajdować się w poniższej lokalizacji (można kliknąć link i otworzyć w przeglądarce): file:///usr/share/doc/apt-cacher-ng/html/index.html.

    Własne spostrzeżenia

    Już teraz, po pierwszych próbach muszę przyznać, że narzędzie to oszczędziło mi sporo czasu i oczywiście sporo nerwów (oczekiwanie na zakończenie aktualizacji, lub też na instalację dodatkowych programów niezbędnych do zajęć, potrafi być stresujące, jeśli te zajęcia rozpoczynają się za kilka minut). Dla przykładu pobranie aktualizacji na 20 maszynach z Ubuntu, nie trwało tak jak wcześniej wspominałem 3 godziny, a zaledwie 2 minuty. Taką różnicę naprawdę się czuje :-)

    Poza aktualizacjami zainstalowałem też kilkanaście dodatkowych pakietów. Nie wiem ile to było MB dla jednego komputera, ale wiem ile to było w sumie dla wszystkich. Poniżej załączam zrzut ekranu z Panelu kontrolnego, prezentujące statystyki pobrań pakietów z lokalnego serwera pakietów:



    Jak widać ok. 16 GB! danych zostało pobranych z lokalnego serwera pakietów. Jestem przekonany, że fakt ten tak samo cieszy (a może bardziej) administratorów naszej uczelnianej sieci i oczywiście administratorów głównych serwerów pakietów dla Ubuntu.

    Pozostałe uwagi i spostrzeżenia przedstawiam już w skróconej formie:
    • Idea działania Apt-Cacher NG jest taka, że po instalacji danego pakietu z dowolnego komputera w sieci lokalnej, pakiet ten powinien być już dostępny dla innych maszyn na serwerze. Ja jednak dla pewności przyjąłem taką strategię, że dany pakiet najpierw instaluje na serwerze, a później na wszystkich klientach na raz.
    • Wydawać by się mogło, że importowanie pakietów trzeba wykonać tylko raz. Jednak zdarzyło mi się już kilka razy, że niektóre pakiety pomimo pierwszej instalacji z głównego serwera, znowu były z niego pobierane jeśli instalowałem go ponownie na innej maszynie. Po zauważeniu takiego faktu, warto ponownie zaimportować pakiety.
    • Wyliczanie statystyk transferu przez panel kontrolny potrafi zawiesić Apt-Cacher NG. Ostatnio 2-krotnie po uruchomieniu ich zliczania Apt-Cacher NG przestawał odpowiadać na zapytania maszyn klienckich. Możliwe, że po prostu nie radził sobie z analizą logów i gdzieś się zawieszał. 
    Moim zdaniem Apt-Cacher NG jest narzędziem jak najbardziej godnym polecenia.

      niedziela, 12 września 2010

      Nowe witryny po wakacjach

      0 komentarze
      Na moim blogu w czasie wakacji (jak również wcześniej) niewiele się działo. Nie oznacza to wcale, że moja aktywność w sieci została zupełnie zawieszona. Korzystając z odrobiny wolnego czasu, którą udało mi się znaleźć pomiędzy innymi obowiązkami, uporządkowałem uprzednio prowadzone Wiki (nie podaje linku, ponieważ zostanie ono niedługo wyłączone) i przygotowałem dwie nowe witryny:

      Moje zainteresowania naukowe i realizowane projekty [link]
      Strona zawiera opis moich zainteresowań naukowych oraz zestawienie programów, które udostępniłem jako Open Source.
      Aby dotrzeć do szerszego grona odbiorców jest ona prowadzona w języku angielskim.
      Materiały dydaktyczne, kursy, poradniki [link]
      Tutaj będą umieszczane wszystkie materiały dydaktyczne, które przygotowuję na potrzeby prowadzonych przeze mnie zajęć.
      Dodatkowo, planuję umieścić na niej inne opracowania (np. poradniki techniczne), które do tej pory pisałem do własnych celów.
      Obie witryny pomimo tego, że mają opracowaną strukturę treści, to zawierają tylko część materiałów, które docelowo planuję tam umieścić. Obie również prowadzone są w oparciu o mechanizm Wiki, dlatego treść nie zawsze będzie kompletna i dopracowana (teksty redaguję bezpośrednio na tych stronach, a nie wklejam gotowe z zewnętrznych edytorów).

      Mam nadzieje, że będą one ciekawym uzupełnieniem dla obecnych (i przyszłych) czytelników bloga.

      wtorek, 31 sierpnia 2010

      Moduły GUI do anlalizatora obrazu Pandore - Łączenie segmentów

      0 komentarze
      Pełny kod źródłowy
      Korzystając wyłącznie z algorytmu działów wodnych podczas segmentacji obrazu trudno uzyskać zadowalające efekty. Algorytm ten zależy nie tylko od ilości i położenia punktów startowych, ale również od obrazu wskazującego krawędzie. Jak można było przeczytać (i zobaczyć) w poprzednim wpisie, często dla obrazów o zróżnicowanym tle i niejednorodnych obiektach ilość segmentów jest znacznie wyższa od tej, którą byśmy sami wskazali. Warto zdawać sobie sprawę, że wskazane problemy w podobnym stopniu dotyczą wszystkich algorytmów segmentacji. Dlatego, aby poprawić jakość wyników celowe może się okazać wprowadzenie kolejnego etapu przetwarzania obrazu. Najczęściej stosuje się różnego rodzaju metody łączenia segmentów, tak aby ich wielkość lepiej odpowiadała wielkości rzeczywistych obiektów. Na szczęście analizator obrazu Pandore posiada zestaw popularnych operatorów służących do tego celu. Jednak są to operatory bez graficznego interfejsu użytkownika, przez co ich stosowanie może być kłopotliwe zarówno dla nowego użytkownika, który musi nauczyć się składni poszczególnych poleceń, jak również dla bardziej doświadczonego użytkownika, których od razu chce zobaczyć efekty ich działania po zmianie odpowiednich parametrów. Dlatego, podobnie jak w przypadku działów wodnych, przygotowałem graficzny interfejs, który ma ułatwiać korzystanie z operatorów łączenia segmentów dostępnych w Pandore. Jego pełny kod źródłowy na licencji BSD został umieszczony w publicznym repozytorium na GitHub.

      Interfejs użytkownika

      Okienko programu podobnie jak w przypadku modułu działów wodnych zostało podzielone na dwie części: panel opcji i ramkę wyświetlającą obrazy wejściowe lub wyniki działania wybranego algorytmu. Obrazy wejściowe mogą zostać otwarte za pomocą menu [File]. Mamy tutaj do wyboru następujące opcje:
      • [Open oryginal image] - otwarcie oryginalnego obrazka, który służy jedynie do prezentacji wyników,
      • [Open image for computation] - otwarcie obrazka, na podstawie którego będą wykonywane obliczenia spójności sąsiednich regionów; obraz ten warto wcześniej przygotować (można np. usunąć szum),
      • [Open prelabeled image] - poindeksowany obraz segmentów przygotowany za pomocą algorytmu działów wodnych lub innego algorytmu segmentacji.

      Każdy z obrazów wejściowych jest wyświetlany automatycznie po otwarciu. Można je oczywiście w każdym momencie obejrzeć korzystając z ramki [Display] na panelu opcji. Poza wyświetleniem obrazów wejściowych w oryginalnej formie (3 pierwsze obrazki na rysunku poniżej), dodano jeszcze trzy opcje prezentujące w sposób graficzny wyniki łączenia segmentów (3 kolejne obrazki na rysunku poniżej):
      • [Color labeled image] - dla każdego segmentu zostaje przypisany losowy kolor; jeśli wybrane kolory nie są najlepiej dobrane można losować do skutku,
      • [Image with transparen labels] - kolorowe segmenty nanoszone są na obraz wejściowy; użytkownik ma możliwość zmiany ich przezroczystości,
      • [Image with border of labels] - na obrazie oryginalnym zaznaczane są kontury segmentów; istnieje możliwość określenia koloru.

      Możliwości

      W chwili obecnej program zawiera prawie wszystkie operatory łączenia segmentów dostępne w Pandore. Nie ma na razie operatora pmumfordshahmerging, który ma inną strukturę parametrów wywołania w porównaniu do pozostałych operatorów. Listę dostępnych w programie operatorów można zobaczyć na rysunku poniżej. Są to odpowiednio:pcontrastmerging, pentropymerging, pmeanmerging, puniformitymerging, pvariancemerging, pboundarymerging, phistomerging (wymieniam ponownie dodając odnośniki do oficjalnej dokumentacji).


      Wybór określonego algorytmu powoduje jego automatyczne uruchomienie, a co zatem idzie wyświetlenie wyników jego działania. Dla każdego algorytmu dostępny jest opis jego działania (przycisk [?]) pochodzący z oficjalnej dokumentacji Pandore (pomoc jest on-line, dlatego do jej działania wymagane jest aktywne połączenie z Internetem). Dostępne są również podpowiedzi na suwakach opcji [Number of merging] i [Threshold].


      Opisany interfejs działa w trybie pełnej interakcji. Zmiana algorytmu lub jego parametrów skutkuje natychmiastowym wyświetleniem wyników. Na szybkich komputerach sprawdza się to bardzo dobrze. Na starszych maszynach czas oczekiwania może być zauważalny.

      Sposób działania opisanego programu można prześledzić na dołączonym filmie video.

      środa, 11 sierpnia 2010

      Moduły GUI do anlalizatora obrazu Pandore - Działy wodne

      0 komentarze
      Pełny kod źródłowy
      Analizatora obrazu Pandore używam już od dłuższego czasu. Pomimo tego, że do większości zadań pisanie skryptów w konsoli jak najbardziej mi odpowiada, to czasami brakuje mi okienkowego interfejsu użytkownika, który mógłby przyspieszyć poszukiwanie optymalnych parametrów, dla poszczególnych operatorów. Częściowo w takich sytuacjach można posłużyć się interfejsem Ariane, o którym pisałem jakiś czas temu. Niestety każdorazowa edycja parametrów zapisanych w bloczkach i późniejsze wyświetlenie wyniku wymagają kilku kliknięć, a to wcale nie przyśpiesza pracy. Dlatego postanowiłem napisać własne (mini) programy, aby jeszcze bardziej usprawnić interakcję z użytkownikiem. Korzystając z biblioteki Qt, przygotowałem dwie aplikacje (możliwe, że pojawi się więcej), które bardziej szczegółowo opiszę w tym i następnym wpisie. Pełny kod źródłowy na licencji BSD został umieszczony w publicznym tepozytorium na GitHub.

      Pierwsza aplikacja (używam też nazwy moduł GUI) została poświęcona algorytmowi Działów wodnych. Jej celem jest nie tylko uruchomienie tego algorytmu, ale również odpowiednie przygotowanie danych wejściowych. Dla niewtajemniczonych przypomnę, że algorytm ten umożliwia segmentację obrazu - rozbicie na obszary, które powinny odpowiadać rzeczywistym obiektom. Jego działanie zależy od właściwego przygotowanie obrazów wejściowych. Jednym z nich powinien być obraz wskazujący punkty (lub obszary) startowe, od których rozpoczyna się proces tzw. zalewania. Drugi obraz określa obszar i kierunek, w którym to zalewanie następuje (więcej na ten temat poniżej).

      Interfejs użytkownika

      Okienko programu zostało podzielone na dwie części - lewa zawiera panel opcji, natomiast prawa podgląd obrazów wejściowych lub wyniki segmentacji. Obraz po wczytaniu (menu [File][Open oryginal image]) można poddać operacji negatywu [Invert] lub rozmyciu [Blur]. Ta druga operacja jest szczególnie zalecana ponieważ usuwa nadmiar szumu z obrazu, a tym samym zmniejsza ilość wynikowych segmentów. Następna opcja na panelu [Show] pozwala obejrzeć obraz, na podstawie którego wyliczany jest obszar zalewania (opcja [Image for computations]). Obraz ten można przygotować na dwa sposoby (panel [Set image for computations]):
      • Obraz gradientowy [Gradient image] - wskazuje na granice obiektów,
      • Mapa odległości [Distance map] - określa odległość od wcześniej obliczonych obiektów z wykorzystaniem opcji [Binary image] na panelu [Set initial image].
      Punkty startowe [Show][Initial image] dla algorytmu działów wodnych można wyznaczyć na kilka sposobów (panel [Set initial image]):
      • Lokalne minima [Local minimum point] - punkty, których wszystkie sąsiednie punkty mają wyższe wartości,
      • Obraz binarny [Binary image] - każdy obiekt jasny (biały) będzie podstawą do zbudowania osobnego segmentu,
      • Ręczne zaznaczenie obszarów startowych [Marker].

      A teraz krótko, co jest pod maską aplikacji, czyli jakie operatory Pandore są używane:

      Możlwości

      Poniżej zostaną wskazane przykładowe sposoby wykorzystania aplikacji. Nie każda kombinacja omówionych powyżej opcji ma sens, dlatego posłużę się dwoma różnymi obrazami - obrazem naturalnym przedstawiającym chłopca w kapeluszu (przykład 1 i 2) i obrazem pokazującym kilka podobnych elementów (przykład 3, 4 i 5).

      1. Automatyczna segmentacja obiektów.
      • obraz do obliczeń: [Gradient image]
      • punkty startowe: [Local minima point]

      Komentarz: Pomimo rozmycia obrazu filtrem Gaussa o wartości sigma = 1,1 otrzymano znaczne rozdrobnienie segmentów. Dalsze zwiększanie tej wartości skutkowało powstawaniem błędnych obiektów, które zawierały fragmenty dwóch obiektów.

      2. Manualna segmentacja obiektów.
      • obraz do obliczeń: [Gradient image]
      • punkty startowe: [Marker]

      Komentarz: Zastosowanie obrazu gradientowego i manualnie wskazywanych znaczników (markerów) pozwala na poprawną segmentację obiektów.

      3. Wyznaczenie strefy wpływu poszczególnych obiektów.
      • obraz do obliczeń: [Distance map]
      • punkty startowe: [Binary image]

      Komentarz: Algorytm działów wodnych może służyć do wyznaczenia tzw. strefy wpływu poszczególnych obiektów. W tym celu należy wykonać binaryzację obrazu (tutaj wartość progowa wynosiła 100) i policzyć mapę odległości.

      4. Automatyczna segmentacja obiektów.
      • obraz do obliczeń: [Gradient image]
      • punkty startowe: [Binary image]

      Komentarz: Korzystając z wcześniej przygotowanego obrazu binarnego i obrazu gradientowego można wyznaczyć granice obiektów. Niestety został pominięty jeden element na obrazie. Powodem tego jest brak punktu startowego wskazującego tło. Można to oczywiści rozwiązać w podejściu automatycznym, jednak aplikacja nie ma na razie takiej opcji. Jak to zrobić za pomocą Pandore, opiszę niebawem.

      5. Manualna segmentacja obiektów.
      • obraz do obliczeń: [Gradient image]
      • punkty startowe: [Marker]

      Komentarz: Wskazany powyżej problem można oczywiście rozwiązać poprzez manualne zaznaczenie wszystkich obiektów i tła.

      Aby prześledzić sposób obsługi programu zachęcam do obejrzenia krótkiego filmu. Zostały na nim jeszcze raz pokazane wszystkie opisane przed chwilą przypadki użycia, co powinno jeszcze lepiej przybliżyć czytelnikowi możliwości jego działania.

      piątek, 23 lipca 2010

      Zbiory ogólnodostępnych obrazów medycznych

      0 komentarze
      Trudno zajmować się przetwarzaniem obrazów medycznych, nie mając dostępu do takich danych. Najlepiej oczywiście mieć stalą współpracę z dużym szpitalem, który ma dobrze zorganizowany zakład radiologiczny lub też mieć znajomego lekarza, który z chęcią podzieli się takimi obrazami i dodatkowo wskaże problem badawczy. Jeśli jednak nie mamy tego szczęścia, to nic straconego, ponieważ zawsze można skorzystać z publicznie dostępnych zbiorów w Internecie. Do ich poszukiwania skłoniła mnie potrzeba lepszego przetestowania algorytmu nad którym ostatnio pracowałem, a do tej pory miałem do dyspozycji jedynie kilkanaście obrazów.

      Poniższa lista nie zawiera opisu baz danych - tego jak i przez kogo zostały organizowane. Zawiera jedynie praktyczne wskazówki odnośnie możliwości dostępu do tych danych i ich wykorzystania we własnej pracy (ograniczenia licencyjne). Pozostałe informacje można znaleźć nie tylko na wskazanych stronach, ale również przy poszczególnych obrazach (jak i gdzie zostały zrobione).
      • Casimage - jedna z najstarszych baz danych, liczy ok. 10 000 obrazów. Sprawia wrażenie już nie rozwijanej (linki do strony organizatorów nie działają). Brak jednego archiwum danych. Dostęp jest możliwy przez interfejs WWW. Obrazy można pobierać indywidualnie. Na szczęście obrazy umieszczone są na serwerze począwszy od pliku 0 do 9735. Dzięki temu można szybko pobrać je korzystając z przygotowanego przeze mnie skryptu [linux, wget]:

        for i in $(seq 9735); do wget "http://pubimage.hcuge.ch/4DCGI/FULLIMAGE/$i"; echo $i; done
        Niestety nie wszystkie pliki chcą się od razu pobrać, dlatego polecam kilkukrotne uruchomienie nieznacznie zmodyfikowanej wersji poprzedniego skryptu:

        #!/bin/bash
        for i in $(seq 9735)
        do
          if [ ! -f $i ]
          then
            wget "http://pubimage.hcuge.ch/4DCGI/FULLIMAGE/$i";
            echo $i;
          fi
        done
      • RSNA - zbiór baz danych zorganizowanych przez Stowarzyszenie Radiologów Ameryki Północnej. Dostęp do wielu medycznych baz danych za pomocą interfejsu WWW.
      • MyPacs - prawdopodobnie największy (ok. 120 000) publicznie dostępny zbiór obrazów medycznych. Dostęp przez interfejs Flash, bez możliwości pobierania danych. Możliwość taka jest po przełączeniu się do uproszczonego trybu html.
      • MedGift - demo systemu wyszukiwania obrazów MedGift, który bazuje na innym systemie, a mianowicie: Gift. Dane pochodzą prawdopodobnie z bazy Casimage. Zaletą tego systemu jest możliwość szybkiego stworzenia zbioru podobnych obrazów, co w przypadku pozostałych baz trzeba zrobić samemu (lub można skorzystać z zaproponowanego podziału na kategorie).
      • MedPix - druga co do wielkości baza obrazów. Dostępny interfejs WWW utrudnia pobieranie obrazów (zablokowany prawy przycisk myszy). Można się jednak do nich dostać przez Google Images (link do wyszukiwania). Niestety obrazki mają dodane wizualne adnotacje, co jeszcze bardziej utrudnia swobodne ich przetwarzanie.
      • IRMA - zbiór ok. 15 000 obrazów podzielonych na ok. 200 kategorii. Dostęp do archiwum z plikami możliwy jest po podpisaniu warunków użycia (do zastosowań naukowych, nie komercyjnych, bez możliwości udostępniania pełnego zbioru dalej) i przefaksowaniu na podany adres.
      • ImageCLEF - ok 80 000 obrazów, dostępnych prawdopodobnie w postacie jednego lub kilku archiwów. Obrazy pochodzą m.in. z bazy IRMA, Casimage. Warunki użycia są podobne jak w przypadku bazy IRMA, tylko muszą one zostać podpisane przez osobę na stanowisku kierowniczym w jednostce naukowej.
      • Midas - baza danych pod patronatem firmy Kitware, która patronuje m.in. VTK i Insight Toolkit. Związana z elektronicznym czasopismem naukowym Insight Journal. Obrazy dostępne przez interfejs WWW najczęściej w formatach źródłowych: DICOM lub binarnym.
      • Springer Images - obrazy dołączone do publikacji Springer. Każdy obraz ma indywidualną licencję jednak w trakcie wyszukiwania można wybrać grupę licencji otwartych.
      • Images from the History of Medicine (NLM) - obrazy związane z historią medycyny zebrane przez National Library of Medicine USA.
      Poza wyżej wymienionymi bazami danych warto jeszcze zajrzeć na spis plików opracowany na stronie biblioteki GDCM (link) oraz programu OsiriX (link).

      Mam nadzieje, że przedstawione przeze mnie bazy obrazów medycznych pozwolą czytelnikowi na znalezienie ciekawego materiału badawczego i zaowocują powstaniem ciekawych prac naukowych. Powodzenia.

      czwartek, 25 marca 2010

      Zapraszam na mój nowy mikroblog

      0 komentarze
      Ostatnio z powodu dużej ilości pracy, nie mam niestety czasu na opracowywanie kolejnych wpisów na blogu. Zapraszam jednak na mój nowy mikroblog, który prowadzę z wykorzystaniem Google Buzz. w krótkich notkach piszę tam głównie o moich bieżących zainteresowaniach, jak również o wydarzeniach i nowinkach technicznych, które szczególnie mnie zaciekawiły i chciałbym polecić je innym. Oczywiście pojawiają się tam również informacje dotyczące wizualizacji i przetwarzania obrazów.

      Obecny blog wróci do życia za kilka miesięcy i już teraz mogę obiecać, że pojawi się na nim wiele ciekawych rzeczy, nad którymi obecnie pracuje.