poniedziałek, 21 grudnia 2009

Instalacja bazy danych Oracle 11g w Ubuntu 9.04

21 komentarze
Postanowiłem rozszerzyć tematykę bloga o inne zainteresowania nie związane przetwarzaniem i wizualizacją obrazów medycznych. W niedługim czasie pojawi się więcej wpisów dotyczących baz danych, programowania oraz obliczeń równoległych. Mam nadzieje, że dzięki temu blog stanie się ciekawszy dla szerszego grona odbiorców.

Na początek opiszę proces instalacji pełnej wersji bazy danych Oracle 11g Release 2 w systemie Ubuntu Linux 9.04 32-bit. Instalacja nie jest bardzo złożona, ale pewne fragmenty mogą być problematyczne dla osób, które nie miały nigdy do czynienia z tą bazą danych.

Proces instalacji został zaplanowany tak, aby poznać jak najwięcej narzędzi konfiguracyjnych i dokładnie prześledzić co się dzieje w systemie.

Uwaga:
Użytkowników, którzy nie chcą instalować pełnej wersji bazy Oracle może zainteresować jej okrojona wersja: Oracle Database 10g Express Edition. Nie dość, że istnieje dedykowany instalator dla Debiana/Ubuntu, to dodatkowo może być ona używana do zastosowań komercyjnych.

Podczas przygotowania tego wpisu szczególnie przydatne okazały się następujące strony:


Przygotowanie systemu do instalacji bazy



Instalator Oracle niestety nie jest przystosowany dla Ubuntu, dlatego niektóre kroki będą miały na celu upodobnienie tego systemu do RedHata.

Poniższe kroki wykonujemy na koncie administratora.
  • Instalacja niezbędnych pakietów:
    Instalator może wymagać dodatkowych pakietów do zainstalowania:
    apt-get update && sudo apt-get dist-upgrade
    apt-get install gcc make binutils lesstif2 rpm libmotif3 libaio1 gawk alien ksh
  • Utworzenie linków symbolicznych:
    Instalator Oracle używa pełnych ścieżek niektórych programów systemowych, dlatego należy upewnić się, że znajdują się one w odpowiednim miejscu:
    ln -s /usr/bin/awk /bin/awk
    ln -s /usr/bin/rpm /bin/rpm
    ln -s /usr/bin/basename /bin/basename

    mkdir /etc/rc.d
    for i in 0 1 2 3 4 5 6 S ; do ln -s /etc/rc$i.d /etc/rc.d/rc$i.d ; done
  • Ustawienie powłoki skryptowej:
    Instalator Oracle zdecydowanie bardziej preferuje bash'a aniżeli dash'a:
    cd /bin
    ls -l /bin/sh

    lrwxrwxrwx 1 root root 4 2009-04-23 14:05 /bin/sh -> dash

    ln -sf /bin/bash /bin/sh
    ls -l /bin/sh

    lrwxrwxrwx 1 root root 9 2009-12-15 19:12 /bin/sh -> /bin/bash
  • Utworzenie odpowiednich użytkowników i grup:
    Aby Ubuntu z punktu widzenia instalatora przypominał RedHata dodajemy odpowiednie grupy i użytkownika oracle:
    addgroup oinstall
    addgroup dba
    addgroup nobody
    usermod -g nobody nobody
    useradd -g oinstall -G dba -p password -d /home/oracle -s /bin/bash oracle

    mkdir /home/oracle
    chown -R oracle:dba /home/oracle
  • Przygotowanie katalogów:
    mkdir -p /u01/app/oracle
    chown -R oracle:dba /u01
  • Modyfikujemy ustawienia /etc/security/limits.conf:
    cd /etc/security/
    cp limits.conf limits.conf.original
    nano limits.conf

    Dodajemy poniższe linie na końcu pliku:
    oracle soft nproc 2047
    oracle hard nproc 16383
    oracle soft nofile 1023
    oracle hard nofile 65535

  • Modyfikujemy ustawienia /etc/sysctl.conf
    cd /etc
    cp sysctl.conf sysctl.conf.original
    nano sysctl.conf

    Dodajemy poniższe linie na końcu pliku:
    fs.file-max = 65535
    kernel.shmall = 2097152
    kernel.shmmax = 2147483648
    kernel.shmmni = 4096
    kernel.sem = 250 32000 100 128
    net.ipv4.ip_local_port_range = 1024 65535
    net.core.rmem_default = 4194304
    net.core.rmem_max = 4194304
    net.core.wmem_default = 262144
    net.core.wmem_max = 262144

    Przeładowanie pliku konfiguracyjnego:
    sysctl -p
  • Restart komputera
    Aby mieć pewność, że wszystkie ustawienia zostały poprawnie zatwierdzone w systemie restartujemy komputer (tak przynajmniej zalecały wszystkie poradniki instalacji, z których korzystałem).


Pobranie i instalacja oprogramowania



Pobranie i rozpakowanie instalatora
Te czynności możemy wykonywać jako zwyczajny użytkownik, na którym pracujemy na co dzień

Uruchomienie instalatora
  • Instalację należy przeprowadzić jako użytkownik oracle z prawami administratora:
    xhost +
    sudo -s
    su - oracle

  • Będzie nam potrzebny tryb graficzny:
    DISPLAY=:0.0; export DISPLAY
    xhost local:oracle

  • Przejście do katalogu z rozpakowanym instalatorem:
    cd /sciezka/do/instalatora/database/

  • Uruchomienie instalatora:

    ./runInstaller

    Starting Oracle Universal Installer...

    Checking Temp space: must be greater than 80 MB. Actual 11002 MB Passed
    Checking swap space: must be greater than 150 MB. Actual 4024 MB Passed
    Checking monitor: must be configured to display at least 256 colors. Actual 16777216 Passed
    Preparing to launch Oracle Universal Installer from /tmp/OraInstall2009-12-15_12-36-28PM. Please wait ...



Opcje instalacji

Poniżej zostały wyróżnione niestandardowe opcje, które polecam zaznaczyć. Pozostałe opcje należy zostawić tak jak zaproponuje instalator.
  • step2: Install database software only
  • step5: Enterprise Edition (3,95BG)
  • step8: Zaznaczamy opcję „Ignore All”

Czynności po instalacji

W ostatnim etapie instalacji jesteśmy proszeni o wykonanie podanego skryptu jako użytkownik root:
/u01/app/oracle/product/11.2.0/dbhome_1/root.sh


Powinniśmy dostać mniej więcej taki komunikat:
Running Oracle 11g root.sh script...

The following environment variables are set as:
ORACLE_OWNER= oracle
ORACLE_HOME= /u01/app/oracle/product/11.2.0/dbhome_1

Enter the full pathname of the local bin directory: [/usr/local/bin]:
Copying dbhome to /usr/local/bin ...
Copying oraenv to /usr/local/bin ...
Copying coraenv to /usr/local/bin ...


Creating /etc/oratab file...
Entries will be added to the /etc/oratab file as needed by
Database Configuration Assistant when a database is created
Finished running generic part of root.sh script.
Now product-specific root actions will be performed.
Finished product-specific root actions.


Instalacja listenera


Poniższe czynności wykonujemy jako użytkownik oracle.
  • Ustawiamy zmienne systemowe:
    export ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1
    export PATH=$PATH:$ORACLE_HOME/bin

  • Uruchamiamy program:
    netca

Dalej postępujemy według zaleceń instalatora - nie zmieniamy żadnych opcji.


Instalacja bazy danych



Uruchamiamy program:
dbca

i na poszczególnych etapach instalacji wybieramy następujące opcje:
  • step4: Odznaczamy „Configure Enterprise Manager”
  • step4: Odznaczamy „Enable automatic maintenance tasks”
  • step5: Zaznaczamy „Use the Same Administrative Password for All Accounts”
  • step7: Wyłączamy „Specify Flash Recovery Area”
  • step8: „Sample schemas”
  • step9 - Memory: Pamięć ustawiamy na 250MB, Wyłączamy opcję „Use Automatic Memory Management”
  • step9 - Sizing: Processes: 30
  • step9 - Character Sets: „Use Unicode”

Komentarz: Powyższe opcje to tylko propozycja - można zostawić domyślne lub wybrać własne. Te opcje zostały ustawione według zaleceń na stronie: Installing Oracle 11gR1 on Ubuntu 9.04 Jaunty Jackalope | The Pythian Blog.

Manualny start bazy danych



Po zrestartowaniu komputera wszelkie próby połączenia się z bazą okażą się daremne - baza nie jest uruchomiona. Aby ją włączyć wykonujemy następujące czynności:

  • Logujemy się jako sysdba:
    sqlplus '/as sysdba'

    SQL*Plus: Release 11.2.0.1.0 Production on Tue Dec 22 20:41:21 2009

    Copyright (c) 1982, 2009, Oracle. All rights reserved.

    Connected to an idle instance.

  • Uruchamiamy instancję bez montowania bazy:
    startup nomount;

    ORACLE instance started.

    Total System Global Area 196681728 bytes
    Fixed Size 1335444 bytes
    Variable Size 71307116 bytes
    Database Buffers 117440512 bytes
    Redo Buffers 6598656 bytes

    Sprawdzamy stan:
    select status from v$instance;

    STATUS
    ------------
    STARTED

  • Montujemy bazę:
    alter database mount;

    Baza danych zostala zmieniona.

    Sprawdzamy stan:
    select status from v$instance;

    STATUS
    ------------
    MOUNTED

  • Otwieramy bazę:
    alter database open;

    Baza danych zostala zmieniona.

    Sprawdzamy stan:
    select status from v$instance;

    STATUS
    ------------
    OPEN


Aby wyłączyć instancję wraz z bazą danych wpisujemy:
shutdown immediate;

Baza danych zostala zamknieta.
Baza danych zostala zdemontowana.
Instancja ORACLE zostala zamknieta.



Automatyczny start bazy danych przy starcie systemu



Wygodniejszym od każdorazowego ręcznego włączania bazy może być takie jej skonfigurowanie, aby startowała razem z systemem. W tym celu
  • Logujemy się na konto administratora:
    sudo -s

  • Edytujemy ostatnią linijkę w pliku /etc/oratab, zamieniając literkę N na Y:
    nano /etc/oratab

    ORCL:/u01/app/oracle/product/11.2.0/dbhome_1:Y

  • Tworzymy następujący plik i zapisujemy do niego poniższą zawartość:
    nano /etc/init.d/oracledb

    #!/bin/bash
    #
    # /etc/init.d/oracledb
    #
    # Run-level Startup script for the Oracle Listener and Instances
    # It relies on the information on /etc/oratab

    # these are the paths for our base installation
    export ORACLE_BASE=/u01/app/oracle
    export ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1
    export ORACLE_OWNR=oracle
    export PATH=$PATH:$ORACLE_HOME/bin

    if [ ! -f $ORACLE_HOME/bin/dbstart -o ! -d $ORACLE_HOME ]
    then
    echo "Oracle startup: cannot start"
    exit 1
    fi

    case "$1" in
    start)
    # Oracle listener and instance startup
    echo -n "Starting Oracle: "
    su $ORACLE_OWNR -c "$ORACLE_HOME/bin/lsnrctl start"
    su $ORACLE_OWNR -c "$ORACLE_HOME/bin/dbstart $ORACLE_HOME"
    touch /var/lock/oracle
    echo "OK"
    ;;
    stop)
    # Oracle listener and instance shutdown
    echo -n "Shutdown Oracle: "
    su $ORACLE_OWNR -c "$ORACLE_HOME/bin/lsnrctl stop"
    su $ORACLE_OWNR -c "$ORACLE_HOME/bin/dbshut $ORACLE_HOME"
    rm -f /var/lock/oracle
    echo "OK"
    ;;
    reload|restart)
    $0 stop
    $0 start
    ;;
    *)
    echo "Usage: `basename $0` start|stop|restart|reload"
    exit 1
    esac

    exit 0

  • Przydzielamy prawa do wykonywania dla tego pliku:
    chmod a+x /etc/init.d/oracledb

  • Uaktualniamy skrypty startowe:
    update-rc.d oracledb defaults

  • Restartujemy komputer. Baza powinna uruchomić się automatycznie.


Testy


Wszystkie czynności przeprowadzamy na własnym koncie.

Testujemy połączenie z bazą danych
Dodajemy użytkownika, na którym pracujemy do grupy dba:
sudo usermod -G dba -a rafal


Ustawiamy niezbędne zmienne środowiskowe:
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1
export PATH=$PATH:$ORACLE_HOME/bin
export ORACLE_SID=ORCL

Łączymy się z bazą:
sqlplus '/as sysdba'

i wydajemy polecenie:
SELECT INSTANCE_NAME, VERSION, STATUS FROM V$INSTANCE;

INSTANCE_NAME    VERSION           STATUS
---------------- ----------------- ------------
ORCL 11.2.0.1.0 OPEN


Odblokowujemy użytkownika Scott
Warto odblokować przykładowego użytkownika Scott i na nim wykonać kilka testów:
sqlplus '/as sysdba'

ALTER USER scott ACCOUNT UNLOCK;

sqlplus scott/tiger

select * from emp;


Enterprise Manager


Enterprise Manager jest narzędziem służącym do diagnozowania i administracji bazą danych Oracle. Można go skonfigurować na dwa sposoby: 1) w kreatorze instalacji bazy danych lub 2) manualnie.

Manualna konfiguracja:
Ustawiamy zmienne systemowe ORACLE_SID i ORACLE_HOME, a następnie uruchamiamy polecenie tworzące repozytorium EM:
cd $ORACLE_HOME/bin
emca -config dbcontrol db -repos create
Jeśli wszystko przebiegnie bez problemów możemy przejść na stronę: https://[host]:1158/em/ (np. https://laptop:1158/em/). Ja niestety dostałem błąd:

INFO: Creating the EM repository (this may take a while) ...
2009-12-17 16:55:07 oracle.sysman.emcp.EMReposConfig invoke
SEVERE: Error creating the repository

Jak sobie poradzić z błędami? Ja musiałem wykonać kilka czynności:
  • Najpierw należało odblokować użytkowników DBSNMP i SYSMAN:
    sqlplus '/as sysdba'

    ALTER USER DBSNMP ACCOUNT UNLOCK;
    ALTER USER SYSMAN ACCOUNT UNLOCK;

  • Usunąć użytkownika MGMT_VIEW:
    drop user MGMT_VIEW;

  • Zwiększyć liczbę procesów dla Oracle:
    show parameter processes
    alter system set processes=100 scope=spfile;

    Po tej operacji niezbędny jest restart bazy danych:
    shutdown immediate
    startup

  • Oraz ponownie utworzyć repozytorium:
    emca -config dbcontrol db -repos recreate


Po tych czynnościach konfiguracja zakończyła się poprawnie. Problemy prawdopodobnie wynikały z przyjętych ustawień w trakcie tworzenia bazy danych (zablokowani użytkownicy, za mała liczba procesów).

Uruchomienie Managera:
Po restarcie komputera Enterprise Manager jest wyłączony. Aby go uruchomić logujemy się na konto oracle ustawiamy zmienne środowiskowe jak powyżej i wydajemy polecenie:
emctl start dbconsole


Manualnie Managera wyłączamy poleceniem:
emctl stop dbconsole


Komentarz:
  • Z niewiadomych mi powodów Enterprise Manager nie chce u mnie działać w Firefoksie - wyświetlana jest biała strona.
  • Działa za to bez problemu w Google Chrome.


Oracle SQL Develpoer



Do codziennej pracy warto również zainstalować edytor SQL. Do najbardziej zalecanych dla Ubuntu można zaliczyć TOra (niestety miałem problemy z instalacją) oraz Oracle SQL Develpoer, którego instalacja zostanie opisana.
  • Pobieramy wersję instalacyjną ze strony: http://www.oracle.com/technology/products/database/sql_developer/index.html.
  • Jest to wersja RPM dlatego będziemy musieli przekonwertować ją do formatu DEB zrozumiałego dla Ubuntu. Instalujemy w tym celu narzędzie alien:
    sudo apt-get install alien

  • Konwertujemy pakiet RPM na DEB:
    sudo alien -k --scripts sqldeveloper*.rpm

  • i instalujemy go w systemie:
    sudo dpkg -i sqldeveloper*.deb

  • Jeśli dostaniemy komunikat:
    Oracle SQL Developer
    Copyright (c) 1997, 2009, Oracle and/or its affiliates.All rights reserved.

    Type the full pathname of a J2SE installation (or Ctrl-C to quit), the path will be stored in ~/.sqldeveloper/jdk

  • Wykonujemy następujące polecenia:
    mkdir -p ~/.sqldeveloper
    touch ~/.sqldeveloper/jdk
    echo "/usr/lib/jvm/java-6-sun" >> ~/.sqldeveloper/jdk

niedziela, 13 grudnia 2009

MedicalVolumeRenderer - aplikacja testowa do wizualizacji objętościowej

2 komentarze
Pełny kod źródłowy
Ostatnim programem - przynajmniej jak na razie, który przygotowałem do demonstracji biblioteki KWWidgets jest MedicalVolumeRenderer. Jego głównym zadaniem jest interaktywne ustawianie parametrów wizualizacji objętościowej, o której pisałem w notatce: Wizualizacja objętościowa w VTK.

Budowa programu

MedicalVolumeRenderer ma podobną budowę jak programy opisywane ostatnio (MedicalContourMaker i MedicalSlicer). Główne okno programu jest zarządzane przez klasę vtkKWWindow. To ona zajmuje się obsługą menu, panelu bocznego oraz obszaru renderowania. Z nowych kontrolek, które pojawiły się w tym programie na szczególną uwagę zasługuje volumePropertyWidget widoczna na panelu jako Volume Apperance Settings. Po utworzeniu tej kontrolki przekazujemy do niej obiekt klasy vtkVolumeProperty. W ten sposób mamy dostęp do aktualnych parametrów renderowania obiektu i możemy je oczywiście dowolnie zmieniać. Interfejs graficzny kontrolki jest widoczny na poniższych zrzutach ekranu:





Warto również wspomnieć o kontrolce vtkKWColorPresetMenu widocznej na panelu jako Color Presets. Definiuje ona szereg zestawów kolorów, które mogą być ustawiane na poprzedniej kontrolce w sekcji Scalar Color Mapping.



Możliwości
  • Definiowanie skali kolorów dla odpowiednich wartości.
  • Ustawianie przezroczystości.
  • Kilkanaście predefiniowanych zestawów kolorów.
  • Nagrywanie animacji dla pola renderowania.
Przykładowe wizualizacje można obejrzeć poniżej:



Podsumowanie

Pomimo tego, że te same rezultaty można osiągnąć samemu programując ustawienia opcji renderowania (klasa: vtkVolumeProperty), to wygoda jaką dają nam dostępne w KWWidgets kontrolki może bardzo ułatwić przygotowanie profesjonalnego narzędzia do wizualizacji medycznej.

Kody źródłowe oraz wersję dla Windows można pobrać ze strony: link.

wtorek, 8 grudnia 2009

MedicalContourMaker - aplikacja testowa do generowania konturu

0 komentarze
Pełny kod źródłowy
Następnym programem po MedicalSlicer, który przygotowałem w celu prezentacji możliwości biblioteki KWWidgets jest MedicalContourMaker. Przykład ten umożliwia tworzenie wizualizacji powierzchniowej dla wczytanych danych 3D (więcej na ten temat można przeczytać w notatce: Generowanie powierzchni z wykorzystaniem algorytmu Marching Cube w VTK).



Budowa programu

Szkielet programu jest niemal identyczny ze szkieletem MedicalSlicer, zatem nie będę go ponownie szczegółowo opisywał. Z dodatkowych kontrolek, które tutaj się pojawiły są vtkKWChangeColorButton - do zmiany koloru (widoczny na rysunku poniżej), oraz vtkKWSurfaceMaterialPropertyWidget - do zmiany sposobu wyświetlania powierzchni konturu.



Możliwości
  • Zmiana wartości progowej dla algorytmu Marching Cube (suwak: Iso Level).
  • Zmiana przeźroczystości (suwak: Opacity) oraz koloru (przycisk Set Color) powierzchni konturu.



  • Zmiana parametrów materiału pokrywającego powierzchnię konturu:



Podsumowanie

Pomimo tego, że jest to bardzo prosty program, to posiada całkiem spore możliwości w zakresie ustalania parametrów wyświetlania konturu. Wystarczyłoby dodać do niego funkcję wyświetlania kilku konturów na raz, a powstałaby dosyć sprawna aplikacja do wizualizacji medycznej.

Kody źródłowe oraz wersję dla Windows można pobrać ze strony: link.

niedziela, 6 grudnia 2009

MedicalSlicer - aplikacja testowa do przeglądania zdjęć medycznych

0 komentarze
Pełny kod źródłowy
Pierwszą aplikacją prezentującą możliwości biblioteki do tworzenia interfejsu KWWidgets jest program o roboczej nazwie MedicalSlicer. Pomimo tego, że jego główną rolą jest pokazanie jak łączyć tą bibliotekę z VTK, to jest to w pełni funkcjonalny program do przeglądania medycznych zdjęć 3D.

Budowa programu

Szkielet aplikacji obsługuje klasa vtkKWWindow, która tworzy główne okno programu i zarządza kontrolkami w nim umieszczonymi. Jedną z ważniejszych kontrolek jest vtkKWRenderWidget posiadająca cechy znanych z VTK klas: vtkRenderer, vtkRenderWindow. Na obrazku poniżej jest to oczywiście pole renderowania widoczne po prawej stronie. Płaszczyzny obrazu, które na nim widzimy zostały uzyskane za pomocą obiektów vtkImagePlaneWidget (opis możliwości poniżej). Z lewej strony mamy przewijaną ramkę vtkKWFrameWithScrollbar, na której zostały umieszczone kolejne komponenty: vtkKWScaleWithEntry (suwak do wyboru wartości z zadanego zakresu) oraz vtkKWRadioButton (przycisk opcji). Interesującym komponentem widocznym na samym końcu ("Movie Creator") jest vtkKWSimpleAnimationWidget. Pozwala on na łatwe tworzenie animacji z pola renderowania dla ustalonych wartości obrotu i skalowania. Animacja jest zapisywana na dysk w postaci serii plików png, i później może zostać zamieniona na film np. za pomocą programu ffmpeg lub mencoder (jak to zrobić pisałem w notatce "Tworzenie zrzutów ekranu oraz filmów w VTK").



Możliwości
  • Program pozwala na przeglądanie danych medycznych jednocześnie w trzech różnych płaszczyznach: X, Y i Z. "Plasterki" (ang. slices) możemy przewijać wciśniętym przyciskiem rolki na myszce.
  • Lewy przycisk myszy służy do sprawdzania wartości danego piksela.
  • Prawy do zmiany ustawień okna oraz poziomu wyświetlania.
  • Dodatkowo możliwe jest obracanie i zmienianie kąta nachylenia każdej płaszczyzny.

  • Na panelu opcji, w ramce Lut Table można wybrać skalę kolorów w jakiej będą widoczne dane.


Podsumowanie

Pewną niedogodnością prezentowanego programu MedicalSlicer może być brak obsługi formatu DICOM. Istnieją jednak narzędzia do konwersji tego formatu do formatu VTK Structured Point, który jest obsługiwany przez program. Ja osobiście polecam ImageJ oraz plugin 3D Toolkit.

Kody źródłowe programu oraz wersję skompilowaną dla Windows można pobrać ze mojej anglojęzycznej strony www. Przygotowanie wersji binarnej dla innych systemów nie powinno być problematyczne, ponieważ wszystkie narzędzia są niezależne od systemu oraz dołączyłem plik kompilacji CMake.