Proiectarea Si Securitatea Orientata pe Servicii Web

CAPITOLUL I

SERVICII WEB

1.1 Introducere

Într-o eră în care informația devine din ce în ce mai abundentă și din ce în ce mai necesară apare nevoia ca această informație să fie clasificată, ordonată, aranjată. Clasificarea și ordonarea informațiilor este vitală pentru evitarea acumulărilor inutile și nefolositore de informații, pentru perimarea acestora, arhivarea în mod constant și corect etc. Aceste acumulări de informații trebuie să fie strict la obiect, și corect este să avem doar informația care ne este utilă.

Domeniul gestiunii informațiilor abordează problema organizării, stocării și regăsirii în timp util a datelor de care dispunem despre un anumit subiect. Neîndoielnic că fiecare dintre noi ne confruntăm continuu cu această problemă. Agenda personală, cartea de telefon, sunt mijloace simple de organizare, păstrare și regăsire a datelor de care avem nevoie la un moment dat. Această problemă legată de stocarea informațiilor, organizarea și regăsirea lor a fost rezolvată cu ajutorul bazelor de date.

O bază de date este o colecție de informații corelate, referitoare la un anumit subiect sau colectate, organizate și memorate într-un anumit scop. Sistemul care permite colectarea, organizarea, memorarea și regăsirea informațiilor dintr-o bază de date se numește sistem de gestiune a bazelor de date. Acest sistem poate să fie unul convențional în care informațiile sunt stocate pe hârtie, depuse în dosare, registre, rafturi, încăperi, etc., sau poate să fie computerizat, caz în care informațiile sunt păstrate pe suport magnetic în volume, repertorii, fișiere pe suport magnetic. În cazul stocării informațiilor pe suport magnetic, operarea în baza de date se face prin intermediul unor programe.

S-a ajuns astfel la o situație în care fiecare firmă sau instituție trebuie să își dezvolte propriul sistem informatic de gestionare a bazei de date, dat fiind faptul că încă nu există un sistem informatic atât de general și de flexibil încât să se adapteze cerințelor oricărei organizații, cu atât mai mult, pentru o societate comercială, posibilitatea de a lucra nemijocit cu clientul (local, dar și la distanță) este o oportunitate deosebită. Prin realizarea ieșirii pe Internet și dând clientului posibilitatea să găseasca singur, de acasă, toate informațiile, ba mai mult, dând posibilitatea să vizualizeze cataloage de produse, devize și lucrări de referință reprezintă un pas important în realizarea integrării propriilor date și sisteme de afaceri cu alți oameni și alte firme din țară și din străinătate.

Webul a fost inventat în 1989 la Centrul European de Cercetări Nucleare (CERN) din Geneva, Elveția. Propunerea inițială de creare a unei colecții de documente având legături între ele a fost făcută de Tim Berners-Lee în martie 1989. Propunerea a apărut în urma problemelor de comunicare pe care le întâmpinau echipele de cercetători ce foloseau centrul, chiar și folosind poșta electronică.

Primul prototip al acestei colecții (mai întâi în format de text simplu) a apărut nu mult înainte de decembrie 1991, când s-a făcut prima lui demonstrație publică. Studiul a fost continuat prin apariția primei aplicații grafice Mosaic, în februarie 1993, realizată de cercetătorul Marc Andreessen de la centrul universitar National Center for Supercomputing Applications (NCSA) din orașul Urbana-Champaign din statul federal Illinois, SUA.

Un serviciu Web este o metodă de comunicare între două dispozitive electronice din cadrul internetului. Un serviciu web se mai poate defini ca fiind un set de protocoale și standarde folosite pentru schimbul de informații între aplicații sau sisteme. Aplicatiile software realizate în limbaje de programare diferite și care rulează pe diferite platforme pot folosi servicii web pentru a intershimba date pe Internet, într-un mod asemănător comunicării inter-procese pe un singur calculator.

Serviciul Web este bazat pe un set minim de concepte: seviciu, document XML, adresă, plic. În plus, toate serviciile Web trebuie să expună o interfață care este exprimată folosind WSDL (Web Service Definition Language). Mesajele conținute de plic și interfețele WSDL sunt bazate pe XML. O definiție mai formală a unui serviciu Web, bazată pe documentele W3 Consortium, organismul care se ocupă de elaborarea standardului pentru ele. Astfel un serviciu Web este o aplicație identificată printr-un URI (Uniform Resource Identifier) ale cărei interfețe și legături pot fi definite, descrise și descoperite folosind XML și pot interacționa în mod direct cu alte aplicații folosind mesaje bazate pe XML și protocoale Internet standard.

W3C definește "serviciul web" ca "un sistem proiectat pentru a sprijini interoperabilitatea mașină-mașină pentru a interacționa într-o rețea". Acesta are o interfață descrisă într-un format mașină care procesează informații (în special limbajul de descriere a serviciilor web, cunoscut prin acronimul WSDL). Alte sisteme interacționeaza cu serviciul Web prin intermediul mesajelor SOAP, de obicei, transmise prin HTTP, cu o serializare XML împreună cu alte standarde legate de Web.

Figura nr. 1.1 – Funcționarea serviciilor Web

"Big Web services", utilizează Extensible Markup Language (XML), si anume, mesaje care urmaresc standardul SOAP și au fost populare printre întreprinderile tradiționale. În astfel de sisteme, există adesea o descriere care poate fi citită automat de catre serviciile scrise în Web Services Description Language (WSDL). Acesta din urmă nu este o cerință a unui un obiectiv SOAP, dar este o condiție esențială pentru generarea automată a codului client în majoritatea framework-urilor Java .NET SOAP (framework, cum ar fi Apache Axis2, iar ca excepții CXF Apache și Spring).

Termenii de Internet și World Wide Web sunt des utilizați în vorbirea de zi cu zi fără a face mair diferențe între termeni. Totuși Internetul și World Wide Web nu sunt una și aceeași. Internetul este un sistem global de rețele interconectate, iar Web-ul este unul dintre serviciile care face ca internetul să funționeze. Este o colecție de documente text și alte resurse legate prin hyperlinkuri și URL-uri, de obicei accesate de browsere web din servere web. Pe scurt, ne putem gândi la Web ca la o aplicație cu ajutorul căreia Internetul funcționează.

Pentru a vizualiza o pagină pe World Wide Web începem prin tastarea URL-ului paginii într-un browser web sau prin a urma un hyperlink pe pagina respectivă sau resursă.

În primul rând, browserul rezolva porțiunea de nume-server a URL-ului (google.ro) într-o adresă de Protocol Interne utilizând baza de date distribuită global, cunoscută sub denumirea de Domain Name System (DNS). Browserul apoi cere sursa prin transmiterea unei cereri HTTP prin intermediul internetului la calculator, la acea adresă specificată.

Un serviciu Web (SW) expune o interfață de invocare a unei activități de către un client. Un client poate accesa un serviciu Web folosind standarde Internet. Un serviciu web rezolvă următoarele probleme:

interoperabilitate – un SW trebuie să permită comunicarea între orice platforme;

interfețe puternic tipizate – nu trebuie să existe ambiguitate relativ la tipul de date trimise sau primite spre/de la un SW. Aceste tipuri de date ar trebui să se poată mapa rezonabil peste tipurile de date folosite de limbajele procedurale existente;

folosirea standardelor Internet – implementarea unui SW trebuie să se bazeze pe standardele și protocoalele de comunicare deja existente, pentru a evita “reinventarea roții”

acces multilimbaj – un SW nu trebuie să reducă aria limbajelor care le pot utiliza; transparența trebuie să se manifeste atât la nivelul limba- jului în care s-a creat SW, cât și la nivelul clientului;

posibilitate de integrare în orice infrastructură distribuită – un SW nu trebuie să fie strâns cuplat de o anumită infrastructură de comunicare.

Astăzi, Web-ul reprezintă vîrful de lans al dezvoltării tehnologiilor Internet.

Internetul este o comunitate de rețele de calculatoare, un mediu informatic global cu resurse imense și o gamă largă de servicii. Se aproximeaza ca in internet sunt interconectate circa 120.000 rețele, 50 milioane stații de pe toate continemtele, din peste 150 de țări. Cu alte cuvinte internetul este o rețea din mai multe rețele.

Resursele internet sunt construite din:

– servere – calculatoare-gazdă la care se stochează informația și care prestează diverse servicii informatice;

– zeci de milioane de fișiere, baze de date în cadrul serverilor cu informații din cele mai diverse domenii;

– subsistemul de comunicație, ce asigură interconectarea și transferul de date între stații.

1.2 Arhitectura orientată pe servicii

Serviciile Web pot fi, de asemenea, folosite pentru a pune în aplicare o arhitectură orientată pe servicii (SOA), concepte, în cazul în care unitatea de bază a comunicare este un mesaj, mai degrabă decât o operație. Acest lucru este adesea menționat ca "mesaj"-orientat spre servicii.

SOA, serviciile Web sunt acceptate de majoritatea furnizorilor de software și de catre analiștii din industrie. Spre deosebire de serviciile Web RPC, aici accentul este pus pe “contractul” oferit de WSDL, mai degrabă decât pe detaliile care stau la baza implementării.

SOA, ca și arhitectură se bazează pe servicii de orientare, iar principiul fundamental este designul său. În cazul în care un serviciu prezintă o interfață simplă care abstractizeaza de departe complexitatea sa de bază, utilizatorii pot accesa serviciile independente, fără a avea cunoștințe de implementare a platformei de servicii.

Figura nr. 1.2 – Arhitectura serviciilor web

Un serviciu web este un serviciu pus la dispoziție utilizatorilor pe Internet. Multitudinea de protocoale și standarde disponibile începând de la sfârșitul secolului trecut în sfera Internetului au dat posibilitatea comunicării între aplicații pe sisteme aflate la distanțe mari, cu acces la Internet. Astfel, există sisteme ce oferă servicii de informare și procesare a informațiilor care în general sunt independente de platforma hardware; accesul la acestea se face prin servicii web.

Încă de la realizarea primei rețele de calculatoare accesibile prin TCP/IP, numită ARPANET, accesarea de informații rezidente pe un alt calculator decât cel curent și mai ales execuția unor rutine găzduite de altă mașină au devenit foarte importante. Pentru manipularea datelor între calculatoare, au fost inventate o serie de mecanisme și protocoale, parte din ele fiindu-vă descrise în alte cursuri (socket, FTP, HTTP, etc).

Printre marile companii de profil se numără și compania de software IBM care a lansat noi produse si servicii menite sa faciliteze eforturile clientilor de a profita mai rapid si mai usor de tendintele in crestere ale pietei privind adoptarea unei Arhitecturi Orientate pe Servicii (Service Oriented Architecture – SOA). Principalele obstacole care impiedică succesul unei SOA sunt deseori legate de stabilirea modului de a aborda o astfel de arhitectură, astfel încât să se evite costurile suplimentare și să se asigure că investițiile sunt alocate unei strategii de afaceri care va rezista fluctuațiilor pieței și schimbărilor din cadrul companiei.

Pentru a sprijini strategiile bazate pe SOA și pentru a fi centrate pe oameni, versiunea 6.0 a platformei WebSphere Portal integrează IBM Workplace și tehnologii colaborative capabile să faciliteze eforturile utilizatorilor de a dezvolta și implementa aplicații complexe care pot fi adaptate conform industriei căreia li se adresează. Noua platformă are la baza aplicația AJAX (Asynchronous JavaScript and XML) și este capabilă să creeze un mediu mult mai receptiv pentru utilizatori.

Ideea fundamentală a serviciilor Web este integrarea. Acest concept reprezintă un set de tehnologii standard care facilitează interoperabilitatea dintre sisteme heterogene, fie la nivel de organizație, fie pe Internet.

De fapt, serviciile Web sunt o formă de distribuție flexibilă, ieftină și eficientă a resurselor la nivel intra sau inter orginter organizațional, indiferent de tipul de aplicații sau platforme de operare folosite.

CAPITOLUL 2

SOA – SERVICE ORIENTED ARHITECTURE

2.1 Conceptul SOA

SOA (Service Oriented Architecture – Arhitectură software bazată pe servicii) este un tip de arhitectură software care presupune distribuirea funcționalității aplicației în unități mai mici, distincte – numite servicii – care pot fi distribuite într-o rețea și pot fi utilizate împreună pentru a crea aplicații destinate afacerilor. Capacitatea mare cu care pot fi reutilizate aceste servicii în aplicații diferite este o caracteristică a arhitecturilor software bazate pe servicii. Aceste servicii comunică între ele trimițând informații de la un serviciu la altul. SOA este deseori văzută ca o evoluție a programării distribuite si a programării modulare. Arhitectura Orientata pe Servicii (SOA) este un grup de servicii care comunica intre ele. Procesul de comunicare implica atat schimburi simple de date intre un furnizor de servicii si beneficiarul acestora, cat si un sistem complex de sisteme intre doi sau mai multi furnizori. Inter-comunicarea implica gasirea unor legaturi de conectare a doua sau mai multe servicii intre ele.

SOA construieste aplicațiile în afara serviciilor software. Serviciile cuprind în mod intrinsec unități de funcționalitate neasociate și interconectate imprecis, care nu conțin caracteristici de conectivitate. Fiecare serviciu implementează o singură acțiune, de exemplu, completarea unei aplicații on-line pentru un cont, vizualizarea unui extras de cont bancar on-line, plasarea unei rezervări on-line sau unui număr de ordine pentru biletele de avion. În locul apelărilor cuprinse în codul sursă al serviciilor, se folosesc protocoale definite care descriu modul în care unul sau mai multe servicii pot comunica.

Scopul SOA este acela de a facilita conectarea unor părți consistente ale functionalităților, prin utilizarea serviciilor software existente, pentru a putea forma aplicații ad-hoc construite în întregime. Cu cât sunt mai mari sunt aceste părți, cu atat mai puține sunt punctele de interfață necesare implementării seturilor de functionalități. În ceea ce privește costurile periferice ale construirii unei aplicații suplimentare, SOA a demonstrat că acestea sunt scăzute deoarece există toate componentele software necesare pentru a satisface cerințele altor aplicații. În mod ideal, este nevoie doar de organizare pentru a produce noi aplicații.

Dezvoltatorii SOA asociază obiectele individuale SOA prin utilizarea orchestrației. În procesul de orchestrare dezvoltatorul asociază funcționalitatea softului (serviciile), într-un regim non-ierarhic folosind un instrument software care conține o listă completă a tuturor serviciilor disponibile, caracteristicile acestora, precum și mijloacele de a construi o cerere de utilizare acestor surse.

SOA oferă așa numita arhitectură de perspectivă și anume, poate unifica procesele de business prin structurarea aplicațiilor mari sub forma unei colecții de module mai mici, numite servicii. Astfel, grupuri diferite de utilizatori, atât din interiorul unei organizații, cât și din exteriorul acesteia, pot folosi aceste aplicații, dar și noile aplicații mai flexibile și cu o uniformitate mai mare, construite dintr-un conglomerat de servicii.

Fiecare companie are propriile „insule” de active corporative – angajații, furnizorii, partenerii (și informații despre aceștia) sau infrastructura IT existentă – care trebuie conectate și mai apoi puse în slujba atingerii obiectivelor companiei. Una dintre cele mai eficiente și eficace metode de integrare a aplicațiilor este printr-o Arhitectura Orientată pe Servicii (Service Oriented Architecture – SOA). SOA este o abordare de prelucrare distributivă, care implică crearea și administrarea de servicii separate (verificare creditului clientului, crearea unei inregistrări), care poate accesa activele companiei și părți de informații printr-o interfață comună, indiferent de locația sau particularitățile tehnice ale datelor. Aceste servicii sunt evidențiate și administrate într-o manieră de asociere liberă, care este concepută să maximizeze reorganizarea lor și să fie folosite, datorită extensiei lor, în procesele de business.

Baza pentru validarea acestora necesită date suficient de detaliate pentru a descrie nu numai caracteristicile acestor servicii, ci și datele care le conduc. Programatorii au utilizat intens XML în SOA pentru a structura datele pe care apoi le-au învăluit într-o descriere exhaustivă. În mod analog, Web Services Description Language (WSDL) descrie serviciile în sine, în timp ce protocolul SOAP descrie protocoalele de comunicare.

2.2 Principii SOA

Urmatoarele principii definesc regulile de bază pentru dezvoltarea, menținerea și utilizarea SOA:

Reutilizarea, granularitatea, modularitate, componentele și interoperabilitatea.

Conformitatea cu standardele (comune și specifice industriei)

Servicii de identificare și de clasificare, aprovizionare și de livrare, precum și monitorizare și urmărire.

Prima lucrare de cercetare referitoare la orientarea serviciilor dintr-o perspectivă industrială a fost elaborată de către Thomas Erl de la SOA Systems Inc. care a definit 8 principii specifice tuturor platformelor SOA. Aceste principii au fost publicate în “Arhitectura Orientată spre Servicii: Concepte, tehnologie și proiectare”, pe site-ul de cercetare www.soaprinciples.com în septembrie, 2005.

Contract de servicii standardizate – Serviciile aderă la un acord de comunicații, așa cum sunt definite în mod colectiv de către unul sau mai multe servicii de descriere documente.

Cuplajul slab – Servicii de a menține o relație care minimizează dependența și impune numai menținerea unei conștientizări reciproce.

Abstractizarea serviciului – Dincolo de descrierile din contractul de servicii, acestea ascund logica din lumea exterioară.

Serviciu reutilizabil – Logica este împărțită în servicii, cu intenția de a promova reutilizarea.

Autonomia serviciilor – Serviciile dețin controlul asupra logicii pe care o încapsulează.

Granularitate serviciului – O atenție deosebită este acordată design-ului pentru a oferi domeniului de aplicare nivelul optim, dreptul granular al funcționalității de afaceri într-o operațiune de serviciu.

Serviciu cu condișie de apatrid – Serviciu de minimizare a consumului de resurse, de gestionare a informațiilor atunci când este necesar.

Vizibilitatea serviciului – Serviciile sunt completate cu date prin care acestea pot fi descoperite și interpretate în mod eficient.

Componența serviciului – Serviciile în care componentele se comportă ca niște particpanți activi și eficienți, indiferent de mărimea și complexitatea compoziției.

Cheia livrării unor procese de business îmbunătățite se află în armonizarea noilor procese și aplicății cu infrastructura existentă, incluzând tehnologii de genul Enterprise Resource Planning (ERP) și customer relationship management (CRM – reprezintă un set de strategii, politici și tehnologii destinate atragerii, reținerii și fidelizării clienților. Într-un sens larg, CRM include activitățile aferente departamentelor de marketing, vânzări, financiar și suport tehnic relativ la clienți, potențiali clienți, furnizori și parteneri). O soluție eficientă de BPM va susține conceptul și implementarea SOA și aplicațiile adiacente. Orice soluție trebuie să aducă beneficii la final, fără a neglija ceea ce funcționează. Este importantă asigurarea tehnologiei care să permită utilizatorilor să identifice procesele afacerii printr-o notație grafică clară. Vitale sunt și capacitatea de execuție a acelui proces; facilitarea integrării sistemelor deja existente și a pachetele comerciale disponibile; și apoi analizarea și administrarea funcționării împreună a acestor procese. Enterprise Concept folosește o abordare unică și independentă a proceselor care separă logica proceselor afacerii de nivelul aplicațiilor, făcând integrarea mult mai lină și mai adaptabilă modificărilor ulterioare.

Figura nr. 2.1 – Arhitectura sistemelor CRM

O direcție importantă în dezvoltarea sistemelor distribuite și a sistemelor IT pentru servicii este adoptarea arhitecturii orientate pe servicii – SOA (Service Oriented Architecture). Aceasta este capabilă să susțină implicarea unor multiple organizatii furnizoare de servicii si, în același timp, să păstreze independența acestora în ceea ce privește platformele pe care le aleg și a limbajelor în care realizează implementarea. Serviciile software din arhitecturile SOA pot fi executate pe diferite calculatoare, ale diferiților furnizori de servicii, pot fi furnizate local sau externalizate, pot fi implementate în orice limbaj de programare și pot încapsula sisteme moștenite ale diferitelor organizații. De asemenea, ele pot avea diferite modele de plată: disponibilitate gratis, plata prin abonament sau plata la fiecare utilizare.

Aceste servicii pot avea scopuri extrem de variate, precum prelucrarea datelor, raționalizarea, reutilizarea funcționalităților încorporate în sisteme moștenite, sau integrarea activităților efectuate de mai mulți parteneri de afaceri. Arhitecturile permit o distribuire largă a artefactelor software; agilitatea și extensibilitatea pot fi crescute prin folosirea serviciilor descoperite la momentul execuției, adesea folosind tehnologii semantice.

Figura nr. 2.2 – Arhitectura orientată pe servicii

Având în vedere caracteristicile acestor tipuri de arhitecturi se poate spune că SOA prin componentele sale bine coordonate își propune să furnizeze o serie de servicii bussines complexe și bine definite. Astfel de servicii sunt concepute ținând cont de cele mai bune practici în conducerea afacerilor cunoscute sub numele de business process management. Însă pentru o implementare eficientă a SOA trebuie îndeplinite și anumite condiții tehnice referitoare la infrastructură cum ar fi:

Existența componentelor necesare pentru dezvoltarea aplicațiilor personalizate: servicii de date, autentificare și audit, platforme de căutare și notificare;

Platforme de securitate care să permită autorizarea și autentificarea utilizatorilor;

Servicii de date integrate pentru suportul SOA ;

Servicii de tip portal pentru interacțiunea utilizatorilor;

Servicii prezente în mod obișnuit intr-o companie cum ar fi :e-mail,colaborative, LDAP( un protocol aplicație folosit pentru interogarea și modificarea serviciilor de directoare prin intermediul TCP/IP)

Adoptarea conceptului SOA în cadrul unei companii presupune într-adevăr o tranziție. Iar această trecere nu trebuie să fie scopul, ci mijlocul prin care o companie își susține obiectivele și strategiile de business, prin urmare, etapele acestei tranziției către SOA sunt specifice fiecărei companii. Înainte de toate, este necesară o pregătire pentru tranziția către SOA, de acumulare a unor competențe specifice, printre care abilitatea de a măsura stadiul de pregătire a companiei pentru o astfel de adopție și capabilitatea de a identifica și măsura beneficiile pe care SOA le poate aduce către business și IT. De asemenea, trebuie realizată o identificare a inițiativelor de business care pot fi susținute prin adopția SOA. De cele mai multe ori, există înțelegerea greșită că tranziția către SOA presupune achiziția și implementarea unor tehnologii SOA.

Guvernarea SOA este un framework pentru luarea deciziilor și identificarea rolurilor într-o organizație, așa încât să asigure ca acțiunile IT sunt sincronizate cu strategiile companiei. Acest framework este definit de un grup sau un comitet responsabil de crearea regulilor de guvernare, de definirea rolurilor, a procesului de decizie, a responsabilităților persoanelor implicate în luarea deciziilor, a responsabilității rolurilor de execuție.

2.3 Avantajele si riscurile SOA

Avantajele arhitecturii SOA:

Interoperabilitatea intrinsecă între diferite sisteme și limbaje de programare reprezintă baza pentru integrarea de diverse aplicații printr-un protocol de comunicare;

Agregarea datelor și a serviciilor/funcționalităților în scopul realizării și întreținerii fluxurilor de date între toate sistemele/aplicațiile din cadrul soluției integrate.

Principiile arhitecturii SOA definesc atât reguli pentru proiectare, cât caracteristicile specifice unei astfel de arhitecturi:

Abstractizarea, întrucât serviciile ascund logica de procesare și sunt prezentate doar la nivel de interfețe;

Descoperirea serviciilor se realizează prin mecanisme facile, de exemplu prin intermediul unui repozitoriu de servicii;

Cuplarea slabă între module și encapsularea serviciilor, de exemplu prin servicii web;

Granularitate fină până la un nivel relevant din perspectiva utilizatorului, modularitate și interoperabilitate;

Conformarea cu anumite standarde în vederea asigurării schimbului de informații între diverse servicii:

Identificarea, categorisirea, livrarea și monitorizarea serviciilor existente.

Riscuri:

În cadrul procesului de proiectare sunt luate în considerare riscurile unui proiect software în vederea asigurării unui management eficient al riscurilor. Printre acestea se numără:

factori tehnologici: noutatea tehnologică, metodele de dezvoltare, instrumentele de dezvoltare;

factori de design: design defectuos din punct de vedere al complexității, modularizării; depistare erori neprevăzute în specificarea inițială a sistemului;

factori externi: calitatea specificației cerințelor, stabilitatea cerințelor și numărul de modificări ale specificațiilor, calitatea definirii, stabilitatea și disponibilitatea interfețelor externe;

factori de management de proiect: Deficiența de comunicare și de coordonare a activităților, riscuri de planificare printre care: estimarea eronată a resurselor umane, a perioadelor de timp, definirea responsabilităților.

Abordarea Smart SOA oferă avantaje atât pentru afacere, cât și pentru IT, prin extinderea valorii de business a implementării de la proiectele elementare la cele avansate. Abordarea Smart SOA necesită ca fiecare proiect să fie simplu și robust, eliminându-se complexitatea inutilă și construindu-se o fundație solidă pentru dezvoltarea viitoare.

Bazat pe o experiență vastă de lucru cu clienții și partenerii în domeniul aplicării SOA, firma Oracle a dezvoltat Oracle SOA Model de maturitate care oferă factorilor de decizie un punct de referință pentru a evalua nivelul de maturitate SOA al organizației lor.

Modelul Oracle SOA de maturitate pune mai departe oferă un punct vedere realist afacerii și o tehnologie pentru ceea ce este nevoie în cadrul companiei astfel încât adoptarea SOA sa fie realizată cu succes. Acest model are cinci nivele distincte de maturitate SOA, de la nivel 1 – SOA oportunist în care sunt tratate primele proiecte SOA până la nivel 5 de industrializare care este integrat la nivel intern, dar și cu partenerii de afaceri și prin care se pot valorifica noi oportuniăți de afaceri.

Fiecare nivel este în primul rând desemnat de o viziune și o strategie și este asociat cu beneficiile corespunzătoare. O companie poate începe drumul spre SOA cu un nivel de 3 de viziune, care este automatizarea strategică a afacerii, dar și de transformare. În acest caz, sfatul este aceța de a luaîn considerare punerea în aplicare a uneia dintre cele mai bune practici încadrate la nivelurile 1 și 2.

Figura nr. 2.3 – Modelul de maturitate SOA al firmei Oracle

CAPITOLUL 3

SOAP – SIMPLE OBJECT ACCESS PROTOCOL

3.1 Prezentare SOAP

Aplicatiile din ziua de azi comunica folosind Proceduri de Comunicare la Distanta (RPC –Remote Procedure Calls) intre obiecte cum ar fi DCOM si COBRA, dar HTTP nu a fost proiectat pentru acest lucru. RPC reprezinta o problema de compatibilitate si securitate; firewalls-urile si serverele proxy vor bloca in mod normal acest tip de traffic.

Un mod mai bun de comunicare intre aplicatii este prin HTTP, deoarece HTTP este suportat de toate browser-ele si serverele de internet.

SOAP ofera un mod de comunicare intre aplicatii care ruleaza pe sisteme diferite , cu tehnologii si limbaje de programare diferite.

SOAP inseamna 'Simple Object Access Protocol', mai exact este un protocol de apel al unor functii de pe alte servere folosind XML pentru codificarea numelor de functie apelate, parametri si returnarea rezultatelo; acest protocol presupune 3 parți: un înveliș care definește un framework pentru descrierea conținutului unui mesaj și cum se procesează acesta, un set de reguli de codificare pentru instanțe ale unor expresii din aplicații – tipuri de date definite, și o convenție pentru reprezentarea apelurilor și răspunsurilor procedurilor apelate la distanta. SOAP poate fi utilizat in combinație cu o varietate de alte protocoale, in special in combinație cu HTTP.

SOAP este:

un protocol de comunicație;

folosit pentru comunicația între aplicații;

un format pentru trimiterea de mesaje;

proiectat pentru comunicarea în Internet;

independent de platformă:

independent de limbaj.

Acronimul SOAP a fost abandonat odata cu versiunea 1.2 a standardului. Aceasta versiune a devenit o recomandare W3C incepand cu 24.06.2003.

Rareori acest acronim este confundat cu SOA, deși aplicatiile nu au nicio relație.

SOAP a fost proiectat, original, de catre Dave Winer, Don Box, Bob Atkinson si Mohsen Al-Ghosein in 1998 intr-un proiect pentru Microsoft (unde Atkinson si Al-Ghosein lucrau deja la momentul respectiv) ca un protocol de apel.

Dupa introducerea SOAP, a devenit baza pentru mai multe servicii complexe de Web, bazate pe Web Services Description Language (WSDL – Limbajul de Descriere a Serviciilor Web care este un limbaj bazat pe XML ce oferă un model de descriere a serviciilor web) si Universal Description Discovery and Integration (UDDI – ce permite localizarea și publicarea serviciilor). Aceste servicii, in special UDDI, s-au dovedit a fi de un interes scazut, dar o apreciere a acestora oferă o înțelegere mai completă a rolului așteptat de catre SOAP în comparație cu modul în care serviciile web au evoluat de fapt.

3.2 Blocuri de constructie SOAP

Un mesaj SOAP este un document XML normal care conține următoarele elemente (Figura nr. 3.1):

un element Plic care identifică documentul XML drept un mesaj SOAP;

un element Antet care conține informația din antet;

un element de Conținut care conține informația de comunicare și răspuns;

un element Defect care conține erorile și informatiile de status.

Figura nr. 3.1 – Structura SOAP

Reguli de sintaxa:

Regulile de sintaxa cele mai importante in SOAP sunt:

un mesaj SOAP TREBUIE codificat folosind XML;

un mesaj SOAP TREBUIE să folosească spațiul de nume Plic;

un mesaj SOAP TREBUIE să folosească Codificarea spațiul de nume;

un mesaj SOAP NU trebuiă să conțină referinte DTD;

un mesaj SOAP NU trebuie să conțină Porcesarea Instrucțiunilor XML.

Elementul Plic SOAP

Elementul Plic SOAP este elementul rădăcină a unui mesaj SOAP. Elementul Plic SOAP cerut este elementul rădăcină a unui mesaj SOAP. Acest element defineste documentul XML drept un mesaj SOAP. Spațiul de nume definește Plicul drept un Plic SOAP. Dacă este folosit un spațiu de nume diferit, aplicația generează o eroare și nu ia în considerare mesajul.

Stilul de codificare al Atributului

Stilul de codificare al Atributului este folosit pentru definirea tipului de date folosite în document. Acest atribut poate apărea la orice element SOAP, și se aplică conținutului elementului și tuturor elementelor copil. Un mesaj SOAP nu are nici o codificare implicită.

Elementul Defect SOAP

Elementul Defect SOAP conține erorile și informația status pentru un mesaj SOAP, este folosit pentru indicarea mesajelor de eroare. Dacă un element Defect este prezent, trebuie să apară ca un element rezultat al elementului Conținut. Un element Defect poate apărea doar o dată într-un mesaj SOAP.

Elementul Defect SOAP are următoarele sub elemente:

<faultcode> Un cod pentru identificarea defectului

<faultstring> O explicație citibilă a defectului

<faultactor> Informații despre cine a provocat apariția defectului

<detail> Conține erori specifice aplicației relative la elementul Conținut

Figura nr. 3.2 – Protocolul de schimb de mesaje

Coduri Defect SOAP

Valorile Codului Defect definite mai jos trebuiesc folosite în elementul codului defect când sunt descrise defecte:

Tabelul nr. 3.1

O cerere SOAP ar putea fi un POST HTTP sau o cerere HTTP GET. Cereea HTTP POST necesită cel putin două antete HTTP: Conținut-Tip și Conținut-Lungime

Continut-Tip

Antetul Continut-Tip pentru un răspuns/cerere SOAP definește tipul MIME pentru mesajul și codificarea caracterului (opțional) folosit pentru corpul XML al cererii sau al răspunsului.

Conținut-Lungime

Antetul Conținut-Lungime pentru un răspuns/cerere SOAP specifică numărul de byti în corpul cererii sau răspunsului.

3.3 Specificații SOAP și model de procesare

Specificațiile SOAP definesc cadrele de mesaje care constau în:

Modelul de procesare SOAP definește regulile de procesare a unui mesaj SOAP;

Extensibilitatea modelului SOAP definelte conceptele caracteristicilor SOAP și modulelor SOAP;

Protocolul cadru SOAP este baza pentru descrierea regulilor de definire a unui protocol obligatoriu care poate fi utilizat pentru schimbul de mesaje SOAP și noduri SOAP.

Construcția mesajului SOAP definește structura unui mesaj SOAP.

Model de procesare

Modelul de procesare SOAP descrie un model de procesare distribuit, participanții săi, nodurile SOAP, și modul în care un receptor SOAP procesează un mesaj SOAP. Astfel, sunt definite urmatoarele noduri SOAP:

a. Emitator SOAP

Un nod SOAP care transmite un mesaj SOAP

b. Receptor SOAP

Un nod SOAP care accepta un mesaj SOAP

c. Calea mesajului SOAP

Set de noduri SOAP, prin care un singur mesaj SOAP poate trece.

d. Emitatorul initial SOAP (initiatorul)

Expeditorul SOAP care inițiază un mesaj SOAP de la punctul de plecare al unei căi de mesaj SOAP.

e. Intermediarul SOAP

Un intermediar SOAP este atât un receptor și un expeditor SOAP și este vizat din cadrul unui mesaj SOAP. Acesta procesează blocuri antet SOAP orientate catre el și acționează pentru a transmite un mesaj SOAP către un receptor SOAP final.

f. Receptor SOAP final

Receptorul SOAP, care este o destinație finală a unui mesaj SOAP, este responsabil pentru procesarea conținutul SOAP, precum și de orice blocuri SOAP antet orientate catre el. În anumite circumstanțe, este posibil ca un mesaj SOAP sa nu poata ajunge la un receptor SOAP final, de exemplu, din cauza unei probleme la un intermediar SOAP. Un receptor SOAP final nu poate fi, de asemenea, un intermediar SOAP pentru același mesaj SOAP.

3.4 Metode de transport

Atât SMTP și HTTP sunt protocoale valide de aplicare, utilizate ca transport pentru SOAP, dar HTTP a câștigat un grad de acceptare mai larg care funcționează foarte bine cu infrastructura de internet de astăzi, în mod special, HTTP funcționează bine cu firewall-uri de rețea. SOAP poate fi, de asemenea utilizat peste HTTPS (care este protocolul HTTP la același ca la nivel de aplicație, dar utilizează un sub-protocol criptat de transport), fie cu autentificare simpla sau reciprocă.

Acesta este un avantaj major față de alte protocoale, precum GIOP / IIOP sau DCOM care sunt în mod normal filtrate de firewall. SOAP peste AMQP este încă o posibilitate pe care unele implementări o suporta.

3.5 Formatul mesajului SOAP

XML a fost ales ca format de mesaj standard, din cauza utilizării sale pe scară largă de către marile corporații și a eforturilor de dezvoltare „open source”. În plus, o mare varietate de instrumente disponibile gratuite facilitează în mod semnificativ trecerea la o punere în aplicare pe bază SOAP. Sintaxa, oarecum de lungă durată, a XML poate fi atât un avantaj, cât și un dezavantaj. În timp ce promovează lizibilitate pentru om, facilitează de detectarea erorilor, și pentru a evita problemele de interoperabilitate, cum ar fi octet-comandă (Endianness), aceasta poate încetini viteza de procesare și poate fi greoaie. De exemplu, CORBA, GIOP, ICE, și dispozitivele hardware sunt disponibile pentru a accelera procesarea de mesaje XML.

Exemplu de mesaj:

POST /InStock HTTP/1.1

Host: www.google.com

Content-Type: application/soap+xml; charset=utf-8

Content-Length: 299

SOAPAction: "http://www.w3.org/2003/05/soap-envelope"

<?xml version="1.0"?>

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">

<soap:Header>

</soap:Header>

<soap:Body>

<m:GetStockPrice xmlns:m="http://www.google.com/stock">

<m:StockName>IBM</m:StockName>

</m:GetStockPrice>

</soap:Body>

</soap:Envelope>

3.6 Avantajele și dezavantajele SOAP

Avantaje:

Prin utilzarea SOAP cu HTTP se permite o mai bună comunicație în spatele unui proxy sau firewall decât presupunea precedenta tehnologie de apel la distanță.

SOAP este destul de versatil pentru a permite utilizarea protocoalelor de transport diferite. Structura de date standard utilizează HTTP ca protocol de transport, dar alte protocoale sunt de asemenea utilizabile (TCP, SNMP).

Dezavantaje:

Deoarece formatul XML este lung, SOAP poate fi destul de lent în comparație cu tehnologiile middleware, cum este CORBA. Aceasta nu constituie o problemă când se trimit numai mesaje scurte.

Când ne bazăm pe HTTP ca protocol de transport, rolurile părților care interacționează sunt stabilite. Doar o parte (clientul) poate utiliza serviciile altuia. Deci, dezvoltatorii trebuie sa utilizeze polling în schimbul notificării în aceste cazuri comune.

Deoarece SOAP dispune de multe implementări SOAP cantinatea de date care poate fi trimisă este limitată.

CAPITOLUL 4

MODELARE SOA – REALIZAREA UNEI APLICAȚII DE TIP CALCULATOR

4.1 Generalități

Arhitecturile orientate spre servicii reprezintă următorul pas în arhitecturile software. SOA este o arhitectură în care funcțiile sunt definite ca servicii independete, cu interfete bine definite. Respectând principiile SOA, câteva standard au fost create și sunt folosite în aceste moment. Cele mai cunoscute sunt însă serviciile web.

Principalele direcții de cercetare în domeniul serviciilor web semantice curpind OWL-S, WSMO sau SESA (Semantically Enabled Service-oriented Architectures)

Figura nr. 4.1 – Arhitectura orientată spre servicii

OWL-S

OWL-S (Ontology Web Language for Services) este un limbaj formal pentru a descrie proprietăți și funcții ale serviciilor. OWL-S extinde OWL pentru a suporta descoperirea serviciilor în funcție de proprietăți, compunere și invocare automată, monitorizarea execuției. OWL-S nu înlocuiește standardele curente pentru servicii web, ci încearcă să adauge capacități semantice. Principalele noțiuni care stau la bază sunt:

Service Profile – caracterizarea unui serviciu web, prin intermediul proprietăților. Este folosit pentru a popula regiștrii de servicii (un serviciu poate avea mai multe profile), descoperire și selecție. Profilul poate conține proprietăți funcționale precum intput, output, pre-condiții, rezultate și proprietăți nefuncționale (proveniență, timp de răspuns, securitate, arie geografică). Service Profile nu impune o reprezentare a serviciului. Folosind subclase OWL a unei clase oferite – ServiceProfile – se pot crea clase specializate de reprezentare a serviciului ce pot fi folosite ca ServiceProfile

Service Model (Process Model) – realizează o descriere interpretabilă a comportamentului serviciului împreună cu un protocol de interacțiune, specificând mesajele abstracte, tipul informațiilor ontologice transmise. Este folosit pentru invocare, compunere, monitorizare. Orice proces are input, output, precondiții și efecte. Procesele pot fi atomice, compuse sau simple.

Un proces reprezintă o transformare dintr-o stare ințială într-o mulțime de posibile stări finale. Starea inițială este definită de un input și precondiții, iar mulțimea stărilor rezultat sunt descrise de o condiție(indică când un rezultat e generat), un output și efecte ale execuției procesului. Un exemplu de proces atomic ce descrie mecanismul de autenficare:

<process:AtomicProcess rdf:ID=”LogIn”>

<process:hasInput rdf:resource=”#AcctName”/>

<process:hasInput rdf:resource=”#Password”/>

<process:hasOutput rdf:resource=”#Ack”/>

<process:hasPrecondition isMember(AccName)/>

<process:hasResult>

<process:Result>

<process:inCondition>

<expr:SWRL-Condition>correctLoginInfo(AccName,Password)</expr:SWRL-Condition>

</process:inCondition>

<process:withOutput rdf:resource=“#Ack“>

<valueType rdr:resource=“#LoginAcceptMsg”>

</process:withOutput>

<process:hasEffect>

<expr:SWRL-Condition>loggedIn(AccName,Password)</expr:SWRL-Condition>

</process:hasEffect>

</process:Result>

</process:hasResult>

</process:AtomicProcess>

Pe lângă aceste limbaje, WSML oferă o mapare către XML, RDF și OWL, oferind posibilitatea schimbului de ontologii WSMO pe web.

Figura nr. 4.2 – Exemplu de colaborare între servicii web

XML (eXtensible Markup Language) este tot o formă mai simplă de SGML, dar înlătură rigiditatea predecesorului său HTML prin faptul că permite definirea liberă, la alegere, a elementelor de marcare (etichete), conform cu specificul documentului (în acest sens poate fi numit un limbaj cu caracter semantic), și poate reprezenta structura proprie, internă a unui document. XML este adoptat ca standard deschis, de facto, în 1998 de către W3C și devine apoi extrem de răspândit (6). XML este independent de platformă, procesoarele lui sunt ușor de implementat, și este metoda principală de reprezentare a documentelor pentru transmiterea prin Internet. Documentele prezentate în XML pot fi citite atât de om cât și de mașină.

4.2 Realizarea aplicației calculator

Pentru realizarea aplicației calculator am utilizat softul de programare Visual Studio Beta 11. Multe elemente noi din Visual Studio 11 sunt legate de interfață și de modul în care platforma e folosită zilnic – în primul rând există un modul mai bun de indexare ce face mai ușoară regăsirea anumitor informații despre proiecte.

Am utilizat aplicația windows forms și am inceput configurarea ferestrei calculatorului:

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

<startup>

<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />

</startup>

</configuration>

Avem nevoie de 2 ferestre tip text pentru inserarea numerelelor cu care vrem să calculăm; acestea se realizează cu funcția text box din tab-ul common controls.

Figura nr. 4.3 Configurarea ferestrei calculatorului

Public Class Form1

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

End Sub

End Class

Pentru operații vom aplica patru butoane, care vor fi acționate printr-un simplu click cu mouse-ul.

Figura nr. 4.4 – Adăugarea celor patru butoane pentru operații de adunare, scădere, înmulțire și împărțire

Pentru afișarea rezultatelor vom aplica două etichete, după cum urmează:

Figura nr. 4.5 – Adăugarea celor două etichete

Pentru a afișa funcțiile butoanelor nu trebuie să le redenumim, ci în aplicație, acestea trebuie să afiseze textul operației pe care o vor efectua. Astfel, în dreapta ferestrei avem câmpul proprietăți în care putem modifica textul butoanelor.

Figura nr. 4.6

Figura nr. 4.6 – Afișarea semnelor pentru operații

În căsuțele de text, vom scrie “0”, iar textul va fi centrat ca în figura de mai jos.

Figura nr. 4.7

Eticheta nr. 2 va afisa rezultatul operației pe care o vom solicita. Pentru aceasta i-am aplicat funcția butonului 1, adica adunarea, astfel:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Label2.Text = Val(TextBox1.Text) + Val(TextBox2.Text)

End Sub

Private Sub Label2_Click(sender As Object, e As EventArgs) Handles Label2.Click

End Sub

End Class

La fel se face și pentru celelalte butoane, dar cu înlocuirea semnelor.

Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Label2.Text = Val(TextBox1.Text) + Val(TextBox2.Text)

End Sub

Private Sub Label2_Click(sender As Object, e As EventArgs) Handles Label2.Click

End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

Label2.Text = Val(TextBox1.Text) – Val(TextBox2.Text)

End Sub

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click

Label2.Text = Val(TextBox1.Text) * Val(TextBox2.Text)

End Sub

Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click

Label2.Text = Val(TextBox1.Text) / Val(TextBox2.Text)

End Sub

End Class

Și după debug, se realizează aplicația tip calculator. Rezultatul este de forma:

The thread 'vshost.LoadReference' (0x14f4) has exited with code 0 (0x0).

'WindowsApplication1.vshost.exe' (Managed (v4.0.30319)): Loaded 'D:\Users\Andreea\Documents\Visual Studio 11\Projects\WindowsApplication1\WindowsApplication1\bin\Debug\WindowsApplication1.exe', Symbols loaded.

'WindowsApplication1.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Runtime.Remoting\v4.0_4.0.0.0__b77a5c561934e089\System.Runtime.Remoting.dll'

The thread '<No Name>' (0xc20) has exited with code 0 (0x0).

The thread 'vshost.RunParkingWindow' (0x1044) has exited with code 0 (0x0).

The thread '<No Name>' (0x10e8) has exited with code 0 (0x0).

The program '[5928] WindowsApplication1.vshost.exe: Managed (v4.0.30319)' has exited with code 0 (0x0).

Figura nr. 4.8

Din tabul Appearance se pot face modificări cu privire la aspectul calculatorului.

Figura nr. 4.9

Figura nr. 4.10

Anexa nr. 1

Codul sursa al calculatorului

<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _

Partial Class Form1

Inherits System.Windows.Forms.Form

'Form overrides dispose to clean up the component list.

<System.Diagnostics.DebuggerNonUserCode()> _

Protected Overrides Sub Dispose(ByVal disposing As Boolean)

Try

If disposing AndAlso components IsNot Nothing Then

components.Dispose()

End If

Finally

MyBase.Dispose(disposing)

End Try

End Sub

'Required by the Windows Form Designer

Private components As System.ComponentModel.IContainer

'NOTE: The following procedure is required by the Windows Form Designer

'It can be modified using the Windows Form Designer.

'Do not modify it using the code editor.

<System.Diagnostics.DebuggerStepThrough()> _

Private Sub InitializeComponent()

Me.TextBox1 = New System.Windows.Forms.TextBox()

Me.TextBox2 = New System.Windows.Forms.TextBox()

Me.Button1 = New System.Windows.Forms.Button()

Me.Button2 = New System.Windows.Forms.Button()

Me.Button3 = New System.Windows.Forms.Button()

Me.Button4 = New System.Windows.Forms.Button()

Me.Label1 = New System.Windows.Forms.Label()

Me.Label2 = New System.Windows.Forms.Label()

Me.SuspendLayout()

'

'TextBox1

'

Me.TextBox1.Font = New System.Drawing.Font("Microsoft Sans Serif", 14.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))

Me.TextBox1.Location = New System.Drawing.Point(319, 28)

Me.TextBox1.Name = "TextBox1"

Me.TextBox1.Size = New System.Drawing.Size(232, 29)

Me.TextBox1.TabIndex = 0

Me.TextBox1.Text = "0"

Me.TextBox1.TextAlign = System.Windows.Forms.HorizontalAlignment.Center

'

'TextBox2

'

Me.TextBox2.Font = New System.Drawing.Font("Microsoft Sans Serif", 15.75!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))

Me.TextBox2.Location = New System.Drawing.Point(319, 69)

Me.TextBox2.Name = "TextBox2"

Me.TextBox2.Size = New System.Drawing.Size(232, 31)

Me.TextBox2.TabIndex = 1

Me.TextBox2.Text = "0"

Me.TextBox2.TextAlign = System.Windows.Forms.HorizontalAlignment.Center

'

'Button1

'

Me.Button1.Font = New System.Drawing.Font("Microsoft Sans Serif", 15.75!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))

Me.Button1.Location = New System.Drawing.Point(293, 136)

Me.Button1.Name = "Button1"

Me.Button1.Size = New System.Drawing.Size(60, 28)

Me.Button1.TabIndex = 2

Me.Button1.Text = "+"

Me.Button1.UseVisualStyleBackColor = True

'

'Button2

'

Me.Button2.Font = New System.Drawing.Font("Microsoft Sans Serif", 14.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))

Me.Button2.Location = New System.Drawing.Point(368, 136)

Me.Button2.Name = "Button2"

Me.Button2.Size = New System.Drawing.Size(60, 28)

Me.Button2.TabIndex = 3

Me.Button2.Text = "-"

Me.Button2.UseVisualStyleBackColor = True

'

'Button3

'

Me.Button3.Font = New System.Drawing.Font("Microsoft Sans Serif", 14.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))

Me.Button3.Location = New System.Drawing.Point(444, 136)

Me.Button3.Name = "Button3"

Me.Button3.Size = New System.Drawing.Size(60, 28)

Me.Button3.TabIndex = 4

Me.Button3.Text = "x"

Me.Button3.UseVisualStyleBackColor = True

'

'Button4

'

Me.Button4.Font = New System.Drawing.Font("Microsoft Sans Serif", 14.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))

Me.Button4.Location = New System.Drawing.Point(522, 136)

Me.Button4.Name = "Button4"

Me.Button4.Size = New System.Drawing.Size(60, 28)

Me.Button4.TabIndex = 5

Me.Button4.Text = "/"

Me.Button4.UseVisualStyleBackColor = True

'

'Label1

'

Me.Label1.AutoSize = True

Me.Label1.Font = New System.Drawing.Font("Microsoft Sans Serif", 15.75!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))

Me.Label1.Location = New System.Drawing.Point(292, 211)

Me.Label1.Name = "Label1"

Me.Label1.Size = New System.Drawing.Size(115, 25)

Me.Label1.TabIndex = 6

Me.Label1.Text = "Raspuns ="

'

'Label2

'

Me.Label2.AutoSize = True

Me.Label2.Font = New System.Drawing.Font("Microsoft Sans Serif", 15.75!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))

Me.Label2.Location = New System.Drawing.Point(441, 211)

Me.Label2.Name = "Label2"

Me.Label2.Size = New System.Drawing.Size(24, 25)

Me.Label2.TabIndex = 7

Me.Label2.Text = "0"

'

'Form1

'

Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)

Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font

Me.BackColor = System.Drawing.Color.FromArgb(CType(CType(192, Byte), Integer), CType(CType(192, Byte), Integer), CType(CType(255, Byte), Integer))

Me.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch

Me.ClientSize = New System.Drawing.Size(846, 405)

Me.Controls.Add(Me.Label2)

Me.Controls.Add(Me.Label1)

Me.Controls.Add(Me.Button4)

Me.Controls.Add(Me.Button3)

Me.Controls.Add(Me.Button2)

Me.Controls.Add(Me.Button1)

Me.Controls.Add(Me.TextBox2)

Me.Controls.Add(Me.TextBox1)

Me.Cursor = System.Windows.Forms.Cursors.Hand

Me.ForeColor = System.Drawing.SystemColors.HotTrack

Me.Name = "Form1"

Me.Text = "Form1"

Me.ResumeLayout(False)

Me.PerformLayout()

End Sub

Friend WithEvents TextBox1 As System.Windows.Forms.TextBox

Friend WithEvents TextBox2 As System.Windows.Forms.TextBox

Friend WithEvents Button1 As System.Windows.Forms.Button

Friend WithEvents Button2 As System.Windows.Forms.Button

Friend WithEvents Button3 As System.Windows.Forms.Button

Friend WithEvents Button4 As System.Windows.Forms.Button

Friend WithEvents Label1 As System.Windows.Forms.Label

Friend WithEvents Label2 As System.Windows.Forms.Label

End Class

Anexa 2

Fisier RESX

<?xml version="1.0" encoding="utf-8"?>

<root>

<!–

Microsoft ResX Schema

Version 2.0

The primary goals of this format is to allow a simple XML format

that is mostly human readable. The generation and parsing of the

various data types are done through the TypeConverter classes

associated with the data types.

Example:

… ado.net/XML headers & schema …

<resheader name="resmimetype">text/microsoft-resx</resheader>

<resheader name="version">2.0</resheader>

<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, …</resheader>

<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, …</resheader>

<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>

<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>

<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">

<value>[base64 mime encoded serialized .NET Framework object]</value>

</data>

<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">

<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>

<comment>This is a comment</comment>

</data>

There are any number of "resheader" rows that contain simple

name/value pairs.

Each data row contains a name, and value. The row also contains a

type or mimetype. Type corresponds to a .NET class that support

text/value conversion through the TypeConverter architecture.

Classes that don't support this are serialized and stored with the

mimetype set.

The mimetype is used for serialized objects, and tells the

ResXResourceReader how to depersist the object. This is currently not

extensible. For a given mimetype the value must be set accordingly:

Note – application/x-microsoft.net.object.binary.base64 is the format

that the ResXResourceWriter will generate, however the reader can

read any of the formats listed below.

mimetype: application/x-microsoft.net.object.binary.base64

value : The object must be serialized with

: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter

: and then encoded with base64 encoding.

mimetype: application/x-microsoft.net.object.soap.base64

value : The object must be serialized with

: System.Runtime.Serialization.Formatters.Soap.SoapFormatter

: and then encoded with base64 encoding.

mimetype: application/x-microsoft.net.object.bytearray.base64

value : The object must be serialized into a byte array

: using a System.ComponentModel.TypeConverter

: and then encoded with base64 encoding.

–>

<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">

<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />

<xsd:element name="root" msdata:IsDataSet="true">

<xsd:complexType>

<xsd:choice maxOccurs="unbounded">

<xsd:element name="metadata">

<xsd:complexType>

<xsd:sequence>

<xsd:element name="value" type="xsd:string" minOccurs="0" />

</xsd:sequence>

<xsd:attribute name="name" use="required" type="xsd:string" />

<xsd:attribute name="type" type="xsd:string" />

<xsd:attribute name="mimetype" type="xsd:string" />

<xsd:attribute ref="xml:space" />

</xsd:complexType>

</xsd:element>

<xsd:element name="assembly">

<xsd:complexType>

<xsd:attribute name="alias" type="xsd:string" />

<xsd:attribute name="name" type="xsd:string" />

</xsd:complexType>

</xsd:element>

<xsd:element name="data">

<xsd:complexType>

<xsd:sequence>

<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />

<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />

</xsd:sequence>

<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />

<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />

<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />

<xsd:attribute ref="xml:space" />

</xsd:complexType>

</xsd:element>

<xsd:element name="resheader">

<xsd:complexType>

<xsd:sequence>

<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />

</xsd:sequence>

<xsd:attribute name="name" type="xsd:string" use="required" />

</xsd:complexType>

</xsd:element>

</xsd:choice>

</xsd:complexType>

</xsd:element>

</xsd:schema>

<resheader name="resmimetype">

<value>text/microsoft-resx</value>

</resheader>

<resheader name="version">

<value>2.0</value>

</resheader>

<resheader name="reader">

<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>

</resheader>

<resheader name="writer">

<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>

</resheader>

</root>

BIBLIOGRAFIE

1. Teodora Vătuiu, Petre Ciungu, Serviciile WEB – Noi oportunități pentru e-lerning în învățământul preuniversitar, Conferința Națională de Învățământ Virtual, ediția a IV-a, 2006

2. Aplicații pentru structuri GRID, curs online

3. Reș Moreno-Doru, Contribuții la conceperea, proiectarea și implementarea unui sistem informatic integrat de tip ERP, în cadrul unei firme din domeniul industrial, Universitatea “Babeș-Bolyai” Cluj-Napoca, Facultatea de Științe Economice și Gestiunea Afacerilor, 2010

4. http://en.wikipedia.org/wiki/Service-oriented_architecture

5. http://www-01.ibm.com/software/ro/solutions/soa/

6.http://www.service-architecture.com/web-services/articles/service-oriented_architecture_soa_definition.html

7. http://www.enterprise-concept.com/ro/consultanta/abordari-de-consultanta/soa

8. http://en.wikipedia.org/wiki/SOAP

9. http://www.w3.org/TR/2000/NOTE-SOAP-20000508/

10. http://webdesign.about.com/od/soap/a/what-is-xml-soap.htm

11. http://www.perfectxml.com/SOAPTutorial.asp

12. http://ro.wikipedia.org/wiki/Cod_sursă

13. Faulkner Information Services, Simple Object Access Protocol (SOAP) for Web Applications, 2001

14. http://searchsoa.techtarget.com/definition/SOAP

15. Robert Daigneau, Service Design Patterns: Fundamental Design Solutions for SOAP/WSDL and RESTful Web Services, Westford, Massachusetts, ISBN-13: 978-0321544209, 2011

16. http://ro.wikipedia.org/wiki/Criptografie

17. http://ro.wikipedia.org/wiki/Funcție_hash

=== proiect ===

CAPITOLUL I

SERVICII WEB

1.1 Introducere

Într-o eră în care informația devine din ce în ce mai abundentă și din ce în ce mai necesară apare nevoia ca această informație să fie clasificată, ordonată, aranjată. Clasificarea și ordonarea informațiilor este vitală pentru evitarea acumulărilor inutile și nefolositore de informații, pentru perimarea acestora, arhivarea în mod constant și corect etc. Aceste acumulări de informații trebuie să fie strict la obiect, și corect este să avem doar informația care ne este utilă.

Domeniul gestiunii informațiilor abordează problema organizării, stocării și regăsirii în timp util a datelor de care dispunem despre un anumit subiect. Neîndoielnic că fiecare dintre noi ne confruntăm continuu cu această problemă. Agenda personală, cartea de telefon, sunt mijloace simple de organizare, păstrare și regăsire a datelor de care avem nevoie la un moment dat. Această problemă legată de stocarea informațiilor, organizarea și regăsirea lor a fost rezolvată cu ajutorul bazelor de date.

O bază de date este o colecție de informații corelate, referitoare la un anumit subiect sau colectate, organizate și memorate într-un anumit scop. Sistemul care permite colectarea, organizarea, memorarea și regăsirea informațiilor dintr-o bază de date se numește sistem de gestiune a bazelor de date. Acest sistem poate să fie unul convențional în care informațiile sunt stocate pe hârtie, depuse în dosare, registre, rafturi, încăperi, etc., sau poate să fie computerizat, caz în care informațiile sunt păstrate pe suport magnetic în volume, repertorii, fișiere pe suport magnetic. În cazul stocării informațiilor pe suport magnetic, operarea în baza de date se face prin intermediul unor programe.

S-a ajuns astfel la o situație în care fiecare firmă sau instituție trebuie să își dezvolte propriul sistem informatic de gestionare a bazei de date, dat fiind faptul că încă nu există un sistem informatic atât de general și de flexibil încât să se adapteze cerințelor oricărei organizații, cu atât mai mult, pentru o societate comercială, posibilitatea de a lucra nemijocit cu clientul (local, dar și la distanță) este o oportunitate deosebită. Prin realizarea ieșirii pe Internet și dând clientului posibilitatea să găseasca singur, de acasă, toate informațiile, ba mai mult, dând posibilitatea să vizualizeze cataloage de produse, devize și lucrări de referință reprezintă un pas important în realizarea integrării propriilor date și sisteme de afaceri cu alți oameni și alte firme din țară și din străinătate.

Webul a fost inventat în 1989 la Centrul European de Cercetări Nucleare (CERN) din Geneva, Elveția. Propunerea inițială de creare a unei colecții de documente având legături între ele a fost făcută de Tim Berners-Lee în martie 1989. Propunerea a apărut în urma problemelor de comunicare pe care le întâmpinau echipele de cercetători ce foloseau centrul, chiar și folosind poșta electronică.

Primul prototip al acestei colecții (mai întâi în format de text simplu) a apărut nu mult înainte de decembrie 1991, când s-a făcut prima lui demonstrație publică. Studiul a fost continuat prin apariția primei aplicații grafice Mosaic, în februarie 1993, realizată de cercetătorul Marc Andreessen de la centrul universitar National Center for Supercomputing Applications (NCSA) din orașul Urbana-Champaign din statul federal Illinois, SUA.

Un serviciu Web este o metodă de comunicare între două dispozitive electronice din cadrul internetului. Un serviciu web se mai poate defini ca fiind un set de protocoale și standarde folosite pentru schimbul de informații între aplicații sau sisteme. Aplicatiile software realizate în limbaje de programare diferite și care rulează pe diferite platforme pot folosi servicii web pentru a intershimba date pe Internet, într-un mod asemănător comunicării inter-procese pe un singur calculator.

Serviciul Web este bazat pe un set minim de concepte: seviciu, document XML, adresă, plic. În plus, toate serviciile Web trebuie să expună o interfață care este exprimată folosind WSDL (Web Service Definition Language). Mesajele conținute de plic și interfețele WSDL sunt bazate pe XML. O definiție mai formală a unui serviciu Web, bazată pe documentele W3 Consortium, organismul care se ocupă de elaborarea standardului pentru ele. Astfel un serviciu Web este o aplicație identificată printr-un URI (Uniform Resource Identifier) ale cărei interfețe și legături pot fi definite, descrise și descoperite folosind XML și pot interacționa în mod direct cu alte aplicații folosind mesaje bazate pe XML și protocoale Internet standard.

W3C definește "serviciul web" ca "un sistem proiectat pentru a sprijini interoperabilitatea mașină-mașină pentru a interacționa într-o rețea". Acesta are o interfață descrisă într-un format mașină care procesează informații (în special limbajul de descriere a serviciilor web, cunoscut prin acronimul WSDL). Alte sisteme interacționeaza cu serviciul Web prin intermediul mesajelor SOAP, de obicei, transmise prin HTTP, cu o serializare XML împreună cu alte standarde legate de Web.

Figura nr. 1.1 – Funcționarea serviciilor Web

"Big Web services", utilizează Extensible Markup Language (XML), si anume, mesaje care urmaresc standardul SOAP și au fost populare printre întreprinderile tradiționale. În astfel de sisteme, există adesea o descriere care poate fi citită automat de catre serviciile scrise în Web Services Description Language (WSDL). Acesta din urmă nu este o cerință a unui un obiectiv SOAP, dar este o condiție esențială pentru generarea automată a codului client în majoritatea framework-urilor Java .NET SOAP (framework, cum ar fi Apache Axis2, iar ca excepții CXF Apache și Spring).

Termenii de Internet și World Wide Web sunt des utilizați în vorbirea de zi cu zi fără a face mair diferențe între termeni. Totuși Internetul și World Wide Web nu sunt una și aceeași. Internetul este un sistem global de rețele interconectate, iar Web-ul este unul dintre serviciile care face ca internetul să funționeze. Este o colecție de documente text și alte resurse legate prin hyperlinkuri și URL-uri, de obicei accesate de browsere web din servere web. Pe scurt, ne putem gândi la Web ca la o aplicație cu ajutorul căreia Internetul funcționează.

Pentru a vizualiza o pagină pe World Wide Web începem prin tastarea URL-ului paginii într-un browser web sau prin a urma un hyperlink pe pagina respectivă sau resursă.

În primul rând, browserul rezolva porțiunea de nume-server a URL-ului (google.ro) într-o adresă de Protocol Interne utilizând baza de date distribuită global, cunoscută sub denumirea de Domain Name System (DNS). Browserul apoi cere sursa prin transmiterea unei cereri HTTP prin intermediul internetului la calculator, la acea adresă specificată.

Un serviciu Web (SW) expune o interfață de invocare a unei activități de către un client. Un client poate accesa un serviciu Web folosind standarde Internet. Un serviciu web rezolvă următoarele probleme:

interoperabilitate – un SW trebuie să permită comunicarea între orice platforme;

interfețe puternic tipizate – nu trebuie să existe ambiguitate relativ la tipul de date trimise sau primite spre/de la un SW. Aceste tipuri de date ar trebui să se poată mapa rezonabil peste tipurile de date folosite de limbajele procedurale existente;

folosirea standardelor Internet – implementarea unui SW trebuie să se bazeze pe standardele și protocoalele de comunicare deja existente, pentru a evita “reinventarea roții”

acces multilimbaj – un SW nu trebuie să reducă aria limbajelor care le pot utiliza; transparența trebuie să se manifeste atât la nivelul limba- jului în care s-a creat SW, cât și la nivelul clientului;

posibilitate de integrare în orice infrastructură distribuită – un SW nu trebuie să fie strâns cuplat de o anumită infrastructură de comunicare.

Astăzi, Web-ul reprezintă vîrful de lans al dezvoltării tehnologiilor Internet.

Internetul este o comunitate de rețele de calculatoare, un mediu informatic global cu resurse imense și o gamă largă de servicii. Se aproximeaza ca in internet sunt interconectate circa 120.000 rețele, 50 milioane stații de pe toate continemtele, din peste 150 de țări. Cu alte cuvinte internetul este o rețea din mai multe rețele.

Resursele internet sunt construite din:

– servere – calculatoare-gazdă la care se stochează informația și care prestează diverse servicii informatice;

– zeci de milioane de fișiere, baze de date în cadrul serverilor cu informații din cele mai diverse domenii;

– subsistemul de comunicație, ce asigură interconectarea și transferul de date între stații.

1.2 Arhitectura orientată pe servicii

Serviciile Web pot fi, de asemenea, folosite pentru a pune în aplicare o arhitectură orientată pe servicii (SOA), concepte, în cazul în care unitatea de bază a comunicare este un mesaj, mai degrabă decât o operație. Acest lucru este adesea menționat ca "mesaj"-orientat spre servicii.

SOA, serviciile Web sunt acceptate de majoritatea furnizorilor de software și de catre analiștii din industrie. Spre deosebire de serviciile Web RPC, aici accentul este pus pe “contractul” oferit de WSDL, mai degrabă decât pe detaliile care stau la baza implementării.

SOA, ca și arhitectură se bazează pe servicii de orientare, iar principiul fundamental este designul său. În cazul în care un serviciu prezintă o interfață simplă care abstractizeaza de departe complexitatea sa de bază, utilizatorii pot accesa serviciile independente, fără a avea cunoștințe de implementare a platformei de servicii.

Figura nr. 1.2 – Arhitectura serviciilor web

Un serviciu web este un serviciu pus la dispoziție utilizatorilor pe Internet. Multitudinea de protocoale și standarde disponibile începând de la sfârșitul secolului trecut în sfera Internetului au dat posibilitatea comunicării între aplicații pe sisteme aflate la distanțe mari, cu acces la Internet. Astfel, există sisteme ce oferă servicii de informare și procesare a informațiilor care în general sunt independente de platforma hardware; accesul la acestea se face prin servicii web.

Încă de la realizarea primei rețele de calculatoare accesibile prin TCP/IP, numită ARPANET, accesarea de informații rezidente pe un alt calculator decât cel curent și mai ales execuția unor rutine găzduite de altă mașină au devenit foarte importante. Pentru manipularea datelor între calculatoare, au fost inventate o serie de mecanisme și protocoale, parte din ele fiindu-vă descrise în alte cursuri (socket, FTP, HTTP, etc).

Printre marile companii de profil se numără și compania de software IBM care a lansat noi produse si servicii menite sa faciliteze eforturile clientilor de a profita mai rapid si mai usor de tendintele in crestere ale pietei privind adoptarea unei Arhitecturi Orientate pe Servicii (Service Oriented Architecture – SOA). Principalele obstacole care impiedică succesul unei SOA sunt deseori legate de stabilirea modului de a aborda o astfel de arhitectură, astfel încât să se evite costurile suplimentare și să se asigure că investițiile sunt alocate unei strategii de afaceri care va rezista fluctuațiilor pieței și schimbărilor din cadrul companiei.

Pentru a sprijini strategiile bazate pe SOA și pentru a fi centrate pe oameni, versiunea 6.0 a platformei WebSphere Portal integrează IBM Workplace și tehnologii colaborative capabile să faciliteze eforturile utilizatorilor de a dezvolta și implementa aplicații complexe care pot fi adaptate conform industriei căreia li se adresează. Noua platformă are la baza aplicația AJAX (Asynchronous JavaScript and XML) și este capabilă să creeze un mediu mult mai receptiv pentru utilizatori.

Ideea fundamentală a serviciilor Web este integrarea. Acest concept reprezintă un set de tehnologii standard care facilitează interoperabilitatea dintre sisteme heterogene, fie la nivel de organizație, fie pe Internet.

De fapt, serviciile Web sunt o formă de distribuție flexibilă, ieftină și eficientă a resurselor la nivel intra sau inter organizațional, indiferent de tipul de aplicații sau platforme de operare folosite.

CAPITOLUL 2

SOA – SERVICE ORIENTED ARHITECTURE

2.1 Conceptul SOA

SOA (Service Oriented Architecture – Arhitectură software bazată pe servicii) este un tip de arhitectură software care presupune distribuirea funcționalității aplicației în unități mai mici, distincte – numite servicii – care pot fi distribuite într-o rețea și pot fi utilizate împreună pentru a crea aplicații destinate afacerilor. Capacitatea mare cu care pot fi reutilizate aceste servicii în aplicații diferite este o caracteristică a arhitecturilor software bazate pe servicii. Aceste servicii comunică între ele trimițând informații de la un serviciu la altul. SOA este deseori văzută ca o evoluție a programării distribuite si a programării modulare. Arhitectura Orientata pe Servicii (SOA) este un grup de servicii care comunica intre ele. Procesul de comunicare implica atat schimburi simple de date intre un furnizor de servicii si beneficiarul acestora, cat si un sistem complex de sisteme intre doi sau mai multi furnizori. Inter-comunicarea implica gasirea unor legaturi de conectare a doua sau mai multe servicii intre ele.

SOA construieste aplicațiile în afara serviciilor software. Serviciile cuprind în mod intrinsec unități de funcționalitate neasociate și interconectate imprecis, care nu conțin caracteristici de conectivitate. Fiecare serviciu implementează o singură acțiune, de exemplu, completarea unei aplicații on-line pentru un cont, vizualizarea unui extras de cont bancar on-line, plasarea unei rezervări on-line sau unui număr de ordine pentru biletele de avion. În locul apelărilor cuprinse în codul sursă al serviciilor, se folosesc protocoale definite care descriu modul în care unul sau mai multe servicii pot comunica.

Scopul SOA este acela de a facilita conectarea unor părți consistente ale functionalităților, prin utilizarea serviciilor software existente, pentru a putea forma aplicații ad-hoc construite în întregime. Cu cât sunt mai mari sunt aceste părți, cu atat mai puține sunt punctele de interfață necesare implementării seturilor de functionalități. În ceea ce privește costurile periferice ale construirii unei aplicații suplimentare, SOA a demonstrat că acestea sunt scăzute deoarece există toate componentele software necesare pentru a satisface cerințele altor aplicații. În mod ideal, este nevoie doar de organizare pentru a produce noi aplicații.

Dezvoltatorii SOA asociază obiectele individuale SOA prin utilizarea orchestrației. În procesul de orchestrare dezvoltatorul asociază funcționalitatea softului (serviciile), într-un regim non-ierarhic folosind un instrument software care conține o listă completă a tuturor serviciilor disponibile, caracteristicile acestora, precum și mijloacele de a construi o cerere de utilizare acestor surse.

SOA oferă așa numita arhitectură de perspectivă și anume, poate unifica procesele de business prin structurarea aplicațiilor mari sub forma unei colecții de module mai mici, numite servicii. Astfel, grupuri diferite de utilizatori, atât din interiorul unei organizații, cât și din exteriorul acesteia, pot folosi aceste aplicații, dar și noile aplicații mai flexibile și cu o uniformitate mai mare, construite dintr-un conglomerat de servicii.

Fiecare companie are propriile „insule” de active corporative – angajații, furnizorii, partenerii (și informații despre aceștia) sau infrastructura IT existentă – care trebuie conectate și mai apoi puse în slujba atingerii obiectivelor companiei. Una dintre cele mai eficiente și eficace metode de integrare a aplicațiilor este printr-o Arhitectura Orientată pe Servicii (Service Oriented Architecture – SOA). SOA este o abordare de prelucrare distributivă, care implică crearea și administrarea de servicii separate (verificare creditului clientului, crearea unei inregistrări), care poate accesa activele companiei și părți de informații printr-o interfață comună, indiferent de locația sau particularitățile tehnice ale datelor. Aceste servicii sunt evidențiate și administrate într-o manieră de asociere liberă, care este concepută să maximizeze reorganizarea lor și să fie folosite, datorită extensiei lor, în procesele de business.

Baza pentru validarea acestora necesită date suficient de detaliate pentru a descrie nu numai caracteristicile acestor servicii, ci și datele care le conduc. Programatorii au utilizat intens XML în SOA pentru a structura datele pe care apoi le-au învăluit într-o descriere exhaustivă. În mod analog, Web Services Description Language (WSDL) descrie serviciile în sine, în timp ce protocolul SOAP descrie protocoalele de comunicare.

2.2 Principii SOA

Urmatoarele principii definesc regulile de bază pentru dezvoltarea, menținerea și utilizarea SOA:

Reutilizarea, granularitatea, modularitate, componentele și interoperabilitatea.

Conformitatea cu standardele (comune și specifice industriei)

Servicii de identificare și de clasificare, aprovizionare și de livrare, precum și monitorizare și urmărire.

Prima lucrare de cercetare referitoare la orientarea serviciilor dintr-o perspectivă industrială a fost elaborată de către Thomas Erl de la SOA Systems Inc. care a definit 8 principii specifice tuturor platformelor SOA. Aceste principii au fost publicate în “Arhitectura Orientată spre Servicii: Concepte, tehnologie și proiectare”, pe site-ul de cercetare www.soaprinciples.com în septembrie, 2005.

Contract de servicii standardizate – Serviciile aderă la un acord de comunicații, așa cum sunt definite în mod colectiv de către unul sau mai multe servicii de descriere documente.

Cuplajul slab – Servicii de a menține o relație care minimizează dependența și impune numai menținerea unei conștientizări reciproce.

Abstractizarea serviciului – Dincolo de descrierile din contractul de servicii, acestea ascund logica din lumea exterioară.

Serviciu reutilizabil – Logica este împărțită în servicii, cu intenția de a promova reutilizarea.

Autonomia serviciilor – Serviciile dețin controlul asupra logicii pe care o încapsulează.

Granularitate serviciului – O atenție deosebită este acordată design-ului pentru a oferi domeniului de aplicare nivelul optim, dreptul granular al funcționalității de afaceri într-o operațiune de serviciu.

Serviciu cu condișie de apatrid – Serviciu de minimizare a consumului de resurse, de gestionare a informațiilor atunci când este necesar.

Vizibilitatea serviciului – Serviciile sunt completate cu date prin care acestea pot fi descoperite și interpretate în mod eficient.

Componența serviciului – Serviciile în care componentele se comportă ca niște particpanți activi și eficienți, indiferent de mărimea și complexitatea compoziției.

Cheia livrării unor procese de business îmbunătățite se află în armonizarea noilor procese și aplicății cu infrastructura existentă, incluzând tehnologii de genul Enterprise Resource Planning (ERP) și customer relationship management (CRM – reprezintă un set de strategii, politici și tehnologii destinate atragerii, reținerii și fidelizării clienților. Într-un sens larg, CRM include activitățile aferente departamentelor de marketing, vânzări, financiar și suport tehnic relativ la clienți, potențiali clienți, furnizori și parteneri). O soluție eficientă de BPM va susține conceptul și implementarea SOA și aplicațiile adiacente. Orice soluție trebuie să aducă beneficii la final, fără a neglija ceea ce funcționează. Este importantă asigurarea tehnologiei care să permită utilizatorilor să identifice procesele afacerii printr-o notație grafică clară. Vitale sunt și capacitatea de execuție a acelui proces; facilitarea integrării sistemelor deja existente și a pachetele comerciale disponibile; și apoi analizarea și administrarea funcționării împreună a acestor procese. Enterprise Concept folosește o abordare unică și independentă a proceselor care separă logica proceselor afacerii de nivelul aplicațiilor, făcând integrarea mult mai lină și mai adaptabilă modificărilor ulterioare.

Figura nr. 2.1 – Arhitectura sistemelor CRM

O direcție importantă în dezvoltarea sistemelor distribuite și a sistemelor IT pentru servicii este adoptarea arhitecturii orientate pe servicii – SOA (Service Oriented Architecture). Aceasta este capabilă să susțină implicarea unor multiple organizatii furnizoare de servicii si, în același timp, să păstreze independența acestora în ceea ce privește platformele pe care le aleg și a limbajelor în care realizează implementarea. Serviciile software din arhitecturile SOA pot fi executate pe diferite calculatoare, ale diferiților furnizori de servicii, pot fi furnizate local sau externalizate, pot fi implementate în orice limbaj de programare și pot încapsula sisteme moștenite ale diferitelor organizații. De asemenea, ele pot avea diferite modele de plată: disponibilitate gratis, plata prin abonament sau plata la fiecare utilizare.

Aceste servicii pot avea scopuri extrem de variate, precum prelucrarea datelor, raționalizarea, reutilizarea funcționalităților încorporate în sisteme moștenite, sau integrarea activităților efectuate de mai mulți parteneri de afaceri. Arhitecturile permit o distribuire largă a artefactelor software; agilitatea și extensibilitatea pot fi crescute prin folosirea serviciilor descoperite la momentul execuției, adesea folosind tehnologii semantice.

Figura nr. 2.2 – Arhitectura orientată pe servicii

Având în vedere caracteristicile acestor tipuri de arhitecturi se poate spune că SOA prin componentele sale bine coordonate își propune să furnizeze o serie de servicii bussines complexe și bine definite. Astfel de servicii sunt concepute ținând cont de cele mai bune practici în conducerea afacerilor cunoscute sub numele de business process management. Însă pentru o implementare eficientă a SOA trebuie îndeplinite și anumite condiții tehnice referitoare la infrastructură cum ar fi:

Existența componentelor necesare pentru dezvoltarea aplicațiilor personalizate: servicii de date, autentificare și audit, platforme de căutare și notificare;

Platforme de securitate care să permită autorizarea și autentificarea utilizatorilor;

Servicii de date integrate pentru suportul SOA ;

Servicii de tip portal pentru interacțiunea utilizatorilor;

Servicii prezente în mod obișnuit intr-o companie cum ar fi :e-mail,colaborative, LDAP( un protocol aplicație folosit pentru interogarea și modificarea serviciilor de directoare prin intermediul TCP/IP)

Adoptarea conceptului SOA în cadrul unei companii presupune într-adevăr o tranziție. Iar această trecere nu trebuie să fie scopul, ci mijlocul prin care o companie își susține obiectivele și strategiile de business, prin urmare, etapele acestei tranziției către SOA sunt specifice fiecărei companii. Înainte de toate, este necesară o pregătire pentru tranziția către SOA, de acumulare a unor competențe specifice, printre care abilitatea de a măsura stadiul de pregătire a companiei pentru o astfel de adopție și capabilitatea de a identifica și măsura beneficiile pe care SOA le poate aduce către business și IT. De asemenea, trebuie realizată o identificare a inițiativelor de business care pot fi susținute prin adopția SOA. De cele mai multe ori, există înțelegerea greșită că tranziția către SOA presupune achiziția și implementarea unor tehnologii SOA.

Guvernarea SOA este un framework pentru luarea deciziilor și identificarea rolurilor într-o organizație, așa încât să asigure ca acțiunile IT sunt sincronizate cu strategiile companiei. Acest framework este definit de un grup sau un comitet responsabil de crearea regulilor de guvernare, de definirea rolurilor, a procesului de decizie, a responsabilităților persoanelor implicate în luarea deciziilor, a responsabilității rolurilor de execuție.

2.3 Avantajele si riscurile SOA

Avantajele arhitecturii SOA:

Interoperabilitatea intrinsecă între diferite sisteme și limbaje de programare reprezintă baza pentru integrarea de diverse aplicații printr-un protocol de comunicare;

Agregarea datelor și a serviciilor/funcționalităților în scopul realizării și întreținerii fluxurilor de date între toate sistemele/aplicațiile din cadrul soluției integrate.

Principiile arhitecturii SOA definesc atât reguli pentru proiectare, cât caracteristicile specifice unei astfel de arhitecturi:

Abstractizarea, întrucât serviciile ascund logica de procesare și sunt prezentate doar la nivel de interfețe;

Descoperirea serviciilor se realizează prin mecanisme facile, de exemplu prin intermediul unui repozitoriu de servicii;

Cuplarea slabă între module și encapsularea serviciilor, de exemplu prin servicii web;

Granularitate fină până la un nivel relevant din perspectiva utilizatorului, modularitate și interoperabilitate;

Conformarea cu anumite standarde în vederea asigurării schimbului de informații între diverse servicii:

Identificarea, categorisirea, livrarea și monitorizarea serviciilor existente.

Riscuri:

În cadrul procesului de proiectare sunt luate în considerare riscurile unui proiect software în vederea asigurării unui management eficient al riscurilor. Printre acestea se numără:

factori tehnologici: noutatea tehnologică, metodele de dezvoltare, instrumentele de dezvoltare;

factori de design: design defectuos din punct de vedere al complexității, modularizării; depistare erori neprevăzute în specificarea inițială a sistemului;

factori externi: calitatea specificației cerințelor, stabilitatea cerințelor și numărul de modificări ale specificațiilor, calitatea definirii, stabilitatea și disponibilitatea interfețelor externe;

factori de management de proiect: Deficiența de comunicare și de coordonare a activităților, riscuri de planificare printre care: estimarea eronată a resurselor umane, a perioadelor de timp, definirea responsabilităților.

Abordarea Smart SOA oferă avantaje atât pentru afacere, cât și pentru IT, prin extinderea valorii de business a implementării de la proiectele elementare la cele avansate. Abordarea Smart SOA necesită ca fiecare proiect să fie simplu și robust, eliminându-se complexitatea inutilă și construindu-se o fundație solidă pentru dezvoltarea viitoare.

Bazat pe o experiență vastă de lucru cu clienții și partenerii în domeniul aplicării SOA, firma Oracle a dezvoltat Oracle SOA Model de maturitate care oferă factorilor de decizie un punct de referință pentru a evalua nivelul de maturitate SOA al organizației lor.

Modelul Oracle SOA de maturitate pune mai departe oferă un punct vedere realist afacerii și o tehnologie pentru ceea ce este nevoie în cadrul companiei astfel încât adoptarea SOA sa fie realizată cu succes. Acest model are cinci nivele distincte de maturitate SOA, de la nivel 1 – SOA oportunist în care sunt tratate primele proiecte SOA până la nivel 5 de industrializare care este integrat la nivel intern, dar și cu partenerii de afaceri și prin care se pot valorifica noi oportuniăți de afaceri.

Fiecare nivel este în primul rând desemnat de o viziune și o strategie și este asociat cu beneficiile corespunzătoare. O companie poate începe drumul spre SOA cu un nivel de 3 de viziune, care este automatizarea strategică a afacerii, dar și de transformare. În acest caz, sfatul este aceța de a luaîn considerare punerea în aplicare a uneia dintre cele mai bune practici încadrate la nivelurile 1 și 2.

Figura nr. 2.3 – Modelul de maturitate SOA al firmei Oracle

CAPITOLUL 3

SOAP – SIMPLE OBJECT ACCESS PROTOCOL

3.1 Prezentare SOAP

Aplicatiile din ziua de azi comunica folosind Proceduri de Comunicare la Distanta (RPC –Remote Procedure Calls) intre obiecte cum ar fi DCOM si COBRA, dar HTTP nu a fost proiectat pentru acest lucru. RPC reprezinta o problema de compatibilitate si securitate; firewalls-urile si serverele proxy vor bloca in mod normal acest tip de traffic.

Un mod mai bun de comunicare intre aplicatii este prin HTTP, deoarece HTTP este suportat de toate browser-ele si serverele de internet.

SOAP ofera un mod de comunicare intre aplicatii care ruleaza pe sisteme diferite , cu tehnologii si limbaje de programare diferite.

SOAP inseamna 'Simple Object Access Protocol', mai exact este un protocol de apel al unor functii de pe alte servere folosind XML pentru codificarea numelor de functie apelate, parametri si returnarea rezultatelo; acest protocol presupune 3 parți: un înveliș care definește un framework pentru descrierea conținutului unui mesaj și cum se procesează acesta, un set de reguli de codificare pentru instanțe ale unor expresii din aplicații – tipuri de date definite, și o convenție pentru reprezentarea apelurilor și răspunsurilor procedurilor apelate la distanta. SOAP poate fi utilizat in combinație cu o varietate de alte protocoale, in special in combinație cu HTTP.

SOAP este:

un protocol de comunicație;

folosit pentru comunicația între aplicații;

un format pentru trimiterea de mesaje;

proiectat pentru comunicarea în Internet;

independent de platformă:

independent de limbaj.

Acronimul SOAP a fost abandonat odata cu versiunea 1.2 a standardului. Aceasta versiune a devenit o recomandare W3C incepand cu 24.06.2003.

Rareori acest acronim este confundat cu SOA, deși aplicatiile nu au nicio relație.

SOAP a fost proiectat, original, de catre Dave Winer, Don Box, Bob Atkinson si Mohsen Al-Ghosein in 1998 intr-un proiect pentru Microsoft (unde Atkinson si Al-Ghosein lucrau deja la momentul respectiv) ca un protocol de apel.

Dupa introducerea SOAP, a devenit baza pentru mai multe servicii complexe de Web, bazate pe Web Services Description Language (WSDL – Limbajul de Descriere a Serviciilor Web care este un limbaj bazat pe XML ce oferă un model de descriere a serviciilor web) si Universal Description Discovery and Integration (UDDI – ce permite localizarea și publicarea serviciilor). Aceste servicii, in special UDDI, s-au dovedit a fi de un interes scazut, dar o apreciere a acestora oferă o înțelegere mai completă a rolului așteptat de catre SOAP în comparație cu modul în care serviciile web au evoluat de fapt.

3.2 Blocuri de constructie SOAP

Un mesaj SOAP este un document XML normal care conține următoarele elemente (Figura nr. 3.1):

un element Plic care identifică documentul XML drept un mesaj SOAP;

un element Antet care conține informația din antet;

un element de Conținut care conține informația de comunicare și răspuns;

un element Defect care conține erorile și informatiile de status.

Figura nr. 3.1 – Structura SOAP

Reguli de sintaxa:

Regulile de sintaxa cele mai importante in SOAP sunt:

un mesaj SOAP TREBUIE codificat folosind XML;

un mesaj SOAP TREBUIE să folosească spațiul de nume Plic;

un mesaj SOAP TREBUIE să folosească Codificarea spațiul de nume;

un mesaj SOAP NU trebuiă să conțină referinte DTD;

un mesaj SOAP NU trebuie să conțină Porcesarea Instrucțiunilor XML.

Elementul Plic SOAP

Elementul Plic SOAP este elementul rădăcină a unui mesaj SOAP. Elementul Plic SOAP cerut este elementul rădăcină a unui mesaj SOAP. Acest element defineste documentul XML drept un mesaj SOAP. Spațiul de nume definește Plicul drept un Plic SOAP. Dacă este folosit un spațiu de nume diferit, aplicația generează o eroare și nu ia în considerare mesajul.

Stilul de codificare al Atributului

Stilul de codificare al Atributului este folosit pentru definirea tipului de date folosite în document. Acest atribut poate apărea la orice element SOAP, și se aplică conținutului elementului și tuturor elementelor copil. Un mesaj SOAP nu are nici o codificare implicită.

Elementul Defect SOAP

Elementul Defect SOAP conține erorile și informația status pentru un mesaj SOAP, este folosit pentru indicarea mesajelor de eroare. Dacă un element Defect este prezent, trebuie să apară ca un element rezultat al elementului Conținut. Un element Defect poate apărea doar o dată într-un mesaj SOAP.

Elementul Defect SOAP are următoarele sub elemente:

<faultcode> Un cod pentru identificarea defectului

<faultstring> O explicație citibilă a defectului

<faultactor> Informații despre cine a provocat apariția defectului

<detail> Conține erori specifice aplicației relative la elementul Conținut

Figura nr. 3.2 – Protocolul de schimb de mesaje

Coduri Defect SOAP

Valorile Codului Defect definite mai jos trebuiesc folosite în elementul codului defect când sunt descrise defecte:

Tabelul nr. 3.1

O cerere SOAP ar putea fi un POST HTTP sau o cerere HTTP GET. Cereea HTTP POST necesită cel putin două antete HTTP: Conținut-Tip și Conținut-Lungime

Continut-Tip

Antetul Continut-Tip pentru un răspuns/cerere SOAP definește tipul MIME pentru mesajul și codificarea caracterului (opțional) folosit pentru corpul XML al cererii sau al răspunsului.

Conținut-Lungime

Antetul Conținut-Lungime pentru un răspuns/cerere SOAP specifică numărul de byti în corpul cererii sau răspunsului.

3.3 Specificații SOAP și model de procesare

Specificațiile SOAP definesc cadrele de mesaje care constau în:

Modelul de procesare SOAP definește regulile de procesare a unui mesaj SOAP;

Extensibilitatea modelului SOAP definelte conceptele caracteristicilor SOAP și modulelor SOAP;

Protocolul cadru SOAP este baza pentru descrierea regulilor de definire a unui protocol obligatoriu care poate fi utilizat pentru schimbul de mesaje SOAP și noduri SOAP.

Construcția mesajului SOAP definește structura unui mesaj SOAP.

Model de procesare

Modelul de procesare SOAP descrie un model de procesare distribuit, participanții săi, nodurile SOAP, și modul în care un receptor SOAP procesează un mesaj SOAP. Astfel, sunt definite urmatoarele noduri SOAP:

a. Emitator SOAP

Un nod SOAP care transmite un mesaj SOAP

b. Receptor SOAP

Un nod SOAP care accepta un mesaj SOAP

c. Calea mesajului SOAP

Set de noduri SOAP, prin care un singur mesaj SOAP poate trece.

d. Emitatorul initial SOAP (initiatorul)

Expeditorul SOAP care inițiază un mesaj SOAP de la punctul de plecare al unei căi de mesaj SOAP.

e. Intermediarul SOAP

Un intermediar SOAP este atât un receptor și un expeditor SOAP și este vizat din cadrul unui mesaj SOAP. Acesta procesează blocuri antet SOAP orientate catre el și acționează pentru a transmite un mesaj SOAP către un receptor SOAP final.

f. Receptor SOAP final

Receptorul SOAP, care este o destinație finală a unui mesaj SOAP, este responsabil pentru procesarea conținutul SOAP, precum și de orice blocuri SOAP antet orientate catre el. În anumite circumstanțe, este posibil ca un mesaj SOAP sa nu poata ajunge la un receptor SOAP final, de exemplu, din cauza unei probleme la un intermediar SOAP. Un receptor SOAP final nu poate fi, de asemenea, un intermediar SOAP pentru același mesaj SOAP.

3.4 Metode de transport

Atât SMTP și HTTP sunt protocoale valide de aplicare, utilizate ca transport pentru SOAP, dar HTTP a câștigat un grad de acceptare mai larg care funcționează foarte bine cu infrastructura de internet de astăzi, în mod special, HTTP funcționează bine cu firewall-uri de rețea. SOAP poate fi, de asemenea utilizat peste HTTPS (care este protocolul HTTP la același ca la nivel de aplicație, dar utilizează un sub-protocol criptat de transport), fie cu autentificare simpla sau reciprocă.

Acesta este un avantaj major față de alte protocoale, precum GIOP / IIOP sau DCOM care sunt în mod normal filtrate de firewall. SOAP peste AMQP este încă o posibilitate pe care unele implementări o suporta.

3.5 Formatul mesajului SOAP

XML a fost ales ca format de mesaj standard, din cauza utilizării sale pe scară largă de către marile corporații și a eforturilor de dezvoltare „open source”. În plus, o mare varietate de instrumente disponibile gratuite facilitează în mod semnificativ trecerea la o punere în aplicare pe bază SOAP. Sintaxa, oarecum de lungă durată, a XML poate fi atât un avantaj, cât și un dezavantaj. În timp ce promovează lizibilitate pentru om, facilitează de detectarea erorilor, și pentru a evita problemele de interoperabilitate, cum ar fi octet-comandă (Endianness), aceasta poate încetini viteza de procesare și poate fi greoaie. De exemplu, CORBA, GIOP, ICE, și dispozitivele hardware sunt disponibile pentru a accelera procesarea de mesaje XML.

Exemplu de mesaj:

POST /InStock HTTP/1.1

Host: www.google.com

Content-Type: application/soap+xml; charset=utf-8

Content-Length: 299

SOAPAction: "http://www.w3.org/2003/05/soap-envelope"

<?xml version="1.0"?>

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">

<soap:Header>

</soap:Header>

<soap:Body>

<m:GetStockPrice xmlns:m="http://www.google.com/stock">

<m:StockName>IBM</m:StockName>

</m:GetStockPrice>

</soap:Body>

</soap:Envelope>

3.6 Avantajele și dezavantajele SOAP

Avantaje:

Prin utilzarea SOAP cu HTTP se permite o mai bună comunicație în spatele unui proxy sau firewall decât presupunea precedenta tehnologie de apel la distanță.

SOAP este destul de versatil pentru a permite utilizarea protocoalelor de transport diferite. Structura de date standard utilizează HTTP ca protocol de transport, dar alte protocoale sunt de asemenea utilizabile (TCP, SNMP).

Dezavantaje:

Deoarece formatul XML este lung, SOAP poate fi destul de lent în comparație cu tehnologiile middleware, cum este CORBA. Aceasta nu constituie o problemă când se trimit numai mesaje scurte.

Când ne bazăm pe HTTP ca protocol de transport, rolurile părților care interacționează sunt stabilite. Doar o parte (clientul) poate utiliza serviciile altuia. Deci, dezvoltatorii trebuie sa utilizeze polling în schimbul notificării în aceste cazuri comune.

Deoarece SOAP dispune de multe implementări SOAP cantinatea de date care poate fi trimisă este limitată.

CAPITOLUL 4

MODELARE SOA – REALIZAREA APLICAȚIILOR CU AJUTORUL VISUAL STUDIO ȘI VISUAL BASIC

4.1 Generalități

Arhitecturile orientate spre servicii reprezintă următorul pas în arhitecturile software. SOA este o arhitectură în care funcțiile sunt definite ca servicii independete, cu interfete bine definite. Respectând principiile SOA, câteva standard au fost create și sunt folosite în aceste moment. Cele mai cunoscute sunt însă serviciile web.

Principalele direcții de cercetare în domeniul serviciilor web semantice curpind OWL-S, WSMO sau SESA (Semantically Enabled Service-oriented Architectures)

Figura nr. 4.1 – Arhitectura orientată spre servicii

OWL-S

OWL-S (Ontology Web Language for Services) este un limbaj formal pentru a descrie proprietăți și funcții ale serviciilor. OWL-S extinde OWL pentru a suporta descoperirea serviciilor în funcție de proprietăți, compunere și invocare automată, monitorizarea execuției. OWL-S nu înlocuiește standardele curente pentru servicii web, ci încearcă să adauge capacități semantice. Principalele noțiuni care stau la bază sunt:

Service Profile – caracterizarea unui serviciu web, prin intermediul proprietăților. Este folosit pentru a popula regiștrii de servicii (un serviciu poate avea mai multe profile), descoperire și selecție. Profilul poate conține proprietăți funcționale precum intput, output, pre-condiții, rezultate și proprietăți nefuncționale (proveniență, timp de răspuns, securitate, arie geografică). Service Profile nu impune o reprezentare a serviciului. Folosind subclase OWL a unei clase oferite – ServiceProfile – se pot crea clase specializate de reprezentare a serviciului ce pot fi folosite ca ServiceProfile

Service Model (Process Model) – realizează o descriere interpretabilă a comportamentului serviciului împreună cu un protocol de interacțiune, specificând mesajele abstracte, tipul informațiilor ontologice transmise. Este folosit pentru invocare, compunere, monitorizare. Orice proces are input, output, precondiții și efecte. Procesele pot fi atomice, compuse sau simple.

Un proces reprezintă o transformare dintr-o stare ințială într-o mulțime de posibile stări finale. Starea inițială este definită de un input și precondiții, iar mulțimea stărilor rezultat sunt descrise de o condiție(indică când un rezultat e generat), un output și efecte ale execuției procesului. Un exemplu de proces atomic ce descrie mecanismul de autenficare:

<process:AtomicProcess rdf:ID=”LogIn”>

<process:hasInput rdf:resource=”#AcctName”/>

<process:hasInput rdf:resource=”#Password”/>

<process:hasOutput rdf:resource=”#Ack”/>

<process:hasPrecondition isMember(AccName)/>

<process:hasResult>

<process:Result>

<process:inCondition>

<expr:SWRL-Condition>correctLoginInfo(AccName,Password)</expr:SWRL-Condition>

</process:inCondition>

<process:withOutput rdf:resource=“#Ack“>

<valueType rdr:resource=“#LoginAcceptMsg”>

</process:withOutput>

<process:hasEffect>

<expr:SWRL-Condition>loggedIn(AccName,Password)</expr:SWRL-Condition>

</process:hasEffect>

</process:Result>

</process:hasResult>

</process:AtomicProcess>

Pe lângă aceste limbaje, WSML oferă o mapare către XML, RDF și OWL, oferind posibilitatea schimbului de ontologii WSMO pe web.

Figura nr. 4.2 – Exemplu de colaborare între servicii web

XML (eXtensible Markup Language) este tot o formă mai simplă de SGML, dar înlătură rigiditatea predecesorului său HTML prin faptul că permite definirea liberă, la alegere, a elementelor de marcare (etichete), conform cu specificul documentului (în acest sens poate fi numit un limbaj cu caracter semantic), și poate reprezenta structura proprie, internă a unui document. XML este adoptat ca standard deschis, de facto, în 1998 de către W3C și devine apoi extrem de răspândit (6). XML este independent de platformă, procesoarele lui sunt ușor de implementat, și este metoda principală de reprezentare a documentelor pentru transmiterea prin Internet. Documentele prezentate în XML pot fi citite atât de om cât și de mașină.

4.2 Realizarea aplicației „GetSourceCode”

În informatică, codul sursă reprezintă o colecție de instrucțiuni, specifică unui anumit limbaj de programare. Codul sursă permite programatorului să comunice cu computerul folosind un număr bine definit de instrucțiuni. La limbajele de programare de nivel înalt instrucțiunile din codul sursă poartă nume mai ușor de reținut și de înțeles de către om decât instrucțiunile propriu zise ale hardware-ului, care sunt alcătuite din cifre și eventual și litere fără înțeles evident.

Codul sursă nu poate fi înțeles direct de către calculator; pentru aceasta el trebuie mai întâi transpus (prin asamblare, compilare sau interpretare) în așa numitul "cod obiect" sau și "cod mașină", care este în general pe înțelesul hardware-ului și executabil.

Pentru aplicație am utilizat softul de programare Visual Studio Beta 11. Multe elemente noi din Visual Studio 11 sunt legate de interfață și de modul în care platforma e folosită zilnic – în primul rând există un modul mai bun de indexare ce face mai ușoară regăsirea anumitor informații despre proiecte.

Am utilizat aplicația windows forms și am început configurarea aplicației GetSourceCode, prin introducerea butonului cu care vom accesa codul sursa al unei pagini web, a unui câmp text pentru inserarea adresei web, un câmp etichetă pentru a indica utilizatorului ce trebuie inserat, si un câmp multitext unde va fi afișat codul sursă.

În Visual Basic, aceasta este de forma:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Net;

using System.IO;

namespace WindowsFormsApplicationAndre

{

public partial class GetSourceCode : Form

{

public GetSourceCode()

{

InitializeComponent();

}

private void Form1_Load(object sender, EventArgs e)

{

}

private void button1_Click(object sender, EventArgs e)

{

string url = urlTextBox.Text;

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

HttpWebResponse response = (HttpWebResponse)request.GetResponse();

StreamReader sr = new StreamReader(response.GetResponseStream());

richTextBox1.Text = sr.ReadToEnd();

sr.Close();

}

private void label1_Click(object sender, EventArgs e)

{

}

}

}

Componentele sunt de forma:

namespace WindowsFormsApplicationAndre

{

partial class GetSourceCode

{

/// <summary>

/// Required designer variable.

/// </summary>

private System.ComponentModel.IContainer components = null;

/// <summary>

/// Clean up any resources being used.

/// </summary>

/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>

protected override void Dispose(bool disposing)

{

if (disposing && (components != null))

{

components.Dispose();

}

base.Dispose(disposing);

}

#region Windows Form Designer generated code

/// <summary>

/// Required method for Designer support – do not modify

/// the contents of this method with the code editor.

/// </summary>

private void InitializeComponent()

{

System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(GetSourceCode));

this.button1 = new System.Windows.Forms.Button();

this.urlTextBox = new System.Windows.Forms.TextBox();

this.richTextBox1 = new System.Windows.Forms.RichTextBox();

this.label1 = new System.Windows.Forms.Label();

this.SuspendLayout();

//

// button1

//

this.button1.BackColor = System.Drawing.SystemColors.ActiveCaption;

this.button1.Location = new System.Drawing.Point(12, 118);

this.button1.Name = "button1";

this.button1.Size = new System.Drawing.Size(158, 35);

this.button1.TabIndex = 0;

this.button1.Text = "Get Source Code";

this.button1.UseVisualStyleBackColor = false;

this.button1.Click += new System.EventHandler(this.button1_Click);

//

// urlTextBox

//

this.urlTextBox.Location = new System.Drawing.Point(12, 81);

this.urlTextBox.Name = "urlTextBox";

this.urlTextBox.Size = new System.Drawing.Size(158, 20);

this.urlTextBox.TabIndex = 1;

//

// richTextBox1

//

this.richTextBox1.CausesValidation = false;

this.richTextBox1.Location = new System.Drawing.Point(191, 28);

this.richTextBox1.Name = "richTextBox1";

this.richTextBox1.Size = new System.Drawing.Size(543, 274);

this.richTextBox1.TabIndex = 2;

this.richTextBox1.Text = "";

//

// label1

//

this.label1.AutoSize = true;

this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(0)));

this.label1.Location = new System.Drawing.Point(12, 54);

this.label1.Name = "label1";

this.label1.Size = new System.Drawing.Size(140, 13);

this.label1.TabIndex = 3;

this.label1.Text = "Insert http:// website below:";

this.label1.Click += new System.EventHandler(this.label1_Click);

//

// GetSourceCode

//

this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);

this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;

this.BackColor = System.Drawing.SystemColors.GradientActiveCaption;

this.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("$this.BackgroundImage")));

this.ClientSize = new System.Drawing.Size(734, 314);

this.Controls.Add(this.label1);

this.Controls.Add(this.richTextBox1);

this.Controls.Add(this.urlTextBox);

this.Controls.Add(this.button1);

this.ForeColor = System.Drawing.SystemColors.ActiveCaptionText;

this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D;

this.Name = "GetSourceCode";

this.Text = "GetSourceCode";

this.Load += new System.EventHandler(this.Form1_Load);

this.ResumeLayout(false);

this.PerformLayout();

}

#endregion

private System.Windows.Forms.Button button1;

private System.Windows.Forms.TextBox urlTextBox;

private System.Windows.Forms.RichTextBox richTextBox1;

private System.Windows.Forms.Label label1;

}

}

După cosmetizarea ferestrei aplicației, prin depanare avem:

Figura nr. 4.3 – Fereastra aplicației GetSourceCode

După inserarea unei adrese web de forma http:// fereastra se prezintă a in Figura nr. 4.4:

Figura nr. 4.3 – Fereastra aplicației GetSourceCode după inserarea unei adrese web

Codul sursă complet al paginii se regăsește in ANEXA NR. 1

4.3 Realizarea aplicației „SecurityGate”

Pentru această aplicație am utilizat softul VBScript care este prescurtarea pentru Visual Basic Scripting Edition. Acesta este un limbaj de scriptare dezvoltat de Microsoft și acceptat de Web browser-ul Internet Explorer de la Microsoft. VBScript se bazează pe limbajul de programare Visual Basic, dar este mult mai simplu. În multe privințe este similar cu JavaScript. Permite autorilor de pagini Web să includă controale interactive, cum ar fi butoane și bare de scroll, în paginile lor Web.

Am lansat un nou proiect WindowsFormApplication în care am inserat două câmpuri text, două etichete (username și password) și două butoane unul pentru Sign In si respectiv, Cancel.

Pentru a fi programarea comezilor acestora am editat acest Form astfel:

Public Class Form1

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

Me.Close()

End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

If TextBox1.Text = "justme" And TextBox2.Text = "12345" Then

Form2.Show()

Else

MsgBox("Wrong Information")

End If

End Sub

End Class

Username-ul aplicației va fi justme, iar parola: 12345. În caz că aceste informații sunt inserate greșit, se va afișa un MessageBox care ne anunță a informația este greșită.

Figura nr. 4.4 – Fereastră informație greșită

Când informațiie sunt inserate corect, softul ne va informa printr-o fereastră nouă că este aplicația este sigură. Pentru acesta, în prezentul proiect am adăugat un formular nou pe care l-am editat și denumit în primul formular.

Definirea formularului nr. 2

Public Class Form2

Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Form1.Show()

Me.Hide()

End Sub

Private Sub Label1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label1.Click

End Sub

End Class

Denumirea formularului nr. 2 în formularul nr. 1:

Public Class Form1

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

Me.Close()

End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

If TextBox1.Text = "justme" And TextBox2.Text = "12345" Then

Form2.Show()

MsgBox("Thank you!")

Me.Hide()

Else

MsgBox("Wrong Information")

End If

End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Form2.Hide()

End Sub

End Class

Figura nr. 4.5 – Fereastra de infomare asupra securității

Aplicația finală este de forma:

Figura nr. 4.6 – Aplicație securityGate

Funcțiile Dispose(Boolean) si InitializeComponent sunt prezentate în ANEXA NR. 2.

4.4 Realizarea aplicației „hash”

Criptografia reprezintă o ramură a matematicii care se ocupă cu securizarea informației precum și cu autentificarea și restricționarea accesului într-un sistem informatic. În realizarea acestora se utilizează atât metode matematice, cât și metode de criptare cuantică. Criptologia este considerată ca fiind cu adevărat o știință de foarte puțin timp. Aceasta cuprinde atât criptografia – scrierea secretizată – cât și criptanaliza. De asemenea, criptologia reprezintă nu numai o artă veche, ci și o știința nouă: veche pentru că Iulius Cezar a utilizat-o deja, dar nouă pentru că a devenit o temă de cercetare academico-științfică abia începând cu anii 1970. Această disciplină este legată de multe altele, de exemplu de teoria numerelor, algebră, teoria complexității, informatică [16].

Funcțiile hash criptografice (adesea numite message digest) nu folosesc neapărat chei, sunt o clasă importantă de algoritmi criptografici. Aceștia primesc date de intrare (adesea un întreg mesaj), și produc un hash scurt, de lungime fixă, sub forma unei funcții neinversabile. Pentru hash-urile bune, coliziunile (două texte clare diferite care produc același hash) sunt extrem de dificil de găsit [16].

În sens matematic, funcțiile hash (clasă de funcții denumite în lucrări de specialitate și funcții de dispersie sau funcții de rezumat) sunt funcții definite pe o mulțime cu multe elemente (posibil infinită) cu valori într-o mulțime cu un număr fix și mai redus de elemente. Funcțiile hash nu sunt inversabile [16]. În informatică, funcțiile hash sunt folosite pentru a accelera căutările în tabele, cum este cazul în bazele de date mari sau comparările de date. Valoarea unei funcții hash este denumită rezumat, valoare hash, cod hash, sumă hash sau doar hash. De asemenea, pot fi folosite drept sume de control sau coduri corectoare de erori (deși nu trebuie confundate cu acestea două), sau, în criptografie, drept componente în schemele de semnătură digitală.

O funcție hash poate lega două sau mai multe chei de la aceeași valoare hash. În multe aplicații, este de dorit minimalizarea șansei apariției unor astfel de coliziuni, ceea ce înseamnă că funcția hash trebuie să lege cheile de valorile hash cât mai uniform posibil. De asemenea, în funcție de aplicație, alte proprietăți pot fi necesare. Deși ideea a fost concepută în anii 1950, proiectarea optimă a funcțiilor hash este încă un subiect activ de cercetare și discuție. Funcțiile hash sunt utilizate și ca sume de control sau funcții hash criptografice, dar nu trebuie confundate cu caracterele de verificare, amprentele numerice, funcțiile de randomizare, codurile de corectare a erorilor. Deși aceste concepte se suprapun într-o oarecare măsură, fiecare are propriile sale utilizări și cerințele și este proiectat și optimizat în mod diferit [17].

Pentru aplicația „hash” am utilizat aplicația windows forms și am început configurarea aplicației prin introducerea butonului cu care vom accesa textul criptat al cuvânt sau grup de cuvinte, a unui câmp text pentru inserarea cuvântul sau grupul respectiv și un câmp etichetă pentru a indica utilizatorului ce trebuie inserat.

În Visual Basic, aceasta este de forma:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Security.Cryptography;

namespace hash

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

private void button1_Click(object sender, EventArgs e)

{

MD5CryptoServiceProvider myMD5 = new MD5CryptoServiceProvider();

byte[] plainBytes = Encoding.ASCII.GetBytes(textBox1.Text);

myMD5.ComputeHash(plainBytes);

byte[] hashBytes = myMD5.Hash;

MessageBox.Show(BitConverter.ToString(hashBytes));

}

private void label1_Click(object sender, EventArgs e)

{

}

}

}

Codul componentelor aplicației este prezentat în ANEXA NR. 3.

Iar aplicația va fi de forma:

Figura nr. 4.7 – Aplicația „hash”

CONCLUZII

Modelele prezentate pot fi utilizate cu succes în transmiterea securizată a mesajelor confidențiale sau în codarea parolelor de salvat. Deși funcția “hash” este optimizată pentru mesaje în clar de dimensiuni rezonabile, soluția pornind de la care s-a definit acest model teoretic poate înregistra performanțe și în zona mult mai complexă a bazelor de date – camuflarea valorilor unor câmpuri confidențiale din anumite tabele.

Modelul descris este eficient și în măsura în care alfabetul destinație este suficient de neobișnuit și dificil de intuit ca și reguli de transformare. Aceeași eficiență depinde, însă, esențial, de performanța și complexitatea algoritmilor de generare a cheilor.

ANEXA NR. 1

CODUL SURSĂ AL ADRESEI: http://www.wikipedia.org

<!DOCTYPE html>

<html lang="mul" dir="ltr">

<head>

<!– Sysops: Please do not edit the main template directly; update /temp and synchronise. –>

<meta charset="utf-8">

<title>Wikipedia</title>

<meta name="title" content="Wikipedia">

<meta name="description" content="Wikipedia, the free encyclopedia that anyone can edit.">

<meta name="author" content="Wikimedia Foundation">

<meta name="copyright" content="Creative Commons Attribution-Share Alike 3.0 and GNU Free Documentation License">

<meta name="publisher" content="Wikimedia Foundation">

<meta name="language" content="Many">

<meta name="robots" content="index, follow">

<!–[if lt IE 7]><meta http-equiv="imagetoolbar" content="no"><![endif]–>

<meta name="viewport" content="initial-scale=1.0, user-scalable=yes">

<link rel="apple-touch-icon" href="//en.wikipedia.org/apple-touch-icon.png">

<link rel="shortcut icon" href="//en.wikipedia.org/favicon.ico">

<link rel="copyright" href="//creativecommons.org/licenses/by-sa/3.0/">

<link rel="copyright" href="//www.gnu.org/copyleft/fdl.html">

<link rel="license" href="//creativecommons.org/licenses/by-sa/3.0/">

<link rel="license" href="//www.gnu.org/copyleft/fdl.html">

<link rel="stylesheet" href="//bits.wikimedia.org/en.wikipedia.org/load.php?debug=false&amp;lang=en&amp;modules=mediawiki.legacy.shared%7Cskins.monobook&amp;only=styles&amp;skin=monobook&amp;*">

<!– Keep <style> in sync with: http://meta.wikimedia.org/wiki/Www.wikipedia.org_template –>

<style>

a {

unicode-bidi: embed;

white-space: nowrap;

}

div.divTop10item {

position: absolute;

}

div.divTop10item a {

display: block;

padding: 0;

text-decoration: none;

}

div.divTop10item strong {

font-size: larger;

}

div.divTop10item a:hover strong {

text-decoration: underline;

}

div.divTop10item em,

div.divTop10item small {

color: Black;

text-decoration: none;

}

div.divTop10item em {

font-style: italic;

}

div.divTop10item em.emNonItalicLang {

font-style: normal;

}

div#p-search {

float: none;

margin: 1em auto 1.5em auto;

max-width: 95%;

padding: 0.3em;

text-align: center;

vertical-align: middle;

width: 540px;

}

div#p-search h5 {

white-space: normal;

}

div#p-search label span {

white-space: nowrap;

}

form#searchform fieldset {

background-color: #f9f9f9;

border: 1px solid #aaa;

margin-top: 0.5em;

padding: 0.7em;

width: auto;

}

form#searchform input#searchInput {

font-size: 1.2em;

margin: 0;

padding: 0;

vertical-align: top;

}

form#searchform select#language {

margin: 0 0.4em;

padding: 0;

vertical-align: middle;

}

form#searchform input.searchButton {

font-size: 1.2em;

margin: 0;

padding: 0;

vertical-align: middle;

}

div#divOtherProjects {

float: left;

font-weight: bold;

margin: 1.5em 0;

text-align: center;

vertical-align: middle;

width: 100%;

}

div.divOtherProjectsItem {

float: left;

height: 60px;

min-width: 12em;

width: 33%;

}

div#divSiteInfo {

clear: both;

margin: 2.5em 0 2em 0;

text-align: center;

}

</style>

<style media="screen, projection">

body {

background: white;

}

</style>

<style media="print">

body {

background-color: transparent;

}

a {

color: black !important;

background: none !important;

padding: 0 !important;

}

a:link,

a:visited {

color: #520;

background: transparent;

}

img {

border: none;

}

</style>

<!– TODO: separate into homepage specific stylesheet–>

<style>

#wm-home-header {

margin: 1em 0 0.3em 0;

text-align: center;

font-size: 30px;

line-height: 110%;

font-family: 'Linux Libertine', 'Hoefler Text', Georgia, 'Times New Roman', Times, serif;

padding: 10px 0;

}

#wm-featured-languages {

position: relative;

text-align: center;

vertical-align: middle;

max-width: 100%;

width: 42em;

margin: 0 auto;

height: 26em;

}

.lang1 {

top: 0%;

right: 60%;

}

.lang2 {

top: 0%;

left: 63%;

}

.lang3 {

top: 20%;

left: 3%;

}

.lang4 {

top: 20%;

right: 3%;

}

.lang5 {

top: 40%;

left: 0%;

}

.lang6 {

top: 40%;

right: -3%;

}

.lang7 {

top: 60%;

left: 3%;

}

.lang8 {

top: 60%;

right: 3%;

}

.lang9 {

top: 80%;

right: 59%;

}

.lang10 {

top: 80%;

left: 59%;

}

#wm-globe {

position: absolute;

left: 50%;

top: 50%;

width: 0;

height: 0;

}

#wm-globe-inner {

position: relative;

left: -100px;

top: -115px;

width: 200px;

height: 200px;

}

.wm-home-bookshelf-container {

width: 100%;

overflow: hidden;

margin: 2em 0 0.5em 0;

}

.wm-home-bookshelf-container-small {

width: 100%;

overflow: hidden;

margin: 0.5em 0;

}

.wm-home-bookshelf {

width: 1100%;

overflow: hidden;

position: relative;

left: -500%;

text-align: center;

white-space: nowrap;

}

.wm-project-list {

text-align: center;

margin: 0.5em 3em 2.5em 3em;

}

.wm-project-list-large {

font-size: larger;

}

.wm-project-list-tiny {

margin: 0.5em 3em 3em 3em;

}

.wm-project-list-other {

margin: 0 3em 2em 3em;

font-weight: bold;

}

</style>

<!–TODO: separate into mobile specific stylesheet–>

<style>

/* mobile specific media queries */

@media all and (max-width:480px) {

#wm-featured-languages {

width: auto;

height: auto;

padding-top: 10px;

text-align: left;

font-size: 0.8em;

margin-top: 7em;

}

#wm-globe {

right: 5%;

left: auto;

top: -70px;

margin-top: -7em;

}

#wm-globe-inner {

left: auto;

top: auto;

}

#wm-globe,

#wm-globe-inner img,

#wm-globe-inner {

width: 70px;

height: 70px;

}

div.divTop10item {

right: auto;

top: auto;

position: relative;

left: auto;

text-align: left;

margin-left: 1em;

display: block;

float: left;

width: 40%;

}

div#p-search {

margin-top: 0;

height: 6em;

position: absolute;

top: 5em;

left: 0.4em;

right: 1em;

width: auto;

}

#searchInput {

width: 100%

}

#wm-home-header {

margin-top: 10px;

text-align: left;

}

.wm-home-bookshelf {

width: auto;

left: auto;

overflow: hidden;

}

.wm-home-bookshelf img {

display: none

}

.wm-home-bookshelf img:first-child {

display: inline-block

}

.wm-project-list a {

word-wrap: break-word;

white-space: normal;

}

#p-search label {

display: none

}

.wm-project-list {

font-size: 0.7em

}

div.divOtherProjectsItem {

width: 50%;

text-align: left;

}

#www-wikipedia-org .divider {

clear: both;

padding: 0.5em 1em 0 1em !important;

}

.wm-home-bookshelf-container,

.wm-home-bookshelf-container-small,

.wm-project-list {

margin: 1em 1em 0em 1em;

text-align: left;

width: auto;

}

.wm-home-bookshelf {

text-align: left

}

}

@media all and (max-width:240px) {

div.divTop10item,

div.divOtherProjectsItem {

width: 100%

}

#wm-home-header img {

width: 100px;

height: auto;

}

}

</style>

<script>

// Keep <script> in sync with: http://meta.wikimedia.org/wiki/Www.wikipedia.org_template

function $(a) {

return document.getElementById(a);

}

function addLoadEvent(a) {

if (window.addEventListener) {

window.addEventListener('load', a, false);

} else if (window.attachEvent) {

window.attachEvent('onload', a);

}

}

function getLang() {

var a = navigator.language || navigator.userLanguage,

b = document.cookie.match("(?:^|\W)searchLang=([^;]+)");

return (b ? b[1] : a).toLowerCase();

}

addLoadEvent(function () {

var b, c,

a = getLang();

if (!a) {

return;

}

b = a.match(/^\w+/);

if (!b) {

return;

}

b = (b[0] === 'nb') ? 'no' : b[0];

// Comma-separated list of wikis with 100,000+ entries, ordered

// alphabetically by language name. Trailing comma required for expediency.

// NB: This list is Wikipedia specific, do not sync with other templates.

c = 'ar,bg,ca,cs,da,de,en,es,eo,eu,fa,fr,hr,id,it,he,hi,hu,nl,ja,ko,lt,ms,no,pl,pt,kk,ro,ru,sk,sl,sr,fi,sv,tr,uk,vi,vo,war,zh,';

if (c.indexOf(b + ',') >= 0) {

$('language').value = b;

}

});

function convertChinese(a) {

var b;

if ('zh-hans,zh-cn,zh-sg,zh-my,'.indexOf(a + ',') < 0) {

return;

}

// These are Wikipedia specific, don't sync

$('zh_tag').innerHTML = "自由的百科全书";

$('zh_top10').title = "Zhōngwén — Wikipedia — 自由的百科全书";

$('zh_art').innerHTML = "条目";

b = $('zhsearch');

b.innerHTML = "搜索";

b.title = "Sōusuǒ";

$('zhothers').innerHTML = "其他语言";

}

function convertZhLinks() {

var b,

a = getLang();

if (a.indexOf('zh') !== 0) {

return;

}

b = a.substring(3);

if (b === 'mo') {

b = 'hk';

} else if (b === 'my') {

b = 'sg';

}

if ('cn,tw,hk,sg,'.indexOf(b) >= 0) {

$('zhwiki').href += 'zh-' + b + '/';

$('zhothers').href = $('zhothers').href.replace('wiki/', 'zh-' + b + '/');

}

convertChinese(a);

}

addLoadEvent(convertZhLinks);

function setLang(a) {

var b = navigator.language || navigator.userLanguage,

c = new Date();

if (b.match(/^\w+/) === a) {

c.setTime(c.getTime() – 1);

} else {

c.setFullYear(c.getFullYear() + 1);

}

document.cookie = 'searchLang=' + a + ';expires=' + c.toUTCString() + ';domain=' + location.host + ';';

}

addLoadEvent(function () {

var b, c, i,

a = $('searchInput');

if (!a) {

return;

}

a.setAttribute('results', '10');

if (a.autofocus === undefined) {

a.focus();

}

b = location.search && location.search.substr(1).split('&');

for (i = 0; i < b.length; i += 1) {

c = b[i].split('=');

if (c[0] === 'search' && c[1]) {

a.value = decodeURIComponent(c[1]);

return;

}

}

});

</script>

</head>

<body id="www-wikipedia-org">

<div id="globalWrapper">

<div id="bodyContent">

<!– image of text at the top –>

<div id="wm-home-header">

<img src="//upload.wikimedia.org/wikipedia/commons/thumb/b/bb/Wikipedia_wordmark.svg/174px-Wikipedia_wordmark.svg.png" width="174" height="30" alt="WikipediA" title="Wikipedia" style="font-variant: small-caps;">

</div>

<!– container div for the central logo and the links to the largest language editions –>

<div id="wm-featured-languages">

<!– the central logo –>

<div id="wm-globe">

<div id="wm-globe-inner">

<img src="//upload.wikimedia.org/wikipedia/commons/6/63/Wikipedia-logo.png" width="200" height="200" alt="Wikipedia" title="Wikipedia">

</div>

</div>

<!– Rankings from http://stats.wikimedia.org/EN/Sitemap.htm (data from 31 January 2012) –>

<!– #1. en.wikipedia.org – 10,606,651 views/hr –>

<div class="divTop10item lang1" lang="en">

<a href="//en.wikipedia.org/" title="English — Wikipedia — The Free Encyclopedia"><strong>English</strong><br>

<em>The&nbsp;Free&nbsp;Encyclopedia</em><br>

<small>3&nbsp;907&nbsp;000+&nbsp;articles</small></a>

</div>

<!– #2. ja.wikipedia.org – 1,696,149 views/hr –>

<div class="divTop10item lang2" lang="ja">

<a href="//ja.wikipedia.org/" title="Nihongo — Wikipedia — フリー百科事典"><strong>日本語</strong><br>

<em class="emNonItalicLang">フリー百科事典</em><br>

<small>799&nbsp;000+&nbsp;記事</small></a>

</div>

<!– #3. es.wikipedia.org – 1,562,844 views/hr –>

<div class="divTop10item lang3" lang="es">

<a href="//es.wikipedia.org/" title="Español — Wikipedia — La enciclopedia libre"><strong>Español</strong><br>

<em>La&nbsp;enciclopedia&nbsp;libre</em><br>

<small>879&nbsp;000+&nbsp;artículos</small></a>

</div>

<!– #4. de.wikipedia.org – 1,463,866 views/hr –>

<div class="divTop10item lang4" lang="de">

<a href="//de.wikipedia.org/" title="Deutsch — Wikipedia — Die freie Enzyklopädie"><strong>Deutsch</strong><br>

<em>Die&nbsp;freie&nbsp;Enzyklopädie</em><br>

<small>1&nbsp;383&nbsp;000+&nbsp;Artikel</small></a>

</div>

<!– #5. ru.wikipedia.org – 1,161,310 views/hr –>

<div class="divTop10item lang5" lang="ru">

<a href="//ru.wikipedia.org/" title="Russkiy — Wikipedia — Свободная энциклопедия"><strong>Русский</strong><br>

<em>Свободная&nbsp;энциклопедия</em><br>

<small>838&nbsp;000+&nbsp;статей</small></a>

</div>

<!– #6. fr.wikipedia.org – 998,178 views/hr –>

<div class="divTop10item lang6" lang="fr">

<a href="//fr.wikipedia.org/" title="Français — Wikipedia — L’encyclopédie libre"><strong>Français</strong><br>

<em>L’encyclopédie&nbsp;libre</em><br>

<small>1&nbsp;230&nbsp;000+&nbsp;articles</small></a>

</div>

<!– #7. it.wikipedia.org – 702,674 views/hr –>

<div class="divTop10item lang7" lang="it">

<a href="//it.wikipedia.org/" title="Italiano — Wikipedia — L’enciclopedia libera"><strong>Italiano</strong><br>

<em>L’enciclopedia&nbsp;libera</em><br>

<small>905&nbsp;000+&nbsp;voci</small></a>

</div>

<!– #8. pl.wikipedia.org – 603,154 views/hr –>

<div class="divTop10item lang8" lang="pl">

<a href="//pl.wikipedia.org/" title="Polski — Wikipedia — Wolna encyklopedia"><strong>Polski</strong><br>

<em>Wolna&nbsp;encyklopedia</em><br>

<small>887&nbsp;000+&nbsp;haseł</small></a>

</div>

<!– #9. pt.wikipedia.org – 451,780 views/hr –>

<div class="divTop10item lang9" lang="pt">

<a href="//pt.wikipedia.org/" title="Português — Wikipedia — A enciclopédia livre"><strong>Português</strong><br>

<em>A&nbsp;enciclopédia&nbsp;livre</em><br>

<small>718&nbsp;000+&nbsp;artigos</small></a>

</div>

<!– #10. zh.wikipedia.org – 310,940 views/hr –>

<div class="divTop10item lang10" lang="zh">

<a id="zh_top10" href="//zh.wikipedia.org/" title="Zhōngwén — Wikipedia — 自由的百科全書"><strong>中文</strong><br>

<em id="zh_tag" class="emNonItalicLang">自由的百科全書</em><br>

<small>429&nbsp;000+&nbsp;<span id="zh_art">條目</span></small></a>

</div>

</div>

<!– Search form –>

<div id="p-search" class="portlet">

<h5>

<!– 100,000+ content pages, sorted by pagecount (data from 31 January 2012) –>

<label for="searchInput">

<span lang="en">Search</span>&nbsp;•

<span lang="de">Suchen</span>&nbsp;•

<span lang="fr">Rechercher</span>&nbsp;•

<span lang="nl">Zoeken</span>&nbsp;•

<span lang="it">Ricerca</span>&nbsp;•

<span lang="pl">Szukaj</span>&nbsp;•

<span lang="es">Buscar</span>&nbsp;•

<span lang="ru" title="Poisk">Поиск</span>&nbsp;•

<span lang="ja" title="Kensaku">検索</span>&nbsp;•

<span lang="pt">Busca</span>&nbsp;•

<span lang="sv">Sök</span>&nbsp;•

<span lang="zh" title="Sōuxún" id="zhsearch">搜尋</span>&nbsp;•

<span lang="vi">Tìm&nbsp;kiếm</span>&nbsp;•

<span lang="uk" title="Pošuk">Пошук</span>&nbsp;•

<span lang="ca">Cerca</span>&nbsp;•

<span lang="nb">Søk</span>&nbsp;•

<span lang="fi">Haku</span>&nbsp;•

<span lang="cs">Hledání</span>&nbsp;•

<span lang="hu">Keresés</span>&nbsp;•

<span lang="ko" title="Chatgi">찾기</span>&nbsp;•

<span lang="id">Cari</span>&nbsp;•

<span lang="tr">Ara</span>&nbsp;•

<bdi lang="fa" dir="rtl" title="Jostoju">جستجو</bdi>&nbsp;•

<span lang="ro">Căutare</span>&nbsp;•

<bdi lang="ar" dir="rtl" title="Baḥth">بحث</bdi>&nbsp;•

<span lang="sk">Hľadať</span>&nbsp;•

<span lang="da">Søg</span>&nbsp;•

<span lang="eo">Serĉu</span>&nbsp;•

<span lang="sr" title="Pretraga">Претрага</span>&nbsp;•

<span lang="lt">Paieška</span>&nbsp;•

<span lang="sl">Poišči</span>&nbsp;•

<span lang="ms">Cari</span>&nbsp;•

<bdi lang="he" dir="rtl" title="Khipús">חיפוש</bdi>&nbsp;•

<span lang="bg" title="Tarsene">Търсене</span>&nbsp;•

<span lang="kk" title="Izdew">Іздеу</span>&nbsp;•

<span lang="eu">Bilatu</span>&nbsp;•

<span lang="vo">Suk</span>&nbsp;•

<span lang="war">Bilnga</span>&nbsp;•

<span lang="hr">Traži</span>&nbsp;•

<span lang="hi" title="Khojẽ">खोजें</span>

</label>

</h5>

<form id="searchform" action="//www.wikipedia.org/search-redirect.php">

<fieldset>

<!– search-redirect.php is project-independent, requires a family –>

<input type="hidden" name="family" value="wikipedia">

<input id="searchInput" name="search" type="search" size="20" autofocus="autofocus" accesskey="F">

<select id="language" name="language" onchange="setLang(this.value);">

<!– 100,000+ content pages, sorted by romanization (data from 31 January 2012) –>

<!– keep in sync with langs in selectLanguage() in /js –>

<option value="ar" lang="ar">العربية</option><!– Al-ʿArabīyah –>

<option value="bg" lang="bg">Български</option><!– Bulgarski –>

<option value="ca" lang="ca">Català</option>

<option value="cs" lang="cs">Česky</option>

<option value="da" lang="da">Dansk</option>

<option value="de" lang="de">Deutsch</option>

<option value="en" lang="en" selected="selected">English</option>

<option value="es" lang="es">Español</option>

<option value="eo" lang="eo">Esperanto</option>

<option value="eu" lang="eu">Euskara</option>

<option value="fa" lang="fa">فارسی</option><!– Fārsi –>

<option value="fr" lang="fr">Français</option>

<option value="ko" lang="ko">한국어</option><!– Hangugeo –>

<option value="hi" lang="hi">हिन्दी</option><!– Hindī –>

<option value="hr" lang="hr">Hrvatski</option>

<option value="id" lang="id">Bahasa Indonesia</option>

<option value="it" lang="it">Italiano</option>

<option value="he" lang="he">עברית</option><!– ‘Ivrit –>

<option value="lt" lang="lt">Lietuvių</option>

<option value="hu" lang="hu">Magyar</option>

<option value="ms" lang="ms">Bahasa Melayu</option>

<option value="nl" lang="nl">Nederlands</option>

<option value="ja" lang="ja">日本語</option><!– Nihongo –>

<option value="no" lang="nb">Norsk (bokmål)</option>

<option value="pl" lang="pl">Polski</option>

<option value="pt" lang="pt">Português</option>

<option value="kk" lang="kk">Қазақша / Qazaqșa / قازاقشا</option>

<option value="ro" lang="ro">Română</option>

<option value="ru" lang="ru">Русский</option><!– Russkiy –>

<option value="sk" lang="sk">Slovenčina</option>

<option value="sl" lang="sl">Slovenščina</option>

<option value="sr" lang="sr">Српски / Srpski</option>

<option value="fi" lang="fi">Suomi</option>

<option value="sv" lang="sv">Svenska</option>

<option value="tr" lang="tr">Türkçe</option>

<option value="uk" lang="uk">Українська</option><!– Ukrayins’ka –>

<option value="vi" lang="vi">Tiếng Việt</option>

<option value="vo" lang="vo">Volapük</option>

<option value="war" lang="war">Winaray</option>

<option value="zh" lang="zh">中文</option><!– Zhōngwén –>

</select>

<input class="searchButton" type="submit" value=" → " name="go">

<input type="hidden" value="Go" name="go">

</fieldset>

</form>

</div>

<div class="divider" style="padding: 0 1%;"><hr></div>

<!– Bookshelves –>

<div class="wm-home-bookshelf-container">

<div class="wm-home-bookshelf">

<img src="//upload.wikimedia.org/wikipedia/commons/b/bd/Bookshelf-40x201_6.png" width="40" height="20" alt="" title=""><img src="//upload.wikimedia.org/wikipedia/commons/b/bd/Bookshelf-40x201_6.png" width="40" height="20" alt="" title=""><img src="//upload.wikimedia.org/wikipedia/commons/b/bd/Bookshelf-40x201_6.png" width="40" height="20" alt="" title=""><img src="//upload.wikimedia.org/wikipedia/commons/b/bd/Bookshelf-40x201_6.png" width="40" height="20" alt="" title=""><img src="//upload.wikimedia.org/wikipedia/commons/b/bd/Bookshelf-40x201_6.png" width="40" height="20" alt="" title=""><img src="//upload.wikimedia.org/wikipedia/commons/b/bd/Bookshelf-40x201_6.png" width="40" height="20" alt="" title=""><img src="//upload.wikimedia.org/wikipedia/commons/b/bd/Bookshelf-40x201_6.png" width="40" height="20" alt="" title=""><img src="//upload.wikimedia.org/wikipedia/commons/b/bd/Bookshelf-40x201_6.png" width="40" height="20" alt="" title=""><img src="//upload.wikimedia.org/wikipedia/commons/b/bd/Bookshelf-40x201_6.png" width="40" height="20" alt="" title="">&nbsp;<b>100&nbsp;000+</b>&nbsp;<img src="//upload.wikimedia.org/wikipedia/commons/b/bd/Bookshelf-40x201_6.png" width="40" height="20" alt="" title=""><img src="//upload.wikimedia.org/wikipedia/commons/b/bd/Bookshelf-40x201_6.png" width="40" height="20" alt="" title=""><img src="//upload.wikimedia.org/wikipedia/commons/b/bd/Bookshelf-40x201_6.png" width="40" height="20" alt="" title=""><img src="//upload.wikimedia.org/wikipedia/commons/b/bd/Bookshelf-40x201_6.png" width="40" height="20" alt="" title=""><img src="//upload.wikimedia.org/wikipedia/commons/b/bd/Bookshelf-40x201_6.png" width="40" height="20" alt="" title=""><img src="//upload.wikimedia.org/wikipedia/commons/b/bd/Bookshelf-40x201_6.png" width="40" height="20" alt="" title=""><img src="//upload.wikimedia.org/wikipedia/commons/b/bd/Bookshelf-40x201_6.png" width="40" height="20" alt="" title=""><img src="//upload.wikimedia.org/wikipedia/commons/b/bd/Bookshelf-40x201_6.png" width="40" height="20" alt="" title=""><img src="//upload.wikimedia.org/wikipedia/commons/b/bd/Bookshelf-40x201_6.png" width="40" height="20" alt="" title="">

</div>

</div>

<!– 100,000+ content pages (data from 31 January 2012) –>

<div class="wm-project-list wm-project-list-large"><div>

<a href="//ar.wikipedia.org/" lang="ar" title="Al-ʿArabīyah"><bdi dir="rtl">العربية</bdi></a>&nbsp;•

<a href="//bg.wikipedia.org/" lang="bg" title="Bulgarski">Български</a>&nbsp;•

<a href="//ca.wikipedia.org/" lang="ca">Català</a>&nbsp;•

<a href="//cs.wikipedia.org/" lang="cs">Česky</a>&nbsp;•

<a href="//da.wikipedia.org/" lang="da">Dansk</a>&nbsp;•

<a href="//de.wikipedia.org/" lang="de">Deutsch</a>&nbsp;•

<a href="//en.wikipedia.org/" lang="en">English</a>&nbsp;•

<a href="//es.wikipedia.org/" lang="es">Español</a>&nbsp;•

<a href="//eo.wikipedia.org/" lang="eo">Esperanto</a>&nbsp;•

<a href="//eu.wikipedia.org/" lang="eu">Euskara</a>&nbsp;•

<a href="//fa.wikipedia.org/" lang="fa" title="Fārsi"><bdi dir="rtl">فارسی</bdi></a>&nbsp;•

<a href="//fr.wikipedia.org/" lang="fr">Français</a>&nbsp;•

<a href="//ko.wikipedia.org/" lang="ko" title="Hangugeo">한국어</a>&nbsp;•

<a href="//hi.wikipedia.org/" lang="hi" title="Hindī">हिन्दी</a>&nbsp;•

<a href="//hr.wikipedia.org/" lang="hr">Hrvatski</a>&nbsp;•

<a href="//id.wikipedia.org/" lang="id">Bahasa Indonesia</a>&nbsp;•

<a href="//it.wikipedia.org/" lang="it">Italiano</a>&nbsp;•

<a href="//he.wikipedia.org/" lang="he" title="‘Ivrit"><bdi dir="rtl">עברית</bdi></a>&nbsp;•

<a href="//lt.wikipedia.org/" lang="lt">Lietuvių</a>&nbsp;•

<a href="//hu.wikipedia.org/" lang="hu">Magyar</a>&nbsp;•

<a href="//ms.wikipedia.org/" lang="ms">Bahasa Melayu</a>&nbsp;•

<a href="//nl.wikipedia.org/" lang="nl">Nederlands</a>&nbsp;•

<a href="//ja.wikipedia.org/" lang="ja" title="Nihongo">日本語</a>&nbsp;•

<a href="//no.wikipedia.org/" lang="nb">Norsk (bokmål)</a>&nbsp;•

<a href="//pl.wikipedia.org/" lang="pl">Polski</a>&nbsp;•

<a href="//pt.wikipedia.org/" lang="pt">Português</a>&nbsp;•

<a href="//kk.wikipedia.org/" lang="kk"><span lang="kk-Cyrl">Қазақша</span> / <span lang="kk-Latn">Qazaqșa</span> / <bdi lang="kk-Arab" dir="rtl">قازاقشا</bdi></a>&nbsp;•

<a href="//ro.wikipedia.org/" lang="ro">Română</a>&nbsp;•

<a href="//ru.wikipedia.org/" lang="ru" title="Russkiy">Русский</a>&nbsp;•

<a href="//sk.wikipedia.org/" lang="sk">Slovenčina</a>&nbsp;•

<a href="//sl.wikipedia.org/" lang="sl">Slovenščina</a>&nbsp;•

<a href="//sr.wikipedia.org/" lang="sr"><span lang="sr-Cyrl">Српски</span> / <span lang="sr-Latn">Srpski</span></a>&nbsp;•

<a href="//fi.wikipedia.org/" lang="fi">Suomi</a>&nbsp;•

<a href="//sv.wikipedia.org/" lang="sv">Svenska</a>&nbsp;•

<a href="//tr.wikipedia.org/" lang="tr">Türkçe</a>&nbsp;•

<a href="//uk.wikipedia.org/" lang="uk" title="Ukrayins’ka">Українська</a>&nbsp;•

<a href="//vi.wikipedia.org/" lang="vi">Tiếng Việt</a>&nbsp;•

<a href="//vo.wikipedia.org/" lang="vo">Volapük</a>&nbsp;•

<a href="//war.wikipedia.org/" lang="war">Winaray</a>&nbsp;•

<a id="zhwiki" href="//zh.wikipedia.org/" lang="zh" title="Zhōngwén">中文</a>

</div></div>

<!– Bookshelves –>

<div class="wm-home-bookshelf-container">

<div class="wm-home-bookshelf">

<img src="//upload.wikimedia.org/wikipedia/commons/b/bd/Bookshelf-40x201_6.png" width="40" height="20" alt="" title=""><img src="//upload.wikimedia.org/wikipedia/commons/b/bd/Bookshelf-40x201_6.png" width="40" height="20" alt="" title=""><img src="//upload.wikimedia.org/wikipedia/commons/b/bd/Bookshelf-40x201_6.png" width="40" height="20" alt="" title=""><img src="//upload.wikimedia.org/wikipedia/commons/b/bd/Bookshelf-40x201_6.png" width="40" height="20" alt="" title=""><img src="//upload.wikimedia.org/wikipedia/commons/b/bd/Bookshelf-40x201_6.png" width="40" height="20" alt="" title=""><img src="//upload.wikimedia.org/wikipedia/commons/b/bd/Bookshelf-40x201_6.png" width="40" height="20" alt="" title="">&nbsp;<b>10&nbsp;000+</b>&nbsp;<img src="//upload.wikimedia.org/wikipedia/commons/b/bd/Bookshelf-40x201_6.png" width="40" height="20" alt="" title=""><img src="//upload.wikimedia.org/wikipedia/commons/b/bd/Bookshelf-40x201_6.png" width="40" height="20" alt="" title=""><img src="//upload.wikimedia.org/wikipedia/commons/b/bd/Bookshelf-40x201_6.png" width="40" height="20" alt="" title=""><img src="//upload.wikimedia.org/wikipedia/commons/b/bd/Bookshelf-40x201_6.png" width="40" height="20" alt="" title=""><img src="//upload.wikimedia.org/wikipedia/commons/b/bd/Bookshelf-40x201_6.png" width="40" height="20" alt="" title=""><img src="//upload.wikimedia.org/wikipedia/commons/b/bd/Bookshelf-40x201_6.png" width="40" height="20" alt="" title="">

</div>

</div>

<!– 10,000+ content pages (data from 31 January 2012) –>

<div class="wm-project-list wm-project-list-large"><div>

<a href="//af.wikipedia.org/" lang="af">Afrikaans</a>&nbsp;•

<a href="//als.wikipedia.org/" lang="gsw">Alemannisch</a>&nbsp;•

<a href="//am.wikipedia.org/" lang="am" title="Āmariññā">አማርኛ</a>&nbsp;•

<a href="//an.wikipedia.org/" lang="an">Aragonés</a>&nbsp;•

<a href="//roa-rup.wikipedia.org/" lang="rup">Armãneashce</a>&nbsp;•

<a href="//ast.wikipedia.org/" lang="ast">Asturianu</a>&nbsp;•

<a href="//ht.wikipedia.org/" lang="ht">Kreyòl Ayisyen</a>&nbsp;•

<a href="//az.wikipedia.org/" lang="az"><span lang="az-Latn">Azərbaycan</span> / <bdi lang="az-Arab" dir="rtl">آذربايجان ديلی</bdi></a>&nbsp;•

<a href="//bn.wikipedia.org/" lang="bn" title="Bangla">বাংলা</a>&nbsp;•

<a href="//map-bms.wikipedia.org/" lang="map-x-bms">Basa Banyumasan</a>&nbsp;•

<a href="//ba.wikipedia.org/" lang="ba" title="Bașqortsa">Башҡортса</a>&nbsp;•

<span lang="be" title="Belaruskaya">Беларуская (<a href="//be.wikipedia.org/" title="Akademichnaya">Акадэмічная</a>&nbsp;•&nbsp;<a href="//be-x-old.wikipedia.org/" title="Taraškievica">Тарашкевiца</a>)</span>&nbsp;•

<a href="//bpy.wikipedia.org/" lang="bpy" title="Bishnupriya Manipuri">বিষ্ণুপ্রিযা় মণিপুরী</a>&nbsp;•

<a href="//bs.wikipedia.org/" lang="bs">Bosanski</a>&nbsp;•

<a href="//br.wikipedia.org/" lang="br">Brezhoneg</a>&nbsp;•

<a href="//cv.wikipedia.org/" lang="cv" title="Čăvašla">Чӑвашла</a>&nbsp;•

<a href="//cy.wikipedia.org/" lang="cy">Cymraeg</a>&nbsp;•

<a href="//et.wikipedia.org/" lang="et">Eesti</a>&nbsp;•

<a href="//el.wikipedia.org/" lang="el" title="Ellīniká">Ελληνικά</a>&nbsp;•

<a href="//fy.wikipedia.org/" lang="fy">Frysk</a>&nbsp;•

<a href="//ga.wikipedia.org/" lang="ga">Gaeilge</a>&nbsp;•

<a href="//gl.wikipedia.org/" lang="gl">Galego</a>&nbsp;•

<a href="//gu.wikipedia.org/" lang="gu" title="Gujarati">ગુજરાતી</a>&nbsp;•

<a href="//hy.wikipedia.org/" lang="hy" title="Hayeren">Հայերեն</a>&nbsp;•

<a href="//io.wikipedia.org/" lang="io">Ido</a>&nbsp;•

<a href="//ia.wikipedia.org/" lang="ia">Interlingua</a>&nbsp;•

<a href="//is.wikipedia.org/" lang="is">Íslenska</a>&nbsp;•

<a href="//jv.wikipedia.org/" lang="jv">Basa Jawa</a>&nbsp;•

<a href="//kn.wikipedia.org/" lang="kn" title="Kannada">ಕನ್ನಡ</a>&nbsp;•

<a href="//ka.wikipedia.org/" lang="ka" title="Kartuli">ქართული</a>&nbsp;•

<a href="//ku.wikipedia.org/" lang="ku"><span lang="ku-Latn">Kurdî</span> / <bdi lang="ku-Arab" dir="rtl">كوردی</bdi></a>&nbsp;•

<a href="//la.wikipedia.org/" lang="la">Latina</a>&nbsp;•

<a href="//lv.wikipedia.org/" lang="lv">Latviešu</a>&nbsp;•

<a href="//lb.wikipedia.org/" lang="lb">Lëtzebuergesch</a>&nbsp;•

<a href="//lmo.wikipedia.org/" lang="lmo">Lumbaart</a>&nbsp;•

<a href="//mk.wikipedia.org/" lang="mk" title="Makedonski">Македонски</a>&nbsp;•

<a href="//mg.wikipedia.org/" lang="mg">Malagasy</a>&nbsp;•

<a href="//ml.wikipedia.org/" lang="ml" title="Malayalam">മലയാളം</a>&nbsp;•

<a href="//mr.wikipedia.org/" lang="mr" title="Marathi">मराठी</a>&nbsp;•

<a href="//my.wikipedia.org/" lang="my" title="Myanmarsar">မြန်မာဘာသာ</a>&nbsp;•

<a href="//new.wikipedia.org/" lang="new" title="Nepal Bhasa">नेपाल भाषा</a>&nbsp;•

<a href="//ne.wikipedia.org/" lang="ne" title="Nepālī">नेपाली</a>&nbsp;•

<a href="//nn.wikipedia.org/" lang="nn">Norsk (nynorsk)</a>&nbsp;•

<a href="//nap.wikipedia.org/" lang="nap">Nnapulitano</a>&nbsp;•

<a href="//oc.wikipedia.org/" lang="oc">Occitan</a>&nbsp;•

<a href="//pms.wikipedia.org/" lang="pms">Piemontèis</a>&nbsp;•

<a href="//nds.wikipedia.org/" lang="nds">Plattdüütsch</a>&nbsp;•

<a href="//qu.wikipedia.org/" lang="qu">Runa Simi</a>&nbsp;•

<a href="//pnb.wikipedia.org/" lang="pnb" title="Shāhmukhī Pañjābī"><bdi dir="rtl">شاہ مکھی پنجابی</bdi></a>&nbsp;•

<a href="//sq.wikipedia.org/" lang="sq">Shqip</a>&nbsp;•

<a href="//scn.wikipedia.org/" lang="scn">Sicilianu</a>&nbsp;•

<a href="//simple.wikipedia.org/" lang="en">Simple English</a>&nbsp;•

<a href="//ceb.wikipedia.org/" lang="ceb">Sinugboanon</a>&nbsp;•

<a href="//sh.wikipedia.org/" lang="sh"><span lang="sh-Latn">Srpskohrvatski</span> / <span lang="sh-Cyrl">Српскохрватски</span></a>&nbsp;•

<a href="//su.wikipedia.org/" lang="su">Basa Sunda</a>&nbsp;•

<a href="//sw.wikipedia.org/" lang="sw">Kiswahili</a>&nbsp;•

<a href="//tl.wikipedia.org/" lang="tl">Tagalog</a>&nbsp;•

<a href="//ta.wikipedia.org/" lang="ta" title="Tamiḻ">தமிழ்</a>&nbsp;•

<a href="//tt.wikipedia.org/" lang="tt"><span lang="tt-Cyrl">Татарча</span> / <span lang="tt-Latn">Tatarça</span></a>&nbsp;•

<a href="//te.wikipedia.org/" lang="te" title="Telugu">తెలుగు</a>&nbsp;•

<a href="//th.wikipedia.org/" lang="th" title="Thai">ไทย</a>&nbsp;•

<a href="//bug.wikipedia.org/" lang="bug"><span lang="bug-Bugi">ᨅᨔ ᨕᨙᨁᨗ</span> / <span lang="bug-Latn">Basa Ugi</span></a>&nbsp;•

<a href="//ur.wikipedia.org/" lang="ur" title="Urdu"><bdi dir="rtl">اردو</bdi></a>&nbsp;•

<a href="//wa.wikipedia.org/" lang="wa">Walon</a>&nbsp;•

<a href="//yo.wikipedia.org/" lang="yo">Yorùbá</a>&nbsp;•

<a href="//zh-yue.wikipedia.org/" lang="yue" title="Yuet6yue5">粵語</a>&nbsp;•

<a href="//diq.wikipedia.org/" lang="diq">Zazaki</a>&nbsp;•

<a href="//bat-smg.wikipedia.org/" lang="sgs">Žemaitėška</a>

</div></div>

<!– Bookshelves –>

<div class="wm-home-bookshelf-container-small">

<div class="wm-home-bookshelf">

<img src="//upload.wikimedia.org/wikipedia/commons/b/bd/Bookshelf-40x201_6.png" width="40" height="20" alt="" title=""><img src="//upload.wikimedia.org/wikipedia/commons/b/bd/Bookshelf-40x201_6.png" width="40" height="20" alt="" title=""><img src="//upload.wikimedia.org/wikipedia/commons/b/bd/Bookshelf-40x201_6.png" width="40" height="20" alt="" title="">&nbsp;<b>1&nbsp;000+</b>&nbsp;<img src="//upload.wikimedia.org/wikipedia/commons/b/bd/Bookshelf-40x201_6.png" width="40" height="20" alt="" title=""><img src="//upload.wikimedia.org/wikipedia/commons/b/bd/Bookshelf-40x201_6.png" width="40" height="20" alt="" title=""><img src="//upload.wikimedia.org/wikipedia/commons/b/bd/Bookshelf-40x201_6.png" width="40" height="20" alt="" title="">

</div>

</div>

<!– 1,000+ content pages (data from 31 January 2012) –>

<div class="wm-project-list">

<a href="//ace.wikipedia.org/" lang="ace">Bahsa Acèh</a>&nbsp;•

<a href="//frp.wikipedia.org/" lang="frp">Arpitan</a>&nbsp;•

<a href="//arc.wikipedia.org/" lang="arc" title="Ātûrāyâ">ܐܬܘܪܝܐ</a>&nbsp;•

<a href="//gn.wikipedia.org/" lang="gn">Avañe’ẽ</a>&nbsp;•

<a href="//av.wikipedia.org/" lang="av" title="Avar">Авар</a>&nbsp;•

<a href="//ay.wikipedia.org/" lang="ay">Aymar Aru</a>&nbsp;•

<a href="//zh-min-nan.wikipedia.org/" lang="nan">Bân-lâm-gú</a>&nbsp;•

<a href="//bjn.wikipedia.org/" lang="bjn">Bahasa Banjar</a>&nbsp;•

<a href="//bh.wikipedia.org/" lang="bh" title="Bhōjapurī">भोजपुरी</a>&nbsp;•

<a href="//bcl.wikipedia.org/" lang="bcl">Bikol Central</a>&nbsp;•

<a href="//bar.wikipedia.org/" lang="bar">Boarisch</a>&nbsp;•

<a href="//bo.wikipedia.org/" lang="bo" title="Bod Skad">བོད་ཡིག</a>&nbsp;•

<a href="//cbk-zam.wikipedia.org/" lang="cbk-x-zam">Chavacano de Zamboanga</a>&nbsp;•

<a href="//co.wikipedia.org/" lang="co">Corsu</a>&nbsp;•

<a href="//pdc.wikipedia.org/" lang="pdc">Deitsch</a>&nbsp;•

<a href="//dv.wikipedia.org/" lang="dv" title="Dhivehi"><bdi dir="rtl">ދިވެހި</bdi></a>&nbsp;•

<a href="//nv.wikipedia.org/" lang="nv">Diné Bizaad</a>&nbsp;•

<a href="//ang.wikipedia.org/" lang="ang">Eald Englisc</a>&nbsp;•

<a href="//eml.wikipedia.org/" lang="roa-x-eml">Emigliàn–Rumagnòl</a>&nbsp;•

<a href="//myv.wikipedia.org/" lang="myv" title="Erzjanj">Эрзянь</a>&nbsp;•

<a href="//ext.wikipedia.org/" lang="ext">Estremeñu</a>&nbsp;•

<a href="//hif.wikipedia.org/" lang="hif">Fiji Hindi</a>&nbsp;•

<a href="//fo.wikipedia.org/" lang="fo">Føroyskt</a>&nbsp;•

<a href="//frr.wikipedia.org/" lang="frr">Frasch</a>&nbsp;•

<a href="//fur.wikipedia.org/" lang="fur">Furlan</a>&nbsp;•

<a href="//gv.wikipedia.org/" lang="gv">Gaelg</a>&nbsp;•

<a href="//gag.wikipedia.org/" lang="gag">Gagauz</a>&nbsp;•

<a href="//gd.wikipedia.org/" lang="gd">Gàidhlig</a>&nbsp;•

<a href="//gan.wikipedia.org/" lang="gan" title="Gànyŭ">贛語</a>&nbsp;•

<a href="//glk.wikipedia.org/" lang="glk" title="Giləki"><bdi dir="rtl">گیلکی</bdi></a>&nbsp;•

<a href="//hak.wikipedia.org/" lang="hak"><span lang="hak-Latn">Hak-kâ-fa</span> / <span lang="hak-Hani">客家話</span></a>&nbsp;•

<a href="//xal.wikipedia.org/" lang="xal" title="Halʹmg">Хальмг</a>&nbsp;•

<a href="//haw.wikipedia.org/" lang="haw">ʻŌlelo Hawaiʻi</a>&nbsp;•

<a href="//hsb.wikipedia.org/" lang="hsb">Hornjoserbsce</a>&nbsp;•

<a href="//ilo.wikipedia.org/" lang="ilo">Ilokano</a>&nbsp;•

<a href="//ie.wikipedia.org/" lang="ie">Interlingue</a>&nbsp;•

<a href="//os.wikipedia.org/" lang="os" title="Iron Ævzag">Ирон Æвзаг</a>&nbsp;•

<a href="//kl.wikipedia.org/" lang="kl">Kalaallisut</a>&nbsp;•

<a href="//pam.wikipedia.org/" lang="pam">Kapampangan</a>&nbsp;•

<a href="//csb.wikipedia.org/" lang="csb">Kaszëbsczi</a>&nbsp;•

<a href="//kw.wikipedia.org/" lang="kw">Kernewek</a>&nbsp;•

<a href="//km.wikipedia.org/" lang="km" title="Phéasa Khmér">ភាសាខ្មែរ</a>&nbsp;•

<a href="//rw.wikipedia.org/" lang="rw">Kinyarwanda</a>&nbsp;•

<a href="//kv.wikipedia.org/" lang="kv" title="Komi">Коми</a>&nbsp;•

<a href="//ky.wikipedia.org/" lang="ky" title="Kyrgyzča">Кыргызча</a>&nbsp;•

<a href="//mrj.wikipedia.org/" lang="mjr" title="Kyryk Mary">Кырык Мары</a>&nbsp;•

<a href="//lad.wikipedia.org/" lang="lad"><span lang="lad-Latn">Ladino</span> / <bdi lang="lad-Hebr" dir="rtl">לאדינו</bdi></a>&nbsp;•

<a href="//lbe.wikipedia.org/" lang="lbe" title="Lakːu">Лакку</a>&nbsp;•

<a href="//lij.wikipedia.org/" lang="lij">Ligure</a>&nbsp;•

<a href="//li.wikipedia.org/" lang="li">Limburgs</a>&nbsp;•

<a href="//ln.wikipedia.org/" lang="ln">Lingála</a>&nbsp;•

<a href="//jbo.wikipedia.org/" lang="jbo">lojban</a>&nbsp;•<!– Don't capitalize this: this language has no title case. –>

<a href="//mt.wikipedia.org/" lang="mt">Malti</a>&nbsp;•

<a href="//zh-classical.wikipedia.org/" lang="lzh" title="Man4jin4 / Wényán">文言</a>&nbsp;•

<a href="//mi.wikipedia.org/" lang="mi">Māori</a>&nbsp;•

<a href="//xmf.wikipedia.org/" lang="xmf" title="Margaluri">მარგალური</a>&nbsp;•

<a href="//arz.wikipedia.org/" lang="arz" title="Maṣrī"><bdi dir="rtl">مصرى</bdi></a>&nbsp;•<!– (teh other one 😉 –>

<a href="//mzn.wikipedia.org/" lang="mzn"><bdi lang="mzn-Arab" dir="rtl">مازِرونی</bdi> / <span lang="mzn-Latn">Mäzeruni</span></a>&nbsp;•<!– watch the behaviour of this pair re rtl vs ltr –>

<a href="//mdf.wikipedia.org/" lang="mdf" title="Mokšenj">Мокшень</a>&nbsp;•

<a href="//mn.wikipedia.org/" lang="mn" title="Mongol">Монгол</a>&nbsp;•

<a href="//nah.wikipedia.org/" lang="nah">Nāhuatlahtōlli</a>&nbsp;•

<a href="//nds-nl.wikipedia.org/" lang="nds-nl">Nedersaksisch</a>&nbsp;•

<a href="//nrm.wikipedia.org/" lang="roa-x-nrm">Nouormand</a>&nbsp;•

<a href="//nov.wikipedia.org/" lang="nov">Novial</a>&nbsp;•

<a href="//ce.wikipedia.org/" lang="ce" title="Noxçiyn">Нохчийн</a>&nbsp;•

<a href="//mhr.wikipedia.org/" lang="mhr" title="Olyk Marij">Олык Марий</a>&nbsp;•

<a href="//or.wikipedia.org/" lang="or" title="Oṛiā">ଓଡି଼ଆ</a>&nbsp;•

<a href="//as.wikipedia.org/" lang="as" title="Ôxômiya">অসমীযা়</a>&nbsp;•

<a href="//uz.wikipedia.org/" lang="uz">O’zbek</a>&nbsp;•

<a href="//pi.wikipedia.org/" lang="pi" title="Pāḷi">पाऴि</a>&nbsp;•

<a href="//pag.wikipedia.org/" lang="pag">Pangasinán</a>&nbsp;•

<a href="//pa.wikipedia.org/" lang="pa" title="Pañjābī"><span lang="pa">ਪੰਜਾਬੀ</span> / <bdi lang="pa-Arab" dir="rtl">پنجابی</bdi></a>&nbsp;•

<a href="//pap.wikipedia.org/" lang="pap">Papiamentu</a>&nbsp;•

<a href="//ps.wikipedia.org/" lang="ps" title="Paʂto"><bdi dir="rtl">پښتو</bdi></a>&nbsp;•

<a href="//koi.wikipedia.org/" lang="koi" title="Perem Komi">Перем Коми</a>&nbsp;•

<a href="//pfl.wikipedia.org/" lang="pfl">Pfälzisch</a>&nbsp;•

<a href="//pcd.wikipedia.org/" lang="pcd">Picard</a>&nbsp;•

<a href="//krc.wikipedia.org/" lang="krc" title="Qaraçay–Malqar">Къарачай–Малкъар</a>&nbsp;•

<a href="//crh.wikipedia.org/" lang="crh">Qırımtatarca</a>&nbsp;•

<a href="//ksh.wikipedia.org/" lang="ksh">Ripoarisch</a>&nbsp;•

<a href="//rm.wikipedia.org/" lang="rm">Rumantsch</a>&nbsp;•

<a href="//rue.wikipedia.org/" lang="rue" title="Rusin’skyj Yazyk">Русиньскый Язык</a>&nbsp;•

<a href="//sa.wikipedia.org/" lang="sa" title="Saṃskṛtam">संस्कृतम्</a>&nbsp;•

<a href="//se.wikipedia.org/" lang="se">Sámegiella</a>&nbsp;•

<a href="//sc.wikipedia.org/" lang="sc">Sardu</a>&nbsp;•

<a href="//sah.wikipedia.org/" lang="sah" title="Saxa Tyla">Саха Тыла</a>&nbsp;•

<a href="//sco.wikipedia.org/" lang="sco">Scots</a>&nbsp;•

<a href="//stq.wikipedia.org/" lang="stq">Seeltersk</a>&nbsp;•

<a href="//si.wikipedia.org/" lang="si" title="Siṃhala">සිංහල</a>&nbsp;•

<a href="//szl.wikipedia.org/" lang="szl">Ślůnski</a>&nbsp;•

<a href="//so.wikipedia.org/" lang="so">Af Soomaali</a>&nbsp;•

<a href="//ckb.wikipedia.org/" lang="ckb" title="Soranî"><bdi dir="rtl">کوردی</bdi></a>&nbsp;•

<a href="//kab.wikipedia.org/" lang="kab">Taqbaylit</a>&nbsp;•

<a href="//roa-tara.wikipedia.org/" lang="roa">Tarandíne</a>&nbsp;•

<a href="//tg.wikipedia.org/" lang="tg" title="Tojikī">Тоҷикӣ</a>&nbsp;•

<a href="//tpi.wikipedia.org/" lang="tpi">Tok Pisin</a>&nbsp;•

<a href="//to.wikipedia.org/" lang="to">Lea faka-Tonga</a>&nbsp;•

<a href="//tk.wikipedia.org/" lang="tk">Türkmen</a>&nbsp;•

<a href="//udm.wikipedia.org/" lang="udm" title="Udmurt">Удмурт</a>&nbsp;•

<a href="//ug.wikipedia.org/" lang="ug"><span lang="ug-Latn">Uyghur</span> / <bdi lang="ug-Arab" dir="rtl">ئۇيغۇرچه</bdi></a>&nbsp;•

<a href="//vec.wikipedia.org/" lang="vec">Vèneto</a>&nbsp;•

<a href="//fiu-vro.wikipedia.org/" lang="vro">Võro</a>&nbsp;•

<a href="//vls.wikipedia.org/" lang="vls">West-Vlams</a>&nbsp;•

<a href="//wo.wikipedia.org/" lang="wo">Wolof</a>&nbsp;•

<a href="//wuu.wikipedia.org/" lang="wuu" title="Wú Yǔ">吴语</a>&nbsp;•

<a href="//yi.wikipedia.org/" lang="yi" title="Yidiš"><bdi dir="rtl">ייִדיש</bdi></a>&nbsp;•

<a href="//zea.wikipedia.org/" lang="zea">Zeêuws</a>

</div>

<!– Bookshelves –>

<div class="wm-home-bookshelf-container-small">

<div class="wm-home-bookshelf">

<img src="//upload.wikimedia.org/wikipedia/commons/b/bd/Bookshelf-40x201_6.png" width="40" height="20" alt="" title="">&nbsp;<b>100+</b>&nbsp;<img src="//upload.wikimedia.org/wikipedia/commons/b/bd/Bookshelf-40x201_6.png" width="40" height="20" alt="" title="">

</div>

</div>

<!– 100+ content pages (data from 31 January 2012) –>

<div class="wm-project-list wm-project-list-tiny">

<a href="//kbd.wikipedia.org/" lang="kbd" title="Adighabze">Адыгэбзэ</a>&nbsp;•

<a href="//ak.wikipedia.org/" lang="ak">Akan</a>&nbsp;•

<a href="//ab.wikipedia.org/" lang="ab" title="Aṗsua">Аҧсуа</a>&nbsp;•

<a href="//bm.wikipedia.org/" lang="bm">Bamanankan</a>&nbsp;•

<a href="//bi.wikipedia.org/" lang="bi">Bislama</a>&nbsp;•

<a href="//bxr.wikipedia.org/" lang="bxr" title="Buryad">Буряад</a>&nbsp;•

<a href="//ch.wikipedia.org/" lang="ch">Chamoru</a>&nbsp;•

<a href="//ny.wikipedia.org/" lang="ny">Chichewa</a>&nbsp;•

<a href="//za.wikipedia.org/" lang="za">Cuengh</a>&nbsp;•

<a href="//dsb.wikipedia.org/" lang="dsb">Dolnoserbski</a>&nbsp;•

<a href="//ee.wikipedia.org/" lang="ee">Eʋegbe</a>&nbsp;•

<a href="//ff.wikipedia.org/" lang="ff">Fulfulde</a>&nbsp;•

<a href="//ki.wikipedia.org/" lang="ki">Gĩkũyũ</a>&nbsp;•

<a href="//got.wikipedia.org/" lang="got" title="Gutisk">𐌲𐌿𐍄𐌹𐍃𐌺</a>&nbsp;•

<a href="//ha.wikipedia.org/" lang="ha"><span lang="ha-Latn">Hausa</span> / <bdi lang="ha-Arab" dir="rtl">هَوُسَا</bdi></a>&nbsp;•

<a href="//ig.wikipedia.org/" lang="ig">Igbo</a>&nbsp;•

<a href="//iu.wikipedia.org/" lang="iu" title="Inuktitut"><span lang="iu-Cans">ᐃᓄᒃᑎᑐᑦ</span> / <span lang="iu-Latn">Inuktitut</span></a>&nbsp;•

<a href="//ik.wikipedia.org/" lang="ik">Iñupiak</a>&nbsp;•

<a href="//ks.wikipedia.org/" lang="ks" title="Kashmiri"><span lang="ks-Deva">कश्मीरी</span> / <bdi lang="ks-Arab" dir="rtl">كشميري</bdi></a>&nbsp;•

<a href="//kg.wikipedia.org/" lang="kg">Kongo</a>&nbsp;•

<a href="//lo.wikipedia.org/" lang="lo" title="Phaasaa Laao">ພາສາລາວ</a>&nbsp;•

<a href="//ltg.wikipedia.org/" lang="ltg">Latgaļu</a>&nbsp;•

<a href="//lez.wikipedia.org/" lang="lez" title="Lezgi">Лезги</a>&nbsp;•

<a href="//lg.wikipedia.org/" lang="lg">Luganda</a>&nbsp;•

<a href="//cdo.wikipedia.org/" lang="cdo">Mìng-dĕ̤ng-ngṳ̄</a>&nbsp;•

<a href="//mwl.wikipedia.org/" lang="mwl">Mirandés</a>&nbsp;•

<a href="//mo.wikipedia.org/" lang="ro-Cyrl" title="Moldovenească">Молдовеняскэ</a>&nbsp;•

<a href="//fj.wikipedia.org/" lang="fj">Na Vosa Vaka-Viti</a>&nbsp;•

<a href="//na.wikipedia.org/" lang="na">Dorerin&nbsp;Naoero</a>&nbsp;•

<a href="//cr.wikipedia.org/" lang="cr"><span lang="cr-Latn">Nēhiyawēwin</span> / <span lang="cr-Cans">ᓀᐦᐃᔭᐍᐏᐣ</span></a>&nbsp;•

<a href="//pih.wikipedia.org/" lang="pih">Norfuk / Pitkern</a>&nbsp;•

<a href="//om.wikipedia.org/" lang="om">Afaan Oromoo</a>&nbsp;•

<a href="//pnt.wikipedia.org/" lang="pnt" title="Pontiaká">Ποντιακά</a>&nbsp;•

<a href="//kaa.wikipedia.org/" lang="kaa">Qaraqalpaqsha</a>&nbsp;•

<a href="//dz.wikipedia.org/" lang="dz" title="Rdzong-Kha">རྫོང་ཁ</a>&nbsp;•

<a href="//rmy.wikipedia.org/" lang="rmy"><span lang="rmy-Latn">Romani</span> / <span lang="rmy-Deva">रोमानी</span></a>&nbsp;•

<a href="//rn.wikipedia.org/" lang="rn">Kirundi</a>&nbsp;•

<a href="//sm.wikipedia.org/" lang="sm">Gagana Sāmoa</a>&nbsp;•

<a href="//sg.wikipedia.org/" lang="sg">Sängö</a>&nbsp;•

<a href="//st.wikipedia.org/" lang="st">Sesotho</a>&nbsp;•

<a href="//nso.wikipedia.org/" lang="nso">Sesotho sa Leboa</a>&nbsp;•

<a href="//tn.wikipedia.org/" lang="tn">Setswana</a>&nbsp;•

<a href="//sn.wikipedia.org/" lang="sn">ChiShona</a>&nbsp;•

<a href="//sd.wikipedia.org/" lang="sd" title="Sindhī"><bdi dir="rtl">سنڌي</bdi></a>&nbsp;•

<a href="//cu.wikipedia.org/" lang="cu" title="Slověnĭskŭ"><span lang="cu-Cyrl">Словѣ́ньскъ</span> / <span lang="cu-Glag">ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ</span></a>&nbsp;•

<a href="//ss.wikipedia.org/" lang="ss">SiSwati</a>&nbsp;•

<a href="//srn.wikipedia.org/" lang="srn">Sranantongo</a>&nbsp;•

<a href="//ty.wikipedia.org/" lang="ty">Reo Tahiti</a>&nbsp;•

<a href="//tet.wikipedia.org/" lang="tet">Tetun</a>&nbsp;•

<a href="//ti.wikipedia.org/" lang="ti" title="Tigriññā">ትግርኛ</a>&nbsp;•

<a href="//chr.wikipedia.org/" lang="chr" title="Tsalagi">ᏣᎳᎩ</a>&nbsp;•

<a href="//tum.wikipedia.org/" lang="tum">chiTumbuka</a>&nbsp;•

<a href="//ts.wikipedia.org/" lang="ts">Xitsonga</a>&nbsp;•

<a href="//chy.wikipedia.org/" lang="chy">Tsėhesenėstsestotse</a>&nbsp;•

<a href="//ve.wikipedia.org/" lang="ve">Tshivenḓa</a>&nbsp;•

<a href="//tw.wikipedia.org/" lang="tw">Twi</a>&nbsp;•

<a href="//vep.wikipedia.org/" lang="vep">Vepsän kel’</a>&nbsp;•

<a href="//xh.wikipedia.org/" lang="xh">isiXhosa</a>&nbsp;•

<a href="//zu.wikipedia.org/" lang="zu">isiZulu</a>

</div>

<!– Other languages –>

<div class="wm-project-list wm-project-list-other">

<!– (keeping strong-element for non-css agents) –>

<strong>

<a href="//meta.wikimedia.org/wiki/List_of_Wikipedias" lang="en">Other languages</a>&nbsp;•

<a href="//de.wikipedia.org/wiki/Wikipedia:Sprachen" lang="de">Weitere Sprachen</a>&nbsp;•

<a href="//meta.wikimedia.org/wiki/Liste_des_Wikip%C3%A9dias" lang="fr">Autres langues</a>&nbsp;•

<a href="//pl.wikipedia.org/wiki/Wikipedia:Lista_wersji_j%C4%99zykowych" lang="pl">Kompletna lista języków</a>&nbsp;•

<a href="//ja.wikipedia.org/wiki/Wikipedia:%E5%A4%9A%E8%A8%80%E8%AA%9E%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%A8%E3%81%97%E3%81%A6%E3%81%AE%E3%82%A6%E3%82%A3%E3%82%AD%E3%83%9A%E3%83%87%E3%82%A3%E3%82%A2" lang="ja">他の言語</a>&nbsp;•

<a href="//meta.wikimedia.org/wiki/Lista_de_Wikipedias" lang="es">Otros idiomas</a>&nbsp;•

<a href="//zh.wikipedia.org/wiki/Wikipedia:%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91%E8%AF%AD%E8%A8%80%E5%88%97%E8%A1%A8" lang="zh" id="zhothers">其他語言</a>&nbsp;•

<a href="//ru.wikipedia.org/wiki/%D0%92%D0%B8%D0%BA%D0%B8%D0%BF%D0%B5%D0%B4%D0%B8%D1%8F:%D0%A1%D0%92" lang="ru">Другие языки</a>&nbsp;•

<a href="//eo.wikipedia.org/wiki/Vikipedio:Internacia_Vikipedio" lang="eo">Aliaj lingvoj</a>&nbsp;•

<a href="//meta.wikimedia.org/wiki/%EC%9C%84%ED%82%A4%EB%B0%B1%EA%B3%BC%EC%9D%98_%EB%AA%A9%EB%A1%9D" lang="ko">다른 언어</a>&nbsp;•

<a href="//vi.wikipedia.org/wiki/Wikipedia:Phi%C3%AAn_b%E1%BA%A3n_ng%C3%B4n_ng%E1%BB%AF" lang="vi">Ngôn ngữ khác</a>

</strong>

</div>

<div style="padding: 0 1%;"><hr></div>

<!– Other projects –>

<div id="divOtherProjects">

<div class="divOtherProjectsItem">

<div style="margin-top: 12px;">&nbsp;&nbsp;<a href="//www.wiktionary.org/" title="Wiktionary"><img src="//upload.wikimedia.org/wikipedia/commons/4/4a/Wiktionary-logo-en-35px.png" width="35" height="38" alt="Wiktionary" title="Wiktionary"></a>&nbsp;<a href="//www.wiktionary.org/" title="Wiktionary">Wiktionary</a>

</div>

</div>

<div class="divOtherProjectsItem">

<div style="margin-top: 19px;">&nbsp;&nbsp;<a href="//www.wikinews.org/" title="Wikinews"><img src="//upload.wikimedia.org/wikipedia/commons/thumb/8/8a/Wikinews-logo.png/35px-Wikinews-logo.png" width="35" height="18" alt="Wikinews" title="Wikinews"></a>&nbsp;<a href="//www.wikinews.org/" title="Wikinews">Wikinews</a>

</div>

</div>

<div class="divOtherProjectsItem">

<div style="margin-top: 10px;">&nbsp;&nbsp;<a href="//www.wikiquote.org/" title="Wikiquote"><img src="//upload.wikimedia.org/wikipedia/commons/thumb/f/fa/Wikiquote-logo.svg/35px-Wikiquote-logo.svg.png" width="35" height="41" alt="Wikiquote" title="Wikiquote"></a>&nbsp;<a href="//www.wikiquote.org/" title="Wikiquote">Wikiquote</a>

</div>

</div>

<div class="divOtherProjectsItem">

<div style="margin-top: 11px;">&nbsp;&nbsp;<a href="//www.wikibooks.org/" title="Wikibooks"><img src="//upload.wikimedia.org/wikipedia/commons/thumb/f/fa/Wikibooks-logo.svg/35px-Wikibooks-logo.svg.png" width="35" height="35" alt="Wikibooks" title="Wikibooks"></a>&nbsp;<a href="//www.wikibooks.org/" title="Wikibooks">Wikibooks</a>

</div>

</div>

<div class="divOtherProjectsItem">

<div style="margin-top: 13px;">&nbsp;&nbsp;<a href="//species.wikimedia.org/" title="Wikispecies, a free directory of life!"><img src="//upload.wikimedia.org/wikipedia/commons/thumb/d/df/Wikispecies-logo.svg/35px-Wikispecies-logo.svg.png" width="35" height="41" alt="Wikispecies" title="Wikispecies, a free directory of life!"></a>&nbsp;<a href="//species.wikimedia.org/" title="Wikispecies, a free directory of life!">Wikispecies</a>

</div>

</div>

<div class="divOtherProjectsItem">

<div style="margin-top: 10px;">&nbsp;&nbsp;<a href="//www.wikisource.org/" title="Wikisource"><img src="//upload.wikimedia.org/wikipedia/commons/thumb/4/4c/Wikisource-logo.svg/35px-Wikisource-logo.svg.png" width="35" height="37" alt="Wikisource" title="Wikisource"></a>&nbsp;<a href="//www.wikisource.org/" title="Wikisource">Wikisource</a>

</div>

</div>

<div class="divOtherProjectsItem">

<div style="margin-top: 22px;">&nbsp;&nbsp;<a href="//www.wikiversity.org/" title="Wikiversity"><img src="//upload.wikimedia.org/wikipedia/commons/thumb/9/91/Wikiversity-logo.svg/35px-Wikiversity-logo.svg.png" width="35" height="28" alt="Wikiversity" title="Wikiversity"></a>&nbsp;<a href="//www.wikiversity.org/" title="Wikiversity">Wikiversity</a>

</div>

</div>

<div class="divOtherProjectsItem">

<div style="margin-top: 7px;">&nbsp;&nbsp;<a href="//commons.wikimedia.org/" title="Wikimedia Commons — Free media repository"><img src="//upload.wikimedia.org/wikipedia/commons/thumb/4/4a/Commons-logo.svg/35px-Commons-logo.svg.png" width="35" height="47" alt="Wikimedia Commons" title="Wikimedia Commons — Free media repository"></a>&nbsp;<a href="//commons.wikimedia.org/" title="Wikimedia Commons — Free media repository">Commons</a>

</div>

</div>

<div class="divOtherProjectsItem">

<div style="margin-top: 13px;">&nbsp;&nbsp;<a href="//meta.wikimedia.org/" title="Wikimedia project coordination"><img src="//upload.wikimedia.org/wikipedia/commons/thumb/7/75/Wikimedia_Community_Logo.svg/35px-Wikimedia_Community_Logo.svg.png" width="35" height="35" alt="Meta-Wiki" title="Wikimedia project coordination"></a>&nbsp;<a href="//meta.wikimedia.org/" title="Wikimedia project coordination">Meta-Wiki</a>

</div>

</div>

</div>

<!– Site info –>

<div id="divSiteInfo">

<a href="//wikimediafoundation.org/" title="A Wikimedia Project"><img src="//bits.wikimedia.org/images/wikimedia-button.png" width="88" height="31" alt="Wikimedia" title="A Wikimedia Project"></a>

</div>

</div>

</div>

</body>

</html>

ANEXA NR. 2

DISPOSE(BOOLEAN) ȘI INITIALIZECOMPONENT

<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _

Partial Class Form1

Inherits System.Windows.Forms.Form

'Form overrides dispose to clean up the component list.

<System.Diagnostics.DebuggerNonUserCode()> _

Protected Overrides Sub Dispose(ByVal disposing As Boolean)

Try

If disposing AndAlso components IsNot Nothing Then

components.Dispose()

End If

Finally

MyBase.Dispose(disposing)

End Try

End Sub

'Required by the Windows Form Designer

Private components As System.ComponentModel.IContainer

'NOTE: The following procedure is required by the Windows Form Designer

'It can be modified using the Windows Form Designer.

'Do not modify it using the code editor.

<System.Diagnostics.DebuggerStepThrough()> _

Private Sub InitializeComponent()

Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(Form1))

Me.TextBox1 = New System.Windows.Forms.TextBox()

Me.TextBox2 = New System.Windows.Forms.TextBox()

Me.Label1 = New System.Windows.Forms.Label()

Me.Label2 = New System.Windows.Forms.Label()

Me.Button1 = New System.Windows.Forms.Button()

Me.Button2 = New System.Windows.Forms.Button()

Me.SuspendLayout()

'

'TextBox1

'

Me.TextBox1.BackColor = System.Drawing.Color.LavenderBlush

Me.TextBox1.Font = New System.Drawing.Font("Comic Sans MS", 9.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))

Me.TextBox1.Location = New System.Drawing.Point(102, 27)

Me.TextBox1.Name = "TextBox1"

Me.TextBox1.Size = New System.Drawing.Size(172, 24)

Me.TextBox1.TabIndex = 0

'

'TextBox2

'

Me.TextBox2.BackColor = System.Drawing.Color.LavenderBlush

Me.TextBox2.Font = New System.Drawing.Font("Comic Sans MS", 9.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))

Me.TextBox2.Location = New System.Drawing.Point(102, 58)

Me.TextBox2.Name = "TextBox2"

Me.TextBox2.PasswordChar = Global.Microsoft.VisualBasic.ChrW(42)

Me.TextBox2.Size = New System.Drawing.Size(172, 24)

Me.TextBox2.TabIndex = 1

'

'Label1

'

Me.Label1.AutoSize = True

Me.Label1.BackColor = System.Drawing.Color.Thistle

Me.Label1.Font = New System.Drawing.Font("Comic Sans MS", 9.75!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))

Me.Label1.ForeColor = System.Drawing.Color.Crimson

Me.Label1.Location = New System.Drawing.Point(27, 28)

Me.Label1.Name = "Label1"

Me.Label1.Size = New System.Drawing.Size(69, 19)

Me.Label1.TabIndex = 2

Me.Label1.Text = "Username"

'

'Label2

'

Me.Label2.AutoSize = True

Me.Label2.BackColor = System.Drawing.Color.Thistle

Me.Label2.Font = New System.Drawing.Font("Comic Sans MS", 9.75!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))

Me.Label2.ForeColor = System.Drawing.Color.Crimson

Me.Label2.Location = New System.Drawing.Point(31, 59)

Me.Label2.Name = "Label2"

Me.Label2.Size = New System.Drawing.Size(65, 19)

Me.Label2.TabIndex = 3

Me.Label2.Text = "Password"

'

'Button1

'

Me.Button1.BackColor = System.Drawing.Color.Snow

Me.Button1.Font = New System.Drawing.Font("Comic Sans MS", 9.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))

Me.Button1.ForeColor = System.Drawing.Color.Red

Me.Button1.Location = New System.Drawing.Point(205, 94)

Me.Button1.Name = "Button1"

Me.Button1.Size = New System.Drawing.Size(67, 33)

Me.Button1.TabIndex = 4

Me.Button1.Text = "Sign In"

Me.Button1.UseVisualStyleBackColor = False

'

'Button2

'

Me.Button2.BackColor = System.Drawing.Color.Snow

Me.Button2.Font = New System.Drawing.Font("Comic Sans MS", 9.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))

Me.Button2.ForeColor = System.Drawing.Color.Red

Me.Button2.Location = New System.Drawing.Point(132, 94)

Me.Button2.Name = "Button2"

Me.Button2.Size = New System.Drawing.Size(67, 33)

Me.Button2.TabIndex = 5

Me.Button2.Text = "Cancel"

Me.Button2.UseVisualStyleBackColor = False

'

'Form1

'

Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)

Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font

Me.BackColor = System.Drawing.Color.Orchid

Me.BackgroundImage = CType(resources.GetObject("$this.BackgroundImage"), System.Drawing.Image)

Me.ClientSize = New System.Drawing.Size(284, 129)

Me.Controls.Add(Me.Button2)

Me.Controls.Add(Me.Button1)

Me.Controls.Add(Me.Label2)

Me.Controls.Add(Me.Label1)

Me.Controls.Add(Me.TextBox2)

Me.Controls.Add(Me.TextBox1)

Me.ForeColor = System.Drawing.Color.Navy

Me.Name = "Form1"

Me.Text = "SECURITY GATE"

Me.ResumeLayout(False)

Me.PerformLayout()

End Sub

Friend WithEvents TextBox1 As System.Windows.Forms.TextBox

Friend WithEvents TextBox2 As System.Windows.Forms.TextBox

Friend WithEvents Label1 As System.Windows.Forms.Label

Friend WithEvents Label2 As System.Windows.Forms.Label

Friend WithEvents Button1 As System.Windows.Forms.Button

Friend WithEvents Button2 As System.Windows.Forms.Button

End Class

ANEXA NR. 3

COMPONENTE APLICAȚIE HASH

namespace hash

{

partial class Form1

{

/// <summary>

/// Required designer variable.

/// </summary>

private System.ComponentModel.IContainer components = null;

/// <summary>

/// Clean up any resources being used.

/// </summary>

/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>

protected override void Dispose(bool disposing)

{

if (disposing && (components != null))

{

components.Dispose();

}

base.Dispose(disposing);

}

#region Windows Form Designer generated code

/// <summary>

/// Required method for Designer support – do not modify

/// the contents of this method with the code editor.

/// </summary>

private void InitializeComponent()

{

this.button1 = new System.Windows.Forms.Button();

this.textBox1 = new System.Windows.Forms.TextBox();

this.label1 = new System.Windows.Forms.Label();

this.SuspendLayout();

//

// button1

//

this.button1.Font = new System.Drawing.Font("Comic Sans MS", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));

this.button1.ForeColor = System.Drawing.Color.DarkGreen;

this.button1.Location = new System.Drawing.Point(56, 66);

this.button1.Name = "button1";

this.button1.Size = new System.Drawing.Size(124, 38);

this.button1.TabIndex = 0;

this.button1.Text = "HASH";

this.button1.UseVisualStyleBackColor = true;

this.button1.Click += new System.EventHandler(this.button1_Click);

//

// textBox1

//

this.textBox1.Font = new System.Drawing.Font("Comic Sans MS", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));

this.textBox1.Location = new System.Drawing.Point(15, 30);

this.textBox1.Name = "textBox1";

this.textBox1.Size = new System.Drawing.Size(209, 30);

this.textBox1.TabIndex = 1;

//

// label1

//

this.label1.AutoSize = true;

this.label1.Font = new System.Drawing.Font("Comic Sans MS", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));

this.label1.Location = new System.Drawing.Point(12, 9);

this.label1.Name = "label1";

this.label1.Size = new System.Drawing.Size(94, 18);

this.label1.TabIndex = 2;

this.label1.Text = "Inserare text:";

this.label1.Click += new System.EventHandler(this.label1_Click);

//

// Form1

//

this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);

this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;

this.BackColor = System.Drawing.Color.PaleGreen;

this.ClientSize = new System.Drawing.Size(240, 145);

this.Controls.Add(this.label1);

this.Controls.Add(this.textBox1);

this.Controls.Add(this.button1);

this.Name = "Form1";

this.Text = "Functie HASH";

this.ResumeLayout(false);

this.PerformLayout();

}

#endregion

private System.Windows.Forms.Button button1;

private System.Windows.Forms.TextBox textBox1;

private System.Windows.Forms.Label label1;

}

}

Similar Posts