ingineria programarii

Upload: livius969

Post on 04-Mar-2016

260 views

Category:

Documents


0 download

DESCRIPTION

Introducere in dezvoltarea aplicatiilor software

TRANSCRIPT

  • INGINERIA SISTEMELOR DE PROGRAMARE

    NOTE DE CURS

    REV.01

    Liviu erbnescu UNIVERSITATEA HYPERION

    1

  • CUPRINS

    Implementarea mastilor in C++, implementarea contorilor de timp in C++ cu clase wxWidgest

    Conectarea claselor c++ wxWidgest la postgresql in vederea dezvoltarii aplicatiilor de monitorizare a proceselor

    Principii privind dezvoltarea aplicatiilor software privind identificarea unor obiecte simple

    Dezvoltarea aplicatiilor de achiziie de date ce utilizeaza interfete de proces

    Stocarea datelor cu structur complex

    Dezvoltarea aplicatiilor software de logistica

    Tehnici de testare a aplicatiilor software

    2

  • IMPLEMENTAREA MASTILOR IN C++

    Pentru implementarea mastilor sunt utilizati operatorii binari din C++ si anume: si logic, sau logic, sau exclusiv, negare, deplasare(siftare) la stanga, deplasare la dreapta.

    In continuare este prezentat un mic exemplu.Clasa Masca permite preluarea unui numar intreg, fara semn si efectuaza operatii de tipul extragerii de informatii prin aplicarea mastilorSe da un numar. Se cere extrarea informatie aflata pe anumite poziti. Informatia extrasa poate fi pe unul sau mai multi biti. se va prelua si pozitia primului si ultimului bit din grupul ce se va extrage.Fisierul masca.hclass Masca{ unsigned long nr_long; //32 biti unsigned short nr_short; //16 biti unsigned char nr_char; // 8 biti unsigned long long nr_long_long; // echivalent cu int64 char tip; // l(long),s(short),c(char),d(long long)public: Masca(); Masca(unsigned long nr); Masca(unsigned short nr); Masca(unsigned char nr); Masca(unsigned long long nr); unsigned long long det_masca(unsigned long long msk); };

    Fisierul masca.cpp// clasa ce poate prelua un nr si efectuaza //operatii de tipul extragerii de informatii// prin aplicarea mastilor// Problema : Se da un numar. Se cere extrarea informatie aflata pe anumite poziti.// Informatia extrasa poate fi pe unul sau mai multi biti. se va prelua // si pozitia primului si ultimului bit din grupul ce se va extrage//MASCA se preia in baza 10#include #include "masca.h" Masca::Masca() { tip='l';nr_long=0;wxMessageBox("long - constructor implicit");} //constructorii difera prin numarul si tipul argumentelor

    3

  • Masca::Masca(unsigned long nr) { //wxString tmp((wchar_t*) nr);

    tip='l';nr_long=nr;wxMessageBox("long "); } Masca::Masca(unsigned short nr) {tip='s';nr_short=nr;wxMessageBox("short!!!");} Masca::Masca(unsigned char nr) {tip='c';nr_char=nr;wxMessageBox("char!!!");} Masca::Masca(unsigned long long nr) {tip='d';nr_long_long=nr;wxMessageBox("long long!!!");} unsigned long long Masca::det_masca(unsigned long long msk) { unsigned long long rez,t=0x1,t2;//0x1 === 1 short poz=0;//va fi egal cu nr. de zerouri din dreapta -- //cu nr. de biti cu care shiftat nr. la dreata, dupa aplicarea mastii //este necesara o operatie AND la nivel de bit cu referinta rez=nr_long_long & msk; t2=msk; // este necesara shiftarea la dreapta cu un nr egal cu nr. de zerouri while(!(t2&t)) {t2>>=1;poz++;} rez>>=poz; }

    Fisierul main.cpp// se marcheaza cu 1 zona ce constituie masca, // de ex. daca vremm sa extragem informatia data de bitii 7,6,5// dintr-un nr. vom scrie 111000 ptr.masca// la un moment dat se extrage o singura masca => vom avea un sg. grup compact de 1

    #include "main.h"#include "masca.h"// initialize the applicationIMPLEMENT_APP(MainApp);bool MainApp::OnInit(){

    SetTopWindow( new MainFrame( NULL ) );GetTopWindow()->Show();// true = enter the main loopreturn true;

    }MainFrame::MainFrame(wxWindow *parent) : MainFrameBase( parent ){}MainFrame::~MainFrame(){}

    4

  • void MainFrame::OnCloseFrame(wxCloseEvent& event){

    Destroy();}void MainFrame::OnExitClick(wxCommandEvent& event){

    Destroy();}void MainFrame::calc_rezultat( wxCommandEvent& event ){Masca *x = NULL; wxString ach,ach_masca; ach=E_nr->GetValue(); ach_masca=E_masca->GetValue(); unsigned long long nr, nr_masca; if(!ach.ToULongLong(&nr)) wxMessageBox("Conversie eronata nr initial!"); if(!ach_masca.ToULongLong(&nr_masca)) wxMessageBox("Conversie eronata - masca!"); switch(CB1->GetSelection())

    {case 0: x = new Masca((unsigned char)nr); break;case 1: x = new Masca((unsigned short)nr); break;case 2: x = new Masca((unsigned long)nr); break;case 3: x = new Masca((unsigned long long)nr); break;}

    unsigned long long rez=x->det_masca(nr_masca); ach=ach.FromDouble(rez); E_rez->SetValue(ach); if(x) delete x;}

    5

  • IMPLEMENTAREA CONTORILOR DE TIMP IN C++ cu clase wxWidgest

    Implementarea utilizeaza clasa wxTimer.In exemplu urmator este data o implementare simpla a acestei clase

    Fisierul main.h#ifndef __main__#define __main__// main wxWidgets header file#include #include // gui classes generated by wxFormBuilder#include "gui.h"class Timp : public wxTimer{public: Timp(); void Notify(); void start();};class MainApp : public wxApp{ public: virtual bool OnInit();};// declare global static function wxGetApp()DECLARE_APP(MainApp)class MainFrame : public MainFrameBase{ double ref1,ref2,in1,in2,in3;

    boolean f_citire;public:

    MainFrame( wxWindow *parent );virtual ~MainFrame();Timp *timp1;void m_button1OnButtonClick( wxCommandEvent& event );

    };#endif //__main__

    Fisierul main.cpp#include "main.h"IMPLEMENT_APP(MainApp);bool MainApp::OnInit(){ SetTopWindow( new MainFrame( NULL ) );

    GetTopWindow()->Show();return true;

    }MainFrame::MainFrame(wxWindow *parent) : MainFrameBase( parent ){f_citire=false;

    6

  • timp1=new Timp; // timp1->start();}MainFrame::~MainFrame(){ timp1->Stop();}void MainFrame::OnCloseFrame(wxCloseEvent& event){ Destroy();}void MainFrame::OnExitClick(wxCommandEvent& event){Destroy();}void MainFrame::m_button1OnButtonClick( wxCommandEvent& event ){ f_citire=!f_citire;

    if(f_citire) m_button1->SetLabel(_T("STOP")); else m_button1->SetLabel(_T("START"));

    if(f_citire) timp1->start();

    else { timp1->Stop();event.Skip();}}Timp::Timp():wxTimer(){ // Constructorul clasei se pot trece initializari ale variabilelor }void Timp::Notify(){ // CEEA CE SE EXECUTA LA FIECARE INTERVAL MENTIONAT in cazul acesta 500ms //pane->Refresh();

    wxMessageBox("tttt");}void Timp::start(){ wxTimer::Start(500); // INTERVALUL DE TIMP : 500 ms}

    7

  • CONECTAREA CLASELOR C++ WXWIDGEST LA POSTGRESQL IN VEDEREA DEZVOLTARII APLICATIILOR DE MONITORIZARE A

    PROCESELOR

    In acest sens se utilizeaza biblioteca libpq din cadrul PostgreSQL

    Pentru simplificarea utilizarii se construieste functia preluare_tabel ce preia ca argument controlul wxTable responsabil de afisarea tabelului. Astfel este realizata conexiunea cu baza de date, este preluat capul de tabel, este stabilita dimensiunea tabelului si sunt preluate datele in tabel.

    Fisierul interogare.h va contine:#include//declatie functie ptr. a putea fi apelata in main.cppvoid preluare_tabel(wxGrid *GX1);//sau// void preluare_tabel(wxGrid*);Fisierul interogare.cpp va contine:#include #include "gui.h"#include #include #include "interogare.h"//functie de inchidere a conexiunii side preluare si afisare a eventualelor eroristatic void iesire(PGconn *conexiune1,PGresult *rezultat){ wxString ach; ach=(wxString)"EROARE" + (wxString)PQerrorMessage(conexiune1); wxMessageBox(ach); if(rezultat) PQclear(rezultat); PQfinish(conexiune1); exit(1); }// functia de conectare, intoarce adresa structurii folosita pentru conexiune PGconn* conexiune(){const char *sir_conexiune; PGconn *conexiune1; sir_conexiune = "dbname = CURS_ISP password = abcd user = student"; //conectarea la baza de date conexiune1 = PQconnectdb(sir_conexiune); if (PQstatus(conexiune1) != CONNECTION_OK) iesire(conexiune1,NULL); else return conexiune1;}PGresult *interogare1(PGconn *conexiune1,PGresult *rezultat1){ //daca a existat o interogare anterioara sterge datele referitoare

    8

  • // la rezultatul interogarii anterioare if(rezultat1) PQclear(rezultat1); //apeleaza functia ce lanseaza o interogare SQL pentru server rezultat1 = PQexec(conexiune1, "SELECT * FROM c3.test1 ORDER BY a;"); //testeaza rezultatul interogarii if (PQresultStatus(rezultat1) != PGRES_TUPLES_OK) iesire(conexiune1,rezultat1); //intoarce variabila prin care se face referire la rezultatul // interogarii in vederea utilizarii acesteia pentru afisarea //datelor in grid-ul G1 return rezultat1;}// functia preia datele din baza de date si le pune in// obiectul grid ce are adresa data de GX1void preluare_tabel(wxGrid *GX1){ int nrCampuri,nrInregistrari; //sterge liniile existente din tabel deoarece este posibil

    // ca noua interogare sa aiba ca rezultat mai putine //inregistrarii/liniiGX1->DeleteRows(0,GX1->GetNumberRows());// se sterg GX1->GetNumberRows() linii incpand cu prima linie (0)

    PGconn *conexiune1;//conectarea la baza de dateconexiune1=conexiune();PGresult *rezultat=NULL;//s-a pus NULL deoarece la prima rulare nu a existat interogare // anterioara si trebuie evitata testarea rezultatului

    //interogarea bazei de daterezultat=interogare1(conexiune1,rezultat);nrCampuri = PQnfields(rezultat); //wxString

    achx;achx=achx.FromDouble(nrCampuri);wxMessageBox(achx);//se pp. ca nr. de campuri din grid este egal cu cel din tabelnrInregistrari=PQntuples(rezultat); //achx=achx.FromDouble(nrInregistrari); wxMessageBox(achx);//refacem structura grid-ului cu actualul numar de

    inregistrari/liniiGX1->AppendRows(nrInregistrari); //preluare item cu item a datelor din rezultatul interogarii in

    tabelwxString ach;int i,j;

    for(i = 0; i < nrInregistrari; i++) { for(j = 0; j < nrCampuri; j++)

    {//datele din rezultat sunt siruri de caractere(char*) // si este necesara conversia lor la tipul wxString // recunoscut de grid-ul G1 ach=ach.FromAscii(PQgetvalue(rezultat, i, j)); //pune continutul variabilei ach in grid la pozitia i,j

    GX1->SetCellValue(i,j,ach);}

    } }

    9

  • Fisierul main,h va avea forma:#ifndef __main__#define __main__// main wxWidgets header file#include // gui classes generated by wxFormBuilder#include "gui.h"class MainApp : public wxApp{

    public:virtual bool OnInit();

    };DECLARE_APP(MainApp)class Fereastra : public FereastraBaza{

    public:Fereastra( wxWindow *parent );virtual ~Fereastra();void apasa( wxCommandEvent& event );

    protected:};#endif //__main__

    Iar fisierul main.cpp va avea forma:#include "interogare.h" //pentru a putea apela functia preluare_tabel#include "main.h"IMPLEMENT_APP(MainApp);bool MainApp::OnInit(){

    SetTopWindow( new Fereastra( NULL ) );GetTopWindow()->Show();return true;

    }Fereastra::Fereastra(wxWindow *parent) : FereastraBaza( parent ){}Fereastra::~Fereastra(){}void Fereastra::apasa( wxCommandEvent& event ){ // G1 se afla in clasa de baza

    preluare_tabel(G1);}

    10

  • PRINCIPII PRIVIND DEZVOLTAREA APLICATIILOR SOFTWARE PRIVIND IDENTIFICAREA UNOR OBIECTE SIMPLE

    STOCAREA INFORMAIEI DIGITALEImaginile preluate sunt imagini statice. Exist dou

    posibiliti de reprezentare a informaiilor: hrile de bii reprezentarea vectorial

    Hartile de biiHartile de biti (raster graphics), sunt formate dintr-o de puncte denumite pixeli. De fapt, ele reprezint fidel (cazul fiierelor necomprimate), bit cu bit, continutul memoriei video in momentul afirii imaginii respective pe ecranul monitorului. De exemplu, pentru o imagine monocroma (alb-negru), fiecarui punct fizic al imaginii ii corespunde un singur bit in matrice, pe randul i coloana corespunzatoare poziitiei reale a acestuia din cadrul imaginii. Matricea include i informatii despre culoarea punctului corespondent din imagine. Acest lucru se traduce prin faptul ca matricile de pixeli au, pe langa linii i coloane,i o a treia dimensiune: adancimea de culoare a pixelului respectiv. De exemplu, pentru un numar total de 256 de culori dintr-o imagine, adancimea de culoare necesara va fi 8. Rezult un set de 8 matrici de tipul celei corespunzatoare unei imagini monocrome cu aceeasi suprafata. Cele mai uzuale adancimi de culoare sunt: 4 biti (16 culori), 8 biti (256 culori), 16 biti (32768 culori) i 24 biti (16.7 milioane culori). Principalul avantaj al hartilor de pixeli este ca pot stoca imagini reale pana la cel mai mic detaliu. Principalul dezavantaj il constituie necesarul foarte mare de spatiu de stocare. Acesta depinde de dimensiunile imaginii, cat i de nivelul de detaliere al culorii ( "adancimea de culoare"). Alt dezavantaj il reprezinta degradarea imaginii reprezentate, daca este redimensionata. n cazul micsorarii dimensiunilor, o parte din pixeli se va nlatura, rezultand o pierdere de informatie, iar daca se maresc dimensiunile imaginii, vor trebui creai noi pixeli. Acest lucru se rezolva uzual prin a-i atribui noului pixel o culoare apropiata de cea a vecinilor sai. Soluia tinde sa genereze efectul de imagine compusa din blocuri. Majoritatea pachetelor software specializate in editarea de imagini, pot genera reprezentari grafice tip rastru.Reprezentarile vectoriale

    11

  • Imaginile reprezentate vectorial sunt construite de obicei cu ajutorul unor primitive - instructiuni de ca punct, linie, dreptunghi, elipsa. Aceste primitive pot fi grupate impreuna pentru a forma obiecte. Toate imaginile reprezentate vectorial sunt generate de calculator prin utilizarea a diferite pachete software specializate. Sunt numeroase formate de reprezentare pentru aceste imagini, printre acestea se numr cele ulilizate de CorelDraw, Autocad, lotus,etc ntr-o imagine reprezentata vectorial, toate primitivele grafice (linii, dreptunghiuri, elipse, arce de cerc, etc.) ce formeaza obiectele componente, sunt definite prin perechile de coordonate ale punctelor lor esentiale. De exemplu, pentru un dreptunghi, se vor defini perechile de valori (x1, y1) i (x2, y2), acestea fiind coordonatele a doua coluri diagonal opuse ale respectivului dreptunghi, pentru un cerc se definete centrul i raza, pentru o elips se fdefinesc valorile semiaxelor i poziia focarelor,etc.

    Aceasta informatie se refer att la dimensiunile obiectului n discuie ct i la poziia acestuia in cadrul imaginii. n plus, pentru fiecare primitiva grafica componenta se mai pot furniza informatii suplimentare, cum ar fi culoarea conturului, culoarea interiorului, tipul de haura pentru interior, etc. Aceasta permite ca figuri complexe sa poata fi stocate in fisiere foarte compacte. Dimensiunea acestor fisiere este direct proporional cu numarul de obiecte ce compun imaginea, iar un fisier cu multe obiecte componente nu este numai mare ca dimensiune, ci i necesita un timp mare pentru afisarea imaginii. Modificarea dimensiunilor unei imagini reprezentate vectorial se poate face cu usurinta i fara pierderi de informatie, fiind vorba doar de operatii de scalare a parametrilor primitiveor grafice componente. Grafica vectoriala poate fi utilizata pentru reprezentarea imaginilor "din realitatea inconjuratoare", dar acest lucru necesita o cantitate impresionanta de procesare, mpartirea in primitive grafice fiind dificila. Are avantjul unei dimensiuni reduse a fiierului i implicit o vitez mare de ncrcare n memorie i afiare a acestuia.

    Imaginile astronomice (sub forma hrilor de bii) pot fi procesate n sensul identificrii tuturor obiectelor de pe acestea (poziie, elemente de form i distribuie a intensitii luminoase) i stocate ntr-o nou baz de date ce va putea oferi acces rapid n vedera altor procesri a informaiei.

    Metode de compresie i formate uzuale de fisiere

    12

  • foarte multe cazuri practice, reprezentarile diferitelor imagini ajung la dimensiuni foarte mari. Din aceasta cauza s-a conturat necesitatea stocarii datelor in formate comprimate. Metodele de compresie utilizate pot fi impartite in doua categorii: cu, i fara pierdere de informatie. n cazul tehnicilor de compresie fara pierdere de informatie, imaginea poate fi reconstituita n intregime din cea iniiala. Cu exceptia imaginilor foarte simple, metodele de compresie fara pierderi nu obin rate prea bune de compresie - uzual sub 4:1 (dimensiunea imaginii comprimate este un sfert din cea original). Tehnicile de compresie cu pierderi obin rate mult mai mari de compresie, cu dezavantajul pierderii de informatie grafic.

    Formate de fisiere grafice uzuale: GIF (Graphics Interchange Format), propus initial de

    catre corporatia UNISYS i Compuserve, pentru transmiterea de imagini pe linii de telefon utilizand modemurile. Utilizarea sa se limiteaza doar la imagini cu maxim 256 culori (adancimea de culoare maxima: 8). Este utilizat mai mult pentru aplicaii WEB.

    JPEG: un standard pentru compresii de imagini statice, creat de Joint Photographics Experts Group. Metoda de compresie este de tip "cu pierderi", fiind conceputa astfel incat sa se profite de limitarile in perceptia video a ochiului uman. Permite setarea raportului calitate/compresie. Lucreaza cu aceeasi adancime de culoare, 24 (16.7 milioane de culori), indiferent de numarul total de culori din imagine. Este in momentul de fata unul dintre cele mai frecvent intalnite formate de fisiere grafice. De obicei este utilizat pentru stocare imaginilor de previzualizare pentru plcile fotografice din astrometrie.

    TIFF: (Tagged Image File Format) este capabil a stoca imagini de la cele monocrome i pn la cele cu 16.7 milioane de culori. A fost conceput de corporaia Aldus in anii 1980, dupa care a fost adoptat i de Microsoft. Tipul de compresie implementat - fra pierderi, fra posibilitatea de control a raportului calitate/compresie. Este' utilizat de majoritatea observatoarelor astronomice pentru stocarea imaginilor.

    Post-Script i Encapsulated Post-Script: este mai degraba un limbaj specializat in tiparirea la imprimanta, dezvoltat de firma Adobe. Include atat text, ct i grafica vectorial i imagini tip harta de biti.

    BMP: Microsoft Windows Bitmap, este utilizat de pachetul software Microsoft Windows ca format grafic standard,

    13

  • putand lucra cu adancimi de culoare de 24 (16.7 milioane de culori). Nu este utilizat n stocarea imaginilor astronomice datorit dimensiunilor mari a fiierelor i implicit a vitezei mici de ncrcare a informaiilor pentru afiare.

    XBM: XBM - X Window Bitmap, format grafic standard pentru sistemul X Window sub UNIX.Suporta harti de biti cu adancimi de culoare de pana la 24 biti.

    Pentru ca imaginile s fie accesate rapid acestea se pot stoca ntr-un format propiu care s cuprind informaiile:

    poziia relativ n cadrul plcii -x a centrului corespunztor obiectului identificat;

    poziia relativ n cadrul plcii -y a centrului corespunztor obiectului identificat;

    matrice cu dispersia intensitii luminoase (din care reiese i factorul de form)

    valoarea medie a intensitii luminoase pentru fundal (flat field)

    PROCESAREA INFORMAIEI DIGITALE MONOCROME I REPREZENTAREA ACESTEIA

    FILTRAREA IMAGINILOR DIGITALEZgomotul din imaginile digitale poate proveni dintr-o

    mulime de surse. Procesul de achizitie al imaginii digitale, care converteste o imagine optica intr-un semnal electric continuu este un proces primar prin care zgomotele apar in imagini digitale. La fiecare pas din proces exista fluctuatii cauzate de fenomene naturale si acestea aduaga o valoare aleatoare la extragerea fiecarei valori a luminozitatii pentru un pixel dat. In imaginile tipice zgomotul poate fi modelat fie printr-o distributie gaussiana, uniforma sau de tip salt-and peper (sare si piper/ impuls). Forma distribuitiei acestor tipuri de zgomote ca i o functie de nivele de gri poate fi modelata sub forma unei histograme.

    14

  • Zgomotul gaussianunde: HISTOGRAMA= 1

    22e(gm)2

    2

    g = nivel de gri;m = media;s = deviatia standard;Aproximativ 70% din valori sunt incadrate intre medie s (deviatia standard) si 95% dintre valori sunt cuprinse intre medie 2s.

    Din punct de vedere teoretic aceasta ecuatie defineste valori cuprinse intre - si +, dar deoarece nivelele actuale de gri sunt definite intr-un domeniu finit, numarul de pixeli de la valorile minime si maxime va fi mai mare dect precizeaza aceasta ecuatie. Aceasta datorita faptului ca toate valorile mai mici decat minimul vor fi egalate cu minimul si toate valorile mai mari decat maximul vor fi egalate cu maximul. Acest lucru trebuie considerat pentru toate modelele teoretice de zgomote, cand sunt aplicate pe o zona fixa, discreta ca si imaginile digitale.

    15

    90%

    70%

    Nivele de gri

    Probabilitate

  • Imagini obinute n urma filtrrii n urma aplicrii primului filtru se obin nformaii

    concretizate n zone compacte, clar identificate care pot reprezenta corpuri cereti

    IDENTIFICAREA OBIECTELOR DIN CADRUL IMAGINILOR SCANATEn aceast etap identificarea corpurilor cereti se

    rezum doar la a stabili dac o zon pe imagine poate reprezenta sau nu un obiect .

    Obiectele de pe plcile fotografice pot fi identicate din punct de vedere al distributiei intensitatii luminoase i a factorului de form prin utilizarea tehnicilor fuzzy. Aplicarea tehnicilor fuzzy se realizeaz dup filtrarea, n prealabil, a imaginii pentru eliminarea zgomotelor aprute n timpul achiziiei imaginilor.

    Identificarea obiectelor pe imaginile raster, se face avnd la baz dou componente:

    poziiile relative ale pixelilor avnd diverse niveluri de intensitate luminoas;

    intensitatea luminoas a pixelilor.n urma identificrii prin tehnica fuzzy se obin

    informaii legate de form i magnitudine.Identificarea efectiv a obiectului ceresc se realizeaz

    n urma comparrii rezultatului obtinut prin utilizarea thenicilor fuzzy.EXEMPLU DE IDENTIFICARE OBIECTE: IMAGINILE DIN DOMENIUL ASTROFOTOMETRIEI

    Determinarea magnitudinii(intensitatii luminoase) a obiectului ceresc are la baz:

    suma intensitilor luminoase a fiecrui pixel din grupul de pixeli ce identific acel obiect ceresc;

    distribuia intensitii luminoase a pixelilor ce compun obiectul ceresc raportat la distribuia intensitii luminoase a celorlali pixeli din vecintate;

    intensitatea luminoas (sum + distribuie) a pixelilor obiectului cu magnitudinea de referin.

    16

  • Corpuri cereti identificate pe plac (marcate cu culoarea albastru)

    17

  • Imagine mrit se observ delimitrile pe conturul obiectelor

    Detecia muchiilor se poate face i folosind o filtrarea gaussian. Operatorul const ncombinarea a derivatei doua bidimensional a imaginii i o filtrare pentru reducerea zgomotuluifolosind un filtru Gaussian trece-jos. Pixelii corespunztori contururilor sunt detectai la trecerileprin zero din rezultatul convoluiei finale.

    Cei mai folosii operatori morfologici pentru delimitarea ct mai clar a obiectelor de pe imaginea scanat sunt erodarea i dilatarea. Pentru definirea lor, considerm o imagine binar. Aceasta conine obiectul de interes i fundalul; de exemplu fundalul este alb i obiectul este negru (la scanarea prin transparen a plcii fotografice se poate afia fie imaginea normal , fie negativul). Prin erodare fiecare pixel al obiectului care .atinge. fundalul este transformat n pixel-fundal. La dilatare fiecare pixel din fundal aflat n contact cu obiectul este transformat n pixel-obiect. Astfel, erodarea face obiectele mai mici i poate .sparge. un obiect mai mare n mai multe obiecte mici; dilatarea face obiectele mai mari i poate uni mai multe obiecte. Pe baza acestor operatori s-au deschiderea (o erodare urmat de o dilatare) i nchiderea (dilatare urmat de erodare). Prima operaie este folosit pentru a elimina din imagine micile .insule. din pixelii obiectului (acestea apar de obieci la binarizare datorit alegerii inadecvate a pragului). Asemntor, nchiderea elimin astfel de .insule. din cadrul fundalului. Aceste tehnici sunt utile n prelucrarea imaginilor zgomotoase unde o parte din pixeli pot avea o valoare binar eronat. De exemplu, se poate i c un obiect nu are guri sau c marginile obiectului nu prezint asperiti.

    18

  • Pentru identificarea imaginilor astronomice s-a utilizat o combinaie a acestor operatori ncapsulai n seturi de reguli fuzzy astfel nct acestia se aplic simultan pentru mai multe zone. Aplicarea unui singur operator, ntr-o zon ar fi dus la pierderea de informaie.

    Aplicarea tehnicilor fuzzy

    19

    FILTRAREA ZGOMOTELOR

    IMAGINI DIGITITALE

    FILTRATE

    SET REGULI FUZZY FUZZYFICARE

    IMAGINI DIGITITALE

    FUZZYFICATEINFERENIERE

    PLACOTECDIGITIZAT

    (imagini format PROPIU)

    IMAGINI(DIGITIZATE)

  • Reprezentarea obiectual a elementelor identificaten acest sens, este necesar s existe clase ce

    incapsuleaz informaii pentru fiecare zon, pentru fiecare imagine cum ar fi: poziia obiectului ceresc, forma sa (dup operaiile de procesare), distribuia fluxului luminos la nivelul obiectului, etc. Clasele vor conine nu numai informaia rezultat n urma mixrii tuturor zonelor existente n banca de date ci i informaiile din cataloagele stelare. Practic, din punct de vedere al datelor reprezentate, avem doua subsisteme: Un subsistem static ce contine datele procesate pentru

    fiecare imagine astronomic; Un sistem dinamic concretizat printr-un sistem de

    interogrii ce permite mixarea tuturor informaiilor existente.

    Din punct de vedere funcional, sistemul de reprezentare a informaiilor va fi reprezentat de un sistem de baze de date cu interogri ce permit obinerea tuturor informaiilor necesare. Astfel pentru utilizator acesta va fi un sistem relational de baze de date, ce poate fi accesat direct de acesta sau de o alt aplicaie software i astfel accesarea fiierelor cu imagini nu mai este necesar.

    n vederea reprezentrii obiectuale au fost definite urmtoarele clase:

    TCatalog permite interogarea cataloagelor stelare TIm clas de baz utilizat pentru stocarea

    informaiilor la nivel de imagine (inclusiv imaginea) TImPlates gestioneaz informaiile corespunztoare

    plcillor fotografice digitizate TImCCD gestioneaz informaiile corespunztoare

    imaginilor CCD TImX gestioneaz toate informaiile (plci + CCD)

    ntr-o manier unitar

    De asemenea au fost definite structurile:SPozM conine informaiile primare n urma procesrii imaginii unui obiectSInfo conine informaiile rezultate pentru un obiectSRef conine datele necesare stabilirii unui sistem de referin la nivelul fiecrei imagini

    Clasele TImPlates i TImCCD sunt derivate din clasa TIm .Clasele i structurile au fost definite n C++.

    20

  • Structura SInfo

    Clasa derivat TImCCD

    Clasa derivat TImCCD

    22

    typedef struct { short x,y;//the coordinates of the center og the objecti short dimMx,dimMy;// the dimension where the object fits short **M; //image of the object }SPozM;

    typedef struct { short x,y;//the coordinates of the center og the objecti short dimMx,dimMy;// the dimension where the object fits short **M; //image of the object }SPozM;

    typedef struct{ double alfa, delta, err_ad;// the detected coordinates and the ascociated error double mag, err_m; //the detected magnitude and the asociated error char *ImageName_No;//the plate name or seria + image number char *observationSettings;//the observed parameters }SInfo;

    typedef struct{ double alfa, delta, err_ad;// the detected coordinates and the ascociated error double mag, err_m; //the detected magnitude and the asociated error char *ImageName_No;//the plate name or seria + image number char *observationSettings;//the observed parameters }SInfo;

    class TImCCD: public TIm { public: char *observationSettings;// observation's parameters protected: unsigned int NoImag;//the image's number from the seria char *seriesName;//the image's serial number char *fileNameProcessingImage, *aliasNameProcessingImage; // the alias and file namenumele that are storing the processed image short fileTypeProcessingImage;//the type of the file where is stored the image public: SPozM **ProcessingIm;//pointer to the information from the processed image public: TImCCD(char *fileNamePrimaryImage1, char *aliasNamePrimaryImage1, unsigned int NoImag1, char *seriesName1, char *observationSettings1); SPozM **filter(short LevelNoise, char *gammaFunction); //the image processing function ~TImCCD( ); };

    class TImCCD: public TIm { public: char *observationSettings;// observation's parameters protected: unsigned int NoImag;//the image's number from the seria char *seriesName;//the image's serial number char *fileNameProcessingImage, *aliasNameProcessingImage; // the alias and file namenumele that are storing the processed image short fileTypeProcessingImage;//the type of the file where is stored the image public: SPozM **ProcessingIm;//pointer to the information from the processed image public: TImCCD(char *fileNamePrimaryImage1, char *aliasNamePrimaryImage1, unsigned int NoImag1, char *seriesName1, char *observationSettings1); SPozM **filter(short LevelNoise, char *gammaFunction); //the image processing function ~TImCCD( ); };

    class TImPlates: public TIm { public: char *observationSettings, *imageName;//plate's name protected: char *fileNameProcessingImage, *aliasNameProcessingImage; short fileTypeProcessingImage; public: SPozM **ProcessingIm; TImPlates(char *imageName1, char *fileNamePrimaryImage1, char *aliasNamePrimaryImage1,char *observationSettings1); SPozM **filter(short LevelNoise, char *gammaFunction); ~TImPlates( ); };

    class TImPlates: public TIm { public: char *observationSettings, *imageName;//plate's name protected: char *fileNameProcessingImage, *aliasNameProcessingImage; short fileTypeProcessingImage; public: SPozM **ProcessingIm; TImPlates(char *imageName1, char *fileNamePrimaryImage1, char *aliasNamePrimaryImage1,char *observationSettings1); SPozM **filter(short LevelNoise, char *gammaFunction); ~TImPlates( ); };

  • Structura SRef

    Clasa derivat TImX

    23

    typedef struct {short *x,*y;//the address of the two vectors that contains the x and y coordinates of the image double *alfa,*delta;// the address of the two vectors that contains the coordinates (ascensions, declinations) double *Mag;// the address of the vector that contains the magnitudes short dim; //the dimension of the vectors (number of chosen references) char *numeCatalog;//the catalogs name used for the building of the reference systems }SRef;

    typedef struct {short *x,*y;//the address of the two vectors that contains the x and y coordinates of the image double *alfa,*delta;// the address of the two vectors that contains the coordinates (ascensions, declinations) double *Mag;// the address of the vector that contains the magnitudes short dim; //the dimension of the vectors (number of chosen references) char *numeCatalog;//the catalogs name used for the building of the reference systems }SRef;

    class TImX{ TImCCD **ImCCD;// pointer to the vector with pointers at TimCCD classes TImPlates **ImPlates;// pointer to the vector with pointers at TimPlates classes TCatalog **Catalog;// pointer to the vector with pointers at Tcatalog classes public: TImX(TCatalog **p); //the constructor takes over the stellar catalogs AddImCCD(TImCCD *p);//adds the information for a CCD image AddImPlates(TImPlates *p); //adds the information for a digitalized photographic plate RemoveImCCD(unsigned int NoImag1, char *seriesName1);//erases a CCD image RemoveImPlates(char *imageName1);// erases a photographic plate image SInfo* FindStarInfo(double alfa, double delta, char* date, double err); //returns the address of a Sinfo structure for an object given by the catalog's coordinates and the approximation error SInfo** GetAreaInfo(char* fileRezult,double alfa1,double delta1, double alfa2, double delta2, double Mag, char *date); //returns the address of a vector with pointers at Sinfo structures for the objects given by the search area //(catalog's coordinates) and maximal magnitude ~TimX(); };

    class TImX{ TImCCD **ImCCD;// pointer to the vector with pointers at TimCCD classes TImPlates **ImPlates;// pointer to the vector with pointers at TimPlates classes TCatalog **Catalog;// pointer to the vector with pointers at Tcatalog classes public: TImX(TCatalog **p); //the constructor takes over the stellar catalogs AddImCCD(TImCCD *p);//adds the information for a CCD image AddImPlates(TImPlates *p); //adds the information for a digitalized photographic plate RemoveImCCD(unsigned int NoImag1, char *seriesName1);//erases a CCD image RemoveImPlates(char *imageName1);// erases a photographic plate image SInfo* FindStarInfo(double alfa, double delta, char* date, double err); //returns the address of a Sinfo structure for an object given by the catalog's coordinates and the approximation error SInfo** GetAreaInfo(char* fileRezult,double alfa1,double delta1, double alfa2, double delta2, double Mag, char *date); //returns the address of a vector with pointers at Sinfo structures for the objects given by the search area //(catalog's coordinates) and maximal magnitude ~TimX(); };

  • DEZVOLTAREA APLICATIILOR DE ACHIZIIE DE DATE CE UTILIZEAZA INTERFETE DE PROCES

    Un mediu software integrat de msurare i automatizare trebuie s aib o structur modular. Pentru a asigura performane maxime, dezvoltare uoar i coordonare a nivelelor sistemului, componentele mediului de lucru trebuie s fie independente (modulare) i puternic integrate n ansamblul sistemului. Aceast structur modular integrat permite utilizatorilor construirea rapid a unui sistem de msur i modificarea lui simpl atunci cnd cerinele sistemului se schimb.Pentru o complet integrare a mediilor de dezvoltare a aplicaiilor cu programele de msur i control, este deosebit de important ca mediul de dezvoltare utilizat utilizat s permita un sistem de msurare i automatizare care s poat gestiona i procesa msurtorile. Pentru aceasta, mediile de dezvoltare a aplicaiilor trebuie s incorporeze tipuri de date de msurare direct n mediul lor, astfel nct s poat fi utilizate uor n rutinele de procesare adiional. Pentru a crete la maximum productivitatea, mediile de dezvoltare a aplicaiilor trebuie s includ att funcii statistice i de analiz numeric ct i algoritmi de procesare a semnalelor i control de nalt performan, comuni n aplicaiile de msurare. Mediile de dezvoltare a aplicaiilor trebuie s includ rutine tipice ntlnite n aplicaiile de msurare i automatizare, incorpornd funcii de preprocesare, de reglare PID sau control cu tehnici din domeniul sistemelor expert.

    Varianta pentru C++BuilderIn fisierul control01.h se afla declaratia clasei proiectate pentru lucrul cu modulul de interfata/-------------------------------------------------------------------------#ifndef control01H#define control01H//-------------------------------------------------------------------------#include "aux01.h"

    24

  • #include "test2.h"class INTERFATA_U3 { char i_o[22],d_a[22]; bool counter[22]; int timer[22]; unsigned int frecv_cit[22]; double valA_in[22]; bool valD_in[22]; LJ_ERROR lngErrorcode;

    long lngGetNextIteration;double dblDriverVersion;long lngIOType, lngChannel;double dblValue;double Value2,Value3;double ValueDIBit,ValueDIPort,ValueCounter;LJ_HANDLE lngHandle;char ch;

    void outD(bool *vo); void outA(double a1,double a2); public: INTERFATA_U3(TForm_INTERFATA_U3 *f); ~INTERFATA_U3(){}; void idle(); };#endif

    In fisierul control01.cpp sunt explicitate metodele din cadrul clasei proiectate pentru lucrul cu modulul de interfata //------------------------------------------------------------------------#include "control01.h"#include "aux01.h"#include "test2.h" INTERFATA_U3::INTERFATA_U3(TForm_INTERFATA_U3 *f) {for(int i=0;i

  • //Start by using the pin_configuration_reset IOType so that all //pin assignments are in the factory default condition. lngErrorcode = m_pePut (lngHandle, LJ_ioPIN_CONFIGURATION_RESET, 0, 0, 0); ErrorHandler(lngErrorcode, __LINE__, 0); for(int i=0;iRowCount;k++) if(f->VLE_IN->Keys[k]!=f->cb_name[i]) continue; int n_=0; if(iCB[i]->Text=="T1") timer[i]=f->CBT1->ItemIndex; if(f->CB[i]->Text=="T2") timer[i]=f->CBT2->ItemIndex; if(f->CB[i]->Text[0]=='A') d_a[i]='a'; else if(f->CB[i]->Text[0]!='-') d_a[i]='d'; if(f->CB[i]->Text[0]=='C') counter[i]=true; if(f->CB[i]->Text[0]=='T') timer[i]=true; } }//endfor i //out //setare canale intrari analogice -- codA_in: 1 binar- analog, 0 binar- digital unsigned long codA_in=0; for(int i=0;i
  • {int i,nt; for(i=0,nt=0;i
  • case LJ_ioGET_DIGITAL_BIT :valD_in[lngChannel]=dblValue;break; case LJ_ioGET_DIGITAL_PORT :;break; case LJ_ioGET_COUNTER :valD_in[lngChannel]=dblValue;break;

    } lngErrorcode = m_pGetNextResult(lngHandle, &lngIOType, &lngChannel, &dblValue, 0, 0); if(lngErrorcode != LJE_NO_MORE_DATA_AVAILABLE) {ErrorHandler(lngErrorcode, __LINE__, lngGetNextIteration);}

    lngGetNextIteration++;}

    Fisierul aux01.h contine initializarea modulului de interfata#ifndef aux01#define aux01#include #include #include "LabJackUD.h"#include "LJUD_DynamicLinking.h"#include

    //Start of LoadLabJackUD function.//This is the function used to dynamically load the DLL.void LoadLabJackUD (void){ //Now try and load the DLL. if (hDLLInstance = LoadLibrary("labjackud.dll")) { //If successfully loaded, get the address of the functions. m_pListAll = (tListAll)::GetProcAddress(hDLLInstance,"ListAll"); m_pOpenLabJack = (tOpenLabJack)::GetProcAddress(hDLLInstance,"OpenLabJack"); m_pAddRequest = (tAddRequest)::GetProcAddress(hDLLInstance,"AddRequest"); m_pGo = (tGo)::GetProcAddress(hDLLInstance,"Go"); m_pGoOne = (tGoOne)::GetProcAddress(hDLLInstance,"GoOne"); m_peGet = (teGet)::GetProcAddress(hDLLInstance,"eGet"); m_pePut = (tePut)::GetProcAddress(hDLLInstance,"ePut"); m_pGetResult = (tGetResult)::GetProcAddress(hDLLInstance,"GetResult"); m_pGetFirstResult = (tGetFirstResult)::GetProcAddress(hDLLInstance,"GetFirstResult"); m_pGetNextResult = (tGetNextResult)::GetProcAddress(hDLLInstance,"GetNextResult"); m_peAIN = (teAIN)::GetProcAddress(hDLLInstance,"eAIN"); m_peDAC = (teDAC)::GetProcAddress(hDLLInstance,"eDAC"); m_peDI = (teDI)::GetProcAddress(hDLLInstance,"eDI"); m_peDO = (teDO)::GetProcAddress(hDLLInstance,"eDO"); m_peAddGoGet = (teAddGoGet)::GetProcAddress(hDLLInstance,"eAddGoGet"); m_peTCConfig =

    28

  • (teTCConfig)::GetProcAddress(hDLLInstance,"eTCConfig"); m_peTCValues = (teTCValues)::GetProcAddress(hDLLInstance,"eTCValues"); m_pResetLabJack = (tResetLabJack)::GetProcAddress(hDLLInstance,"ResetLabJack"); m_pDoubleToStringAddress = (tDoubleToStringAddress)::GetProcAddress(hDLLInstance,"DoubleToStringAddress"); m_pStringToDoubleAddress = (tStringToDoubleAddress)::GetProcAddress(hDLLInstance,"StringToDoubleAddress"); m_pStringToConstant = (tStringToConstant)::GetProcAddress(hDLLInstance,"StringToConstant"); m_pErrorToString = (tErrorToString)::GetProcAddress(hDLLInstance,"ErrorToString"); m_pGetDriverVersion = (tGetDriverVersion)::GetProcAddress(hDLLInstance,"GetDriverVersion"); m_pTCVoltsToTemp = (tTCVoltsToTemp)::GetProcAddress(hDLLInstance,"TCVoltsToTemp"); } else { printf("\nFailed to load DLL\n"); getchar(); exit(0); } // m_pOpenLabJack now holds a pointer to the OpenLabJack function. The compiler // automatically recognizes m_pOpenLabJack as a pointer to a function and // calls the function with the parameters given. If we created another // variable of type tOpenLabJack and simply put "pNewVar = m_pOpenLabJack", // then the compiler might not know to call the function.}//End of LoadLabJackUD function.//This is our simple error handling function that is called after every UD//function call. This function displays the errorcode and string description//of the error. It also has a line number input that can be used with the//macro __LINE__ to display the line number in source code that called the//error handler. It also has an iteration input is useful when processing//results in a loop (getfirst/getnext).void ErrorHandler (LJ_ERROR lngErrorcode, long lngLineNumber, long lngIteration){

    char err[255];if (lngErrorcode != LJE_NOERROR)

    29

  • {m_pErrorToString(lngErrorcode,err);printf("Error number = %d\n",lngErrorcode);printf("Error string = %s\n",err);printf("Source line number = %d\n",lngLineNumber);printf("Iteration = %d\n\n",lngIteration);if(lngErrorcode > LJE_MIN_GROUP_ERROR){

    //Quit if this is a group error.getchar();exit(0);

    } }}#endif

    In fisierul LabJackUD.h se afla declaratiile metodelor puse la dispozitie de fabricant pentru lucrul cu modulul de achizitie

    Utilizarea clasei este realizata in modulul software de interfata cu utilizatorul. Aceasta este continuta in fisierele test2.h si test2.cpp.

    #include #include "aux01.h"#include "control01.h"#pragma hdrstop#include "test2.h"//---------------------------------------------------------------------------#pragma package(smart_init)#pragma resource "*.dfm"TForm_INTERFATA_U3 *Form_INTERFATA_U3;INTERFATA_U3 *ix;bool instantiat=false;//---------------------------------------------------------------------------__fastcall TForm_INTERFATA_U3::TForm_INTERFATA_U3(TComponent* Owner) : TForm(Owner){ cb_[0]=cb00_;cb_[1]=cb01_;cb_[2]=cb02_;cb_[3]=cb03_;cb_[4]=cb04_; cb_[5]=cb05_;cb_[6]=cb06_;cb_[7]=cb07_;cb_[8]=cb08_;cb_[9]=cb09_; cb_[10]=cb10_;cb_[11]=cb11_;cb_[12]=cb12_;cb_[13]=cb13_;cb_[14]=cb14_; cb_[15]=cb15_;cb_[16]=cb16_;cb_[17]=cb17_;cb_[18]=cb18_;cb_[19]=cb19_;cb_[20]=cb20_;cb_[21]=cb21_; CB[0]=CB00;CB[1]=CB01;CB[2]=CB02;CB[3]=CB03;CB[4]=CB04; CB[5]=CB05;CB[6]=CB06;CB[7]=CB07;CB[8]=CB08;CB[9]=CB09; CB[10]=CB10;CB[11]=CB11;CB[12]=CB12;CB[13]=CB13;CB[14]=CB14; CB[15]=CB15;CB[16]=CB16;CB[17]=CB17;CB[18]=CB18;CB[19]=CB19;

    30

  • char c[22][10]={"FIO00","FIO01","FIO02","FIO03","FIO04","FIO05","FIO06","FIO07", "EIO08","EIO09","EIO10","EIO11","EIO12","EIO13","EIO14","EIO15", "CIO16","CIO17","CI1O18","CEIO19","DAC0","DAC1"}; for(int i=0;iText=="A-I"||s; out=CB[i]->Text=="D-O" ||CB[i]->Text=="C"||s; } else {out=true;in=false;} if(out&&in) {ShowMessage("Eroare");return false;} if(!out && !in) return false; if(cb_[i]->Checked) { int k; if(VLE_IN->FindRow(ach,k)||VLE_OUT->FindRow(ach,k)) return false; if(in) {if(VLE_OUT->FindRow(ach,k)) VLE_OUT->DeleteRow(k); VLE_IN->InsertRow(ach,"",true); } if(out) {if(VLE_IN->FindRow(ach,k)) VLE_IN->DeleteRow(k); VLE_OUT->InsertRow(ach,"",true); } } else {int k; if(VLE_IN->FindRow(ach,k)) VLE_IN->DeleteRow(k); if(VLE_OUT->FindRow(ach,k)) VLE_OUT->DeleteRow(k); } return true; }//---------------------------------------------------------------------------void __fastcall TForm_INTERFATA_U3::cb07_Click(TObject *Sender){ oper(7);}//---------------------------------------------------------------------------

    void __fastcall TForm_INTERFATA_U3::B_STARTClick(TObject *Sender){ if(B_START->Caption=="START")

    31

  • {B_START->Caption="STOP";B_START->Font->Color=clRed;ix=new INTERFATA_U3(this);return;} if(B_START->Caption=="STOP") {B_START->Caption="START";B_START->Font->Color=clGreen;delete ix; return;} }//-----------------------------------------------------------------------void __fastcall TForm_INTERFATA_U3::cb00_Click(TObject *Sender){ oper(0);}void __fastcall TForm_INTERFATA_U3::cb01_Click(TObject *Sender){ oper(1); }//-------------- idem de la 02 la 21void __fastcall TForm_INTERFATA_U3::cb21_Click(TObject *Sender){oper(21); }//----------------------------------------------------------------------void __fastcall TForm_INTERFATA_U3::T1Timer(TObject *Sender){ static bool proces; if(!instantiat) return; if(B_START->Caption!="STOP") return; if(proces) return; proces=true; ix->idle(); proces=false;}//------------------------------------------------------------------------

    32

  • 33

  • STOCAREA DATELOR CU STRUCTUR COMPLEXAceste date i dezvolt structura n timp, deci nu pot

    fi stocate n simple tabele. Aceast structur a datelor implic i o serie de relaii ntre acestea. Sunt memorate att entitile ct i legturile dintre acestea (Figura 1).

    O structur variabil n timp implic i o interfa flexibil cu utilizatorul. Gestionarea interfeei se realizeaz printr-o clas ce memoreaz legturile dintre controale i date printr-o tabel de mapare stocat pe server.

    INTERFA CLIENT

    BIBLIOTECCLASE C++

    SERVERPostgreSQL

    EDITARE STRUCTUR

    DATE

    Fluxul informaional

    O arhitectur minimal ar trebui s cuprind un tabel resorce_ cu datele efective n format XML, un tabel object_ cu datele despre resurse externe precum fiiere sau pagini WEB, un tabel relation_ cu legturile ntre resurse sau ntre resurse i obiecte i un tabel logentry_ cu evenimentele de editare a acestora.

    34

  • relation_

    id uuid

    status

    Notes xml

    natureright

    Idright uuid

    type

    idleftf uuid

    natureleft

    anulat

    resource_

    id uuid

    type uuid

    schema uuid

    Anulat boolean

    bc_nr_inventarnotes xml

    status int

    creationtimpstamp

    xmldocument xml

    id uuid

    type

    folder

    item_id_res::res_ID

    object_

    filename:

    status

    anulat

    id:: uuidlog_item_ref uuid

    action::(lista1)item_ref::res_ID

    xpath:://..element:::objecteditor::username

    logentry_

    date/time

    Fig.2 Structura tabelelor pentru stocarea datelorrelation_ id uuid NOT NULL, -- ID-ul relatiei type uuid, -- Guid-ul tipului de relatie [typ_ID] idleft uuid NOT NULL, -- Guid-ul relatei din stanga (Domeniu) [res_ID, obj_ID] natureleft character varying(32) NOT NULL, -- Natura relatei stangi (resursa, obiect) idright uuid NOT NULL, -- Guid-ul relatei din dreapta (Codomeniu) [res_ID, obj_ID] natureright character varying(32), -- Natura relatiei drepte (resursa, obiect) status integer, -- Statutul relatiei variabil intern, cod dependent de aplicatie notes xml, -- descriere anulat booleanobject_ id uuid NOT NULL, -- id-ul obiectului filename text NOT NULL, -- fiierul n care este stocat obiectul type text NOT NULL, -- tipul obiectului status text, -- variabil intern folder text, -- calea unde se afl fiierul notes xml, -- descriere

    35

  • item_id_ref uuid, -- id-ul resursei la care face referire obiectul anulat boolean DEFAULT false,logentry_ id uuid NOT NULL, --Identificatorul (guid) nregistrrii item_ref uuid NOT NULL, -- Guid-ul entitatii afectate [res_ID, rel_ID, obj_ID] datetime timestamp with time zone NOT NULL, -- Momentul actiuniii action character varying(64) NOT NULL, -- Actiunea (creare, stergere, inserare, modificare, publicare, retragere a obiectului) xpath character varying(512), -- Localizarea elementului in interiorul entitatii element xml, -- Elementul sters sau inlocuit editor uuid, -- ID-ul persoanei care a executat actiunea notes xml, -- descriereresource_ id uuid NOT NULL, -- Identificatorul (guid) resursei type uuid, -- Guid-ul tipului de resursa [typ_ID] schema uuid, -- Guid-ul schemei xsd [sch_ID] xmldocument xml NOT NULL, -- Documentul XML ce descrie/reprezinta resursa notes xml, -- descriere creationtimpstamp timestamp without time zone, anulat boolean NOT NULL DEFAULT false, status character varying, -- variabil intern...

    Toate resursele au cte un identificator unic de tip GUID (128 bii) i cte un cmp pentru marcarea anulrii pentru resursa respectiv. Informaiile sunt stocate n formate XML.

    Relaiile de tip left/right permit construcia relaiilor de tip orientat. Cmpul status poate fi utilizat pentru stocarea unor clasificri ale resurselor sau a legturilor dintre acestea.

    ADMINISTRAREA DREPTURILOR DE ACCESEste dificil de aplicat restricii de acces la date

    aflate n structuri de tip XML i aflate n interdependen. n acest caz fiecare instruciune SQL necesit i o component de tipul WERE unde se vor aduga restriciile de acces specifice fiecrui grup de utilizatori. Restriciile de acces sunt grupate n restricii de scriere i restricii de citire.

    36

  • SELECT Server Side : RD - Restriction function (FnRD

    )AND

    Local group : RD - Restriction function (FnxRD

    )AND

    Application restrictions

    UPDATE Server Side : WR - Restriction function (FnWR

    )AND

    Local group :WR - Restriction function (FnxWR

    )AND

    Application restrictionsDELETE

    INSERT Function for evaluation of inserted rows restrictions

    UPDATE Function for evaluation ofUpdated rows restrictions

    Implementarea restriciilor

    Pentru operaiile de INSERT i UPDATE este necesar o simulare prealabil a acestora n vederea verificrii datelor afectate. Altfel ar fi posibil ca un utilizator s adauge date, prin editare fr selecie, pentru care nu are acces.

    O aplicabilitate imediat a acestor tehnici o constituie gestiunea nomenclatoarelor pentru echipamentele electronice. De obicei un nomenclator conine: Referin tehnic, Referin comercial, Descriere, furnizor, etc. Codificrile se pot schimba frecvent fr a exista schimbari semnificative ale echipamentului, iar o cutare ulterioar nu va permite cumularea cu echipamentele similare. n acest caz sunt necesare definiri de tipul conceptelor i termenilor, conceptul fiind dat de funcionalitatea general a echipamentului. De asemenea componentele acestor echipamente pot fi interschimbate ceea ce inpune definirea unor relaii ntre componentele compatible ale echipamentelor.

    Ex: de stabilire drepturi de acces

    create schema c6;--GROUP ROLES --- grupuri de acces, un utilizator (LOGIN ROLES) poate sa apartina unui grup sau mai multor grupuri de acces-- accesul este:-- la nivel de baza de date-- la nivel de schema

    38

  • --la nivel de tabel--la nivel de functii--la nivel de secvente--etc--Tipurile de acces variaza in functie de tipul obiectului caruia i se adreseaza-- de ex:

    --la nivel de baza de date avem acces pentru: conectare si creare,--la nivel de schema : utilizare si creare (de obiecte in cadrul

    schemei)--la nivel de tabel : select, insert, update,delete, evenimente triger,

    etc

    --DREPTURILE de ACCES se pot da fie la nivel de grup (recomandat) fie la nivel de utilizator--creare grupuri de acces-- DROP ROLE "CONSULTARE2";CREATE ROLE "CONSULTARE2" NOSUPERUSER NOINHERIT NOCREATEDB NOCREATEROLE;CREATE ROLE "EDITARE2" NOSUPERUSER NOINHERIT NOCREATEDB NOCREATEROLE;CREATE ROLE "SUPERVIZOR2" SUPERUSER INHERIT CREATEDB CREATEROLE;--creare utilizatori--DROP ROLE student21; CREATE ROLE student21 LOGIN PASSWORD '123' -- (student21 este ) NOSUPERUSER NOINHERIT NOCREATEDB NOCREATEROLE CONNECTION LIMIT 1; -- CONNECTION LIMIT 1 --->este permisa o singura conexiune pentru utilizator (nu pot intra simultan doi utilizatotori cu acelasi )--atrbuire pentru student21 a drepturilor de acces specifice grupului "CONSULTARE2" -- LOGIN face deosebirea intre grup de acces si utilizator (grupurile nu se pot 'loga')GRANT "CONSULTARE2" TO student21;CREATE ROLE student22 LOGIN PASSWORD '12' CONNECTION LIMIT 1;GRANT "CONSULTARE2" TO student22;GRANT "EDITARE2" TO student22; -- DROP ROLE student23CREATE ROLE student23 LOGIN PASSWORD '1' CONNECTION LIMIT 5;GRANT "CONSULTARE2" TO student23;GRANT "EDITARE2" TO student23;GRANT "SUPERVIZOR2" TO student23;-- cream un tabel cu diverse drepturi de accesCREATE TABLE c6.t1(a serial PRIMARY KEY, b varchar(10),c int);INSERT INTO c6.t1(b,c) VALUES('A1',10),('A2',20),('A3',30);select * from c6.t1;--Pentru un GRUP

    39

  • --1. Se ofera acces la nivel de BAZA DE DATEGRANT CONNECT ON DATABASE "CURS_BD2012" TO "CONSULTARE2";GRANT CONNECT ON DATABASE "CURS_BD2012" TO "EDITARE2";GRANT ALL ON DATABASE "CURS_BD2012" TO "SUPERVIZOR2";

    /* NOTA:PENTRU TESTAREA DREPTURILOR DE ACCES DIN pgAdmin3 se va deconecta serverul de baze de date curentsi se va reintra cu numele si parola utilizatorului ales-- se vor testa drepturi ptr.: creare obiecte(database,schema, tabel,etc)

    stergere inregistrariactualizare inregistrariinserare inregistrari

    pentru cele 3 campuri ale tabelului.*/--2. Se ofera acces la nivel de schemaGRANT USAGE ON SCHEMA c6 TO "CONSULTARE2";GRANT USAGE ON SCHEMA c6 TO "EDITARE2";GRANT ALL ON SCHEMA c6 TO "SUPERVIZOR2";--3.Se ofera acces la nivel de tabel, sequence, function, etc.GRANT ALL ON TABLE c6.t1 TO "SUPERVIZOR2";GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE c6.t1 TO "EDITARE2";GRANT SELECT ON TABLE c6.t1 TO "CONSULTARE2";

    40

  • DEZVOLTAREA APLICATIILOR SOFTWARE DE LOGISTICADezvoltarea unor astfel de aplicatii se poate realiza intr-o maniera clasica prin utilizarea unor tabele cu intrari, stoc, iesiri, transferuri, etc. sau utilizand o tehnica ce se reduce la evenimente si stari.In continuare este prezenntat un exemplu clasic de arhitectura a unei aplicatii software de gestiune a stocurilor. Ex:Sa se proiecteze o baza de date pentru gestiunea stocurilor avand urmatoarele specificatii:

    fiecare cutie are cate un cod, o referinta tehnica si o descriere corespunzatoare acestora

    magazia este formata din mai multe depozite, fiecare avand amplasamente specifice

    fiecare cutie mai are atasat, optional: furnizor, comanda sunt cutii care contin si cantitati fragmentate (ex:

    cabluri: 1,5 m) receptia se realizeaza initiatial in cadrul unui borderou

    de receptie (BR) care apoi se valideaza inainte de livrare se realizeaza rezervarea marfii prin

    constituirea borderoului de preparare (BP), borderou ce se transforma in borderou de livrare (BL) in momentul validarii BP pentru livrare

    marfurile se pot transfera dintr-un depozit in altulR: In acest sens s-au definit urmatoarele tabele si campuri:

    ARHITECTURA FLUXULUI DE DATE este data de diagrama urmatoare

    41

  • Flux informational implementat de o aplicatie standard de logistica stocurilor

    Blocurile au urmatoarea structura:

    42

    brvalidare

    Operator

    XLS, CSV, etc

    id_in

    id_st id_bp id_blvalidare

    rezervare

    Actualizare stoc

    tr

    Actualizare stoc

    Operator

    Operator

    nom

    amplasOperator Operator

    1 2

    3

    4 6

    a

    b

    c

    d

    e

    f

    5

    g

    7

  • Operatii de editare a stocurilor

    1- introducere date manual sau import fisiere CSV/XLS2 validarea br , adaugarea inreg in id_in si stergerea inregistrarilor din br3 adaugare automata a inregistrarilor si in stoc (ID-ul din id_in se va copia si in id_st)4 - operatorul selecteaza din stoc liniile ce vor fi livrate5 rezervare cantitati (se scade cantitatea disponibila)6 validare BP, inserare inregistrari in id_bl7 actualizarea cantitatilor fizice in urma livrariia introducere de coduri noi durect de la operatorulb actualizare nomenclator pe baza intrarilor, modificari in intrari pe baza acestuiac introducere de noi coduri de depozite si amplasamente direct de operatord - preluarea prin selectie de noi coduri de depozite si amplasamentee selectia depozitelor si amplasamentelor din cadrul transferurilorf selectia din stoc de catre operator in vederea

    43

    id_in#ID DataINCodDescrRefTehNrCdaFurnizorDepInitAmpInitQteUMValUBR

    id_bl#ID #BLQteDestinatieDataLiv

    id_st#ID #Dep#AmpQteFizQteDisp

    tr#ID #BT#DepSrs#AmpSrs#DepDest#AmpDestDestinatieDataTr

    nom#Cod #RefTehDescriere

    Amplas#Dep#Amp

    id_bp#ID #BPQteDestinatieDataLiv

    br#BR #idxDataINCodRefTehDescrNrCdaFurnizorDepInitAmpInitQteUMValU

  • transferurilorg actualizarea stocurilor in urma transferurilor

    Structura datelor este data de urmatorul tabel:

    IDserial/autoinc(

    id_in)AmpInit varchar(7)

    ID int (id_st, id_out, id_tr, id_bp,id_bl)

    Amp varchar(7)

    idx serial/autoinc AmpSrs varchar(7)DataIN date AmpDest varchar(7)DataLiv date Qte numeric (id_in, id_tr,

    id_bp, id_bl)DataTr date QteFiz numericCod varchar(10) QteDisp numericDescr varchar(100) UM varchar(10)RefTeh varchar(20) ValU numericNrCda varchar(15) BR serial/autoinc (br)Furnizor varchar(30) BR int (id_in)DepInit varchar(3) BT serial/autoincDep varchar(3) BP serial/autoincDepSrs varchar(3) BL intDepDest varchar(3) Destinatie varchar(30)

    44

  • --STRUCTURA BD --- LOGISTICA STOCURILOR ----- VARIANTA 2 --- FARA TABELE TEMPORARE --- varianta simplificata--- CREARE STRUCTURA TABELE PERMANENTE PENTRU SISTEM DE LOGISTICA STOCURILOR (gestiunea unor depozite)------ sistemul are mai multe depozite si permite gestiunea stocurilor pentru marfuri ce nu au SerialNo --DROP SCHEMA IF EXISTS c9 CASCADE;CREATE SCHEMA c9;--tabel cu nomenclatorul de produseDROP TABLE IF EXISTS c9.nom;create table c9.nom(idnom serial PRIMARY KEY,cod varchar(30),descriere varchar(100),um varchar(10));--tabel cu intrariDROP TABLE IF EXISTS c9.inx;create table c9.inx(idin serial PRIMARY KEY, -- id unic ptr. fiec inregidnom int NOT NULL, -- identif. unic in cadrul nom.qtyin int DEFAULT 1, -- intdatain date DEFAULT CURRENT_DATE,br int, -- numarul borderoului de receptie --- mai multe linii de intrare sunt grupate sub un borderoudepini varchar(20),--depozitul initialampini varchar(20),utilizator varchar(50) DEFAULT CURRENT_USER,CONSTRAINT f1_incx FOREIGN KEY(idnom) REFERENCES c9.nom(idnom) -- adica toate idnom din tabel trebuie sa se regaseasca in c9.nom); --nr. borderou receptie

    --tabel cu alte campuri asociate intrariiDROP TABLE IF EXISTS c9.inaux;create table c9.inaux(idin int PRIMARY KEY, -- identic cu cel din in po varchar(100), -- process order (nr. czii)supplier varchar(100),serialno varchar(50),coment varchar(100),status varchar(20) DEFAULT 'NOU', -- stare item (nou,defect,rebut,reconditionat,etc.)CONSTRAINT f1_inaux FOREIGN KEY(idin) REFERENCES c9.inx(idin) );

    --tabel cu stocul curentDROP TABLE IF EXISTS c9.stx;

    45

  • create table c9.stx(dep varchar(20), -- depozitamp varchar(20), -- amplasamentidin int NOT NULL,qtyfiz int NOT NULL, --cantitate fizicaqtydisp int NOT NULL, -- cant. disponibilaCONSTRAINT k_stx PRIMARY KEY(dep,amp,idin),CONSTRAINT f1_stx FOREIGN KEY(idin) REFERENCES c9.inx(idin) );

    -- qtyin : cantitate intrata-- qtyfiz : cantiatea efectiva existenta in stoc-- qtydisp: cantitatea ramasa in urma rezervarii marfurilor in vederea livrarii-- rezervarea se realizeaza prin crearea unui BP (borderou de preparare)-- qtyrez: cantiate rezervata in vederea livrarii -- camp in cadrul tabelului temporar BP,-- qtyconf: cantitate confirmata, campul apare in momentul validarii BP, qtyconf

  • descriere varchar(100),qtyin int, um varchar(10), po varchar(100), serialno varchar(50),coment varchar(100),idin int,depini varchar(20),ampini varchar(20),

    CONSTRAINT k__br PRIMARY KEY(br,idx), -- definim cheia externa - legatura intre br_ si _br

    CONSTRAINT f1__br FOREIGN KEY(br) REFERENCES c9.br_(br));

    -------------------------------------------------------------------------------------------------- creare Borderou de Preparare (BP)DROP TABLE IF EXISTS c9._bp;DROP TABLE IF EXISTS c9.bp_;--tabelul parinte, contine date la nivel de BPCREATE TABLE c9.bp_(

    bp int PRIMARY KEY, databp date, dest varchar(50),utilizator varchar(50) DEFAULT CURRENT_USER);

    -- tabelul copil, contine liniile cu inregistrarile corespunzatoare fiecarui BPCREATE TABLE c9._bp(

    bp integer, dep varchar(20), amp varchar(20), qtyrez int, qtyconf int, idin int,CONSTRAINT k__bp PRIMARY KEY(bp,idin));

    ---------------------------------------------------------------------------------------------------functie ptr. validarea BRcreate or replace function c9.br_valid(_br_ int) returns void as$$--insereaza liniile din _br,br_ in inxINSERT INTO c9.inx(br,idnom,datain,qtyin)

    SELECT br_.br,_br.idnom,br_.datain,_br.qtyin FROM c9.br_,c9._br WHERE br_.br=_br.br and _br.br=$1;

    INSERT INTO c9.inaux(po,supplier,serialno,coment) SELECT _br.po,br_.supplier,_br.serialno,_br.coment

    FROM c9._br,c9.br_, c9.inx WHERE br_.br=_br.br and _br.br=$1;-- adauga in stocINSERT INTO c9.stx( dep, amp, idin, qtyfiz, qtydisp)

    47

  • SELECT depini,ampini,idin,qtyin,qtyin FROM c9.inx WHERE br=$1;-- sterge datele adaugate din _br si br_DELETE FROM c9._br WHERE _br.br=$1;DELETE FROM c9.br_ WHERE br_.br=$1; $$language sql;------------------------------------------------------------------------------------------------CREATE OR REPLACE FUNCTION c9.bp_valid(_bp_ int) RETURNS void AS$$--adaugare in outxINSERT INTO c9.outx(bl,idin,qtyliv,qtyrez,qtyconf,dest,dataliv,dep,amp,utilizator)

    SELECT bp_.bp as bl,_bp.idin,_bp.qtyconf as qtyliv,_bp.qtyrez,_bp.qtyconf,

    bp_.dest,bp_.databp as dataliv,_bp.dep,_bp.amp,bp_.utilizator FROM c9.bp_,c9._bp WHERE bp_.bp=_bp.bp AND bp_.bp=$1;

    --scade din stoc -- qtyconf=qtyliv UPDATE c9.stx SET qtyfiz=qtyfiz-qtyconf, qtydisp=qtydisp+qtyrez-qtyconf

    FROM c9._bpWHERE _bp.dep=stx.dep AND _bp.amp=stx.amp AND _bp.idin=stx.idin AND

    _bp.bp=$1; -- sterge din stoc liniile cu qtyfiz=0 DELETE FROM c9.stx WHERE qtyfiz

  • TEHNICI DE TESTARE A APLICATIILOR SOFTWARE

    Testarea black-box (fara examinarea sursei)-> e aplicabila oricarui produs-> nu necesita efort pentru examinarea / analiza sursei-> aplicabila de la simplu la complex

    Tipuri de testare black-box Sunt analizate doar functiile finale (cele corespunzatoare iesirilor din black-box)-> Testarea functiilor : Se testeaza fiecare functiile (caracteristicile) separat; Testele se realizeaza in regim normal de lucru (fara a duce datele de intrare la limite)-> Testarea domeniilor de valori: sunt testate variabilele de intrare separat cu valori aleatorii in toata gama de definitie. Se acorda o atentie deosebita limitelor domeniului de incercari.

    -> Testarea bazata pe specicatii: sunt realizate teste ce implica anumite secvente de lucru. Sunt cautate ambiguitati valori pentru care exista mai multe posibilitati ale rezultatului

    ->Testare axata pe riscuri (risk-based testing): se imagineaza o modalitate de esec si se genereaza teste pentru ea.

    Strategii de testare-> Testarea la limita (stress testing): se testeaza programul: 1) la efort mare 2) la/dincolo de limitele specificate 3) pentru a vedea cum esueaza

    -> Testarea de regresie: set de teste proiectate pentru refolosire (la fiecare modicare) in vederea mentenantei

    -> Testarea de catre utilizatori reali, nu simulati (beta testing), pe scenarii specicate dinainte, sau aleator

    Testarea bazata pe scenarii - caz specic de utilizare, bazat pe model (use case)

    -> Testarea bazata pe stari (state-model-based testing) se realizeaza o analiza a starilor in care se afla aplicatia si a tranzitiilor ce permit trecerea dintr-o stare in alta. Sunt analizate coliziunile si cursele critice.

    49

  • -> Testarea automata de volum ridicat de date la intare

    Partitionarea in clase de echivalenta Analiza domeniului de valori pentru fiecare variabila de intrare,identic^and multimi pt. care presupunem ca testele se comporta la fel. Astfel se pot genera seturi relevante de conditii pentru testareUn caz de test ar trebui sa acopere c^at mai multe conditii relevante (sa reduca numarul conditiilor de analizat)

    Testarea conditiilor limita-> Cazuri de test derivate si din domeniul valorilor de iesire, nu doar alcelor de intrare

    Constrangeri , limitari date de tipul de date dau de domenii de valori

    Testarea folosind analiza cauza-efectTestarea bazata pe clase de echivalenta nu permite combinarea conditiilor-> Intr-o combinatie de conditii, trebuie acoperit fiecare factor in parteEtape:-> se descompune specicatia in componente de dimensiuni mai mici-> se identica:

    cauzele: conditii/clase de echivalenta de intrareefectele: conditie la iesire/modicare de stare

    -> se exprima specicatia sub forma de reguli boolene, sau graf-> se precizeaza combinatiile imposibile-> se converteste intr-un tabel de decizie partial

    50