Leaderboard
Popular Content
Showing content with the highest reputation on 03/01/13 in all areas
-
String-uri in Python Slicing and substrings ( Felierea si sub – stringuri ) Si mai interesanta este posibilitatea de taiere ( slicing ) , aceasta tehnia permite sa taiati o parte din lista care indica indicele de pornire si indicele de incheiere , este util sa stiti ca sub – stringul prelevat e acela care pleaca de la caracterul indicat al primului indice inclus , pana la indicele final exclus , omitand unu dintre indici indicam Python-ului sa mearga pana la sfarsit cu taierea , daca punem un numar negativ ca si indice final , Python va calcula caracterele in sens invers . Niste exemple practice : >>> y='Hello World' >>> y[0] # Ia prima litere de la Y avand in vedere ca se porneste de la 0 'c' >>> y[5] 'm' >>> x='Programare Pythom' >>> x[-2] # Printeaza al doilea caracter incepand de la dreapta 'o' >>> x[2:7] # Printeaza caracterele X inclusiv de la 2 la 7 'ogram' >>> x[4:] # Printeaza de la al patrulea caracter pana la sfarsit X 'ramuri python' >>> x[:4] # Printeaza caracterele X cuprinse de la inceput pana la al patrlea 'prog' >>> x[3:-2] # Printeaza de la al treilea caracter incepand de la 0 pana la penultimul X 'gramare python Metode pentru string-uri Observam acum anumite metode pentru stringuri care pot fii utile : Metoda " find() " este utila a reincarca de caractere un string , iar daca nu este prezent de rezulta " -1 " >>> s='rstforums.com' >>> s.find('rst') 0 Metoda " replace() " >>> s.replace('com','test') 'com.test' Metodele " upper() si lower()" , servesc la convertirea MAJUSCULELEOR si minusculelor intr-un string. >>> up=s.upper() >>> print(up) rstforumc.com >>> low=up.lower() >>> print(low) Construirea stringurilor : Multumita operatorului " % " putem sa construim un string introducand parametr " semnalpost " care se pot substituii cu valori asumate de variabile , ca si in instructia " printf " din " C " , exemplu : >>> nume = 'stefan' >>> ani = 29 >>> rezultat = "%s are %d ani" % (nume, ani) >>> print(rezultat) stefan are 29 ani In primele linii am definit variabilele + valorile string si numerice . In linia " %s are %d ani " am introdus parametrii . %s – Parametru de tip string %d – Parametru de tip numeric Parametrii pentru constrirea sting-urilor : Python ne ofera alte functii pentru a gestii string-urile , toate sunt grupate imprena cu modulul numic " string " . Liste Listele in Python sunt coletii ordonate de obiecte simalre " array " al altor tipuri de limbaje , cum ar fii Java . Diferit de string-urile despre care am vorbit , listele pot sa contina obiecte eterogene cum ar fii numere , string-uri si alte liste , acest ne permite de a manipula rapid si de a structura complexitati de alta natura , petru a declara o lista este suficient sa dati unui variabile o lista de valori , separate prin virgula si inchide cu paranteze patrate , exemplu : >>> l1=[1, 'html.it'] # Lista cu un intreg si un string >>> l2=[1, 1.2, 'ciao', [1,2] ] # Lista cu : intreg , real , string si o alta lista O mare parte din ceea ce am scris pentru string-uri este valabil si pentr liste , ca si indice care incepe de la 0 , normal o serie de exemple vor demonstra cum lucreaza operatorii de indici si slicing ( taiere ) . >>> s=['rst', 'com', 'rst.com'] * >>> s[0]****** # indicare 'rst' * >>> s[-2]***** # Indicare incepand de la dreapta 'com' * >>> s[:2]***** # slicing ['rst', 'com'] * >>> s[2:] ['rst.com'] * >>> s[1:-1] ['com'] Sa vedem acum operatorii pentru concatare " + " si repetare " + " , pentru liste . >>> [1, 2, 3] + [4, 5] # concatare [1, 2, 3, 4, 5] * >>> ['rst.com']*3***** # repetare ['rst.com', 'rst.com', 'rst.com'] >>> y=[1,2,3] * >>> y[0]="unu"* # Modifica lista >>> y ['unu', 2, 3] * >>> y[1:2]=[]** # Sterge un element din lista >>> y ['unu', 3] Pentru a cunoaste lngimea unei liste , utilizam functia " len()" >>> lista=['c', 'a', 'b']***** >>> len(lista) 3 Metode pentru liste Exemple : >>> lista=['rst', 'rst', 'rst l']**** * >>> lista.append('rst .com')************ #metoda append() >>> lista ['rst', 'rst', 'rst', 'rst.com'] * >>> lista.extend(['HYml','rst.COM'])*********#metoda extend() >>> lista ['rst', 'rst', 'rst', 'rst.com', 'HYml', 'rst.COM'] * >>> lista.insert(0, 'primuRST')************ #metoda insert() >>> lista ['primuRST', 'rst', 'rst', 'rst', 'rst.com', 'HYml', 'rst.COM'] Acum sa vedem metode de stergere : >>> lista=['rst', 'RST', 'Rst']**** >>> lista.pop() #Fara indice elimina ultimu element din lista 'Rst' >>> lista ['rst', 'RST'] >>> lista=['rst', 'RST', 'Rst']**** >>> lista.remove('rst')****** ['RST', 'Rst'] * >>> lista=['rst', 'RST', 'Rst'] >>> lista.remove(lista[1]) >>> lista ['rst', 'Rst'] >>> lista=['c', 'a', 'b']***** >>> lista.sort() >>> lista ['a', 'b', 'c'] Dictionare Un dictionar este o coloectie neordonata de obiecte . Obiectele sunt identificate unice de o cheie ( in general un string ) in loc de mediante un indice numeric , cum se face la liste . Fiecare element al dictionarului este reprezentat de o copie ( cheie / valoare ) , cheia este utila pentru a deschide elemente sau recuperare valori . Este exact ca si cand ai cauta un cuvand in DEX , in practica ceea ce se cauta este o explicatie a cheii , pentru a face o comparatie cu alte limbaje , putem spune la dictionar ca este o specie de array asociativ . Un dictionar este format din elemente separate , virgule si inchide in paranteze grafe , un dictionar gol este format din paranteze deschide si inchise . >>> dictionar1={}*********** # dictioar gol >>> dictionar1 {} Putem creea noi insine un dictionat prin metoda " dict() " >>> dictionar2=dict()******* # dictionar gol >>> dictionar2 {} Putem sa definim elemente din dictionar direct , listand copii ale cheilor-valorifice . >>> dictionar={'rst':1, 'RST':2, 'ESt':3} >>> dictionar {'rst': 1, 'RST': 2, 'RSt': 3} Pentru a recupera o valoare putem sa trecem la dictionarul nume de la cheia relativa. >>> dictionar['RST']******* # Recupereaza valoarile incepand de la dictionarul 2 Putem verifica existenta unei chei prin keyward-ul " in " >>>* 'rs' in dictionar******** # cauta cheia >>> True Introduceri , modificari si stergeri Sa vedem acum cum se introduce , modifica si sterge elemente dintr-un dictionar : >>> dic={'rst':1, 'RST':2, 'RSt':3} >>> dic['rst.com']=4****************** # introducere >>> dic {'rst': 1, 'RST': 2, 'rst.comt': 4, 'RSt': 3} * * >>> dic['rst']=7********************* # modifica >>> v {'rst': 7, 'RST': 2, 'html.it': 4, 'RSt': 3} * * >>> del dic['RST']******************* # stergere >>> dic {'rst': 7, 'rst.com': 4, 'RSt': 3} Pentru a cunoaste numarul elementelor dintr-un dictionar , utilizam "len " >>> len(dic) 3 Metode pentru dictionare >>> dic={'rst.com':1, 'RST':2, 'rst':3} * >>> dic.get('rst')*********************************** # metoda get() 3 * >>> dic.values()************************************** # metoda values() dict_values([1, 3, 2]) * >>> dic.keys()****************************************metoda keys() dict_keys(['rst.com', 'rst', 'RST'])* * >>> dic.items()*************************************** # metoda items() dict_items([('rst.com', 1), ('rst', 3), ('RST', 2)]) Oridinea cheilor ( cuvintelor ) Cum era la inceput cu Python 3.x , nu putem sa ordonam un dictionar utilizand direct lista obtinuta prin metoda " keys " . >>> dic1 = {'andrea':28, 'florin':25, 'marius':21, 'elena':28} >>> k = dic1.keys() >>> k.sort() Traceback (most recent call last): **File "<stdin>", line 1, in <module> AttributeError: 'dict_keys' object has no attribute 'sort' Ca o solutie ca saputem sa obtinem ceva ordonat convertind intr-o lista elancata de chei si aplcare metoda "sort" >>> k=list(k) #conversie in lista >>> k ['marius', 'florin', 'andrea', 'elena'] >>> k.sort() >>> k ['andrea', 'elena', 'florin', 'marius'] >>> for elemento in k: print(element, dic1[element]) ... andrea 28 elena 28 florin 25 marius 21 Tupla ( Tuple ) O tupla in Python este mult similara unei liste , functia lor este in mare parte aceeasi . Prima diferenta intre tupla si lista este sintaxa , tuplele sunt inchide intre paranteze rotunde ( nu patrate ) , exemple : >>> t=() >>> t () Iar pentru a reprezenta o tupla cu un element , se foloseste o sintaxa . >>> t=(1,) >>> t (1,) Urmatoare diferenta nu este prea vizibila , dar nu trebuie sa o trecem cu vederea . Lista poate fii mutat , tupla NU . Tipi mutabili Sa incercam sa descifram , variabilele de tip mutabil pot sa sa isi schimbe " viata ", practic pentru o lista este posibil sa intrducel sau sa stergem elemente in orice moment , pentru tipurile non mutabile , adica nu este posibil sa schimbam blocul valorii in in intern . Folosirea tuplelor Tuplele sunt folosite cand noi nu vrem sa se modifice continutul unei elencari , deci nu se pot adauga / sterge elemente . Operatorii sunt aceeasi ca cei ai listelor ( mai putin cei ce schimba valoarea care nu au motiv sa exista ) exemple : >>> tupla=(1,2,3,4) >>> tupla (1, 2, 3, 4) * >>> tupla[3]****** #indicare 4 * >>> tupla[1:-1]******* #slicing (2, 3) Ca si pentru string-uri si liste , avem operatori de concare si repetare : >>> ('unu','doi')+('trei','patru') # concatare ('primo', 'secondo', 'terzo', 'quarto') * >>>* ('unu',)*2************************** # ripetare ('unu', 'unu') Cum s-a mentionat mai sus , spre deosebire de liste, tuplele nu accepta modificari . >>> tupla=(1,2,3) >>> tupla.append(4) Traceback (most recent call last): **File "<stdin>", line 1, in <module> AttributeError: 'tuple' object has no attribute 'append' </pre> * <pre class="brush:plain"> >>> tupla.remove(1) Traceback (most recent call last): **File "<stdin>", line 1, in <module> AttributeError: 'tuple' object has no attribute 'remove' * >>> tupla[0]=2 Traceback (most recent call last): **File "<stdin>", line 1, in <module> TypeError: 'tuple' object does not support item assignment Conversatii liste -> tuple , tuple->liste Este posibila conversatia dintre cele doua , cu functiile list si tuple , exeplu : >>> tupla=(1,2,3,4) >>> lista=list(tupla)***** # conversatie tupla-lista >>> lista [1, 2, 3, 4] * >>> tuplaconv=tuple(lista) # conversatie lista-tupla >>> tuplaconv (1, 2, 3, 4) Fisiere in Python Conceptul de fisier ( file ) este destul de bine cunoscut , faptul ca gestirea fisierelor in Pytho trebuie facuta in internul limbajuli ( built-in ) garanteaza o voteza si simplitate in gestirea lor , in particular este important sa putem gestiona fisiere cu instructii de limbaj programare , pentru salvarea informatiilor pe HDD si facute persistente . Continuare ^ | Variabilele " input si output " din tabel sunt obiecte de tip file , exemplu : >>> myfile = open('R0cc0.txt','w')****** # apare fisierul in scriere * >>> myfile.write(' linia 1\n')************ #** scrie linia 1 7 >>> myfile.write(' linia 2\n')************ #** scrie linia 2 7 >>> myfile.write(' linia 3\n')************ #** scrie linia 3 7 >>> myfile.close()********************* # inchide fisier * >>> myfile = open('R0cc0.txt','r')****** # Apare fisierul in timpul citirii >>> myfile.readlines()***************** #** citeste din fisier si reda o lista in linii ['linia1\n', 'linia2\n', 'linia3\n'] Functia " open " ne da voie sa citim un fisier care il scriem si returneaza un obiect de tip file care se asociaza lui " myfile ", Utilizam creeatia pentru a scrie in file cu metoda " write " si il inchidem cu " close" . Apoi ne intoarcem la acelasi fisier in citire si printam continutul cu " readlines() . Metode de deschidere ( open ) In afara de " w " si " r " ( write si read ) , care le-am studiat deja , funcia " open " ne arata alte modalitati de deschidere a fisierelor , care le putem utiliza ca si al doilea parametru : Din fisierele deshide in mod binar , putem extrage date ca si byte , fara nici un cod . >>> print(open.__doc__) Miscandune in internul fisierului Pentru a verifica statutul fisierului este suficient a printa datele instantei curente , exemplu : >>> myfile <_eo.TextEuWrapper name='RST.txt' mode='r' encoding='cp1252'> NOTA : sa nu uitam , mereu trebuie sa inchidem fisierele dupa ce le folosim / modificam " (close()) " . Functii Functiile sunt grupuri de instructii care la inceput prind un intreg de valori parametrici si au ca rezultat aceeasi parametrii . Functiile sunt un instrument important . Parmit reutilizarea codului , functiile folosite de mai multe ori intr-un program pot sa fie adunate intr-o singura functie . Permit de structurare codul programului in bloccri omogene din punct de vedere logic pentru a imbunatatii munca programatorului . Sintaxa definirii unei functii este : def nume_functie(<listeaza parametri divizati de virgula >): <bloc de instructiuni> return <rezultat> # optional Odata definita functia in acest mod este posibila retilizarea ei simplu , invocand numele ei , urmat de list de valori , se sub intelege , valorile le vom trece ca si parametri . Exemplu : def patrat(valoare): ris = valoare * valoare return ris a = 5 print patrat(a) Urmarind acest program , rezultat este 25 . Primele 3 linii definesc functia de patrat . De acum innainte numele " patrat " devine parte din " namespace " al modulului curent ( un intreg de nume semnificative in internul modulului ) . Invoam funcia , valoarea trecuta ca si parametru vine transferat la functia numelui parametrului (" valoare ") , vine urmata functia si de restituie rezultatul modululuin invocat . Toate asta ne permit sa sa le introducem in " patrat " , o operatie mai complexa . Introducand functiile trebuie sa distrugem variabilele locale ale functiiloor , deci vor fii utilizate de la sine . Variabilele globale , sau aparente in " namespace "modulului, deci se utilizeaza in afara functiei . Cand se invoca o functie vin transferate valorile variabilelor parametrilor functiilor . Acesta permite functiilor de venire in urma fnctiior care provin din " bloc " . Trecerea pe valori : Vine transferta functiei doar o copie a variabilei, deci funcia nu poate altera valoare variabilei . Trecere pe referinte : In acest caz vine trandferata variabila adevarata , deci poate altera valoare variabilei . In python parametrii trecuti la functii sunt mereu transferati pe valori . Asta e diferenta intre alte limbaje , ca si " C , Pascal" , unde se pot trece parametrii si pe referinte . Practic cand se utilizeaza o variabila , Python incearca prima oara numele acelei variabile in " namespace "local . Daca , cautarea nu este pozitiva , se continua cu " namespace " global si doar succesiv se va cauta numele intre functii ( built – in ) . adica cele default in Python . Acest mecanisc permite de utilizare valoarea variabile si provoaca creearea aceluiasi nume intr-un " namespace " nou . Exemplu : def functie1(): x = 20 # variabila locala cu acelasi nume print x # adevarat' vazut 20 si nu 10 print y # devarat' vazut 19 x = 10 # variabile gloobale y = 19 functie1() Treaba se schimba radicat pentru strcurarea datelor mutabile , care pot fii modificate in internul functiilor . Practic nu sunt niste ariabile adevarate ,deci e posibil sa le modificam . Exemplu : def functie2(a,b = 30): print a, b x = 10 y = 19 functie2(x) functie2(x,y) Functia numita 2 "functie2" are 2 parametrii : a si b , ea vine invocata de 2 ori . Rezultatul primului invoc este 10, 30 , practic parametrul b, nu este indicat , ia valoarea 30 . Rezultatul la al doilea invoc este 10, 19 . Module ( Moduli ) Cand se intra mai adanc in Python , programele / codurile cresc repede , si devin obositoare si greu de gestionat , intregul program intr-un singur file script . Pentru asta e oportun subdidere programu in diverse fisiere de script . Aceasta medoda permite de creeare recolte de functii care pot sa fie utilizate in proiecte diverse . Moduli sunt fisiere de script , "file.py " care pot sa fie reinvocate de alte programe Python pentru reutilizarea functiilor continute . Moduli pot sa fie creati usor de noi cei ce programam , dar daca exista deja multi , dece sa nu ii modificam continutul . Moduli pentru gestionarea string-urilor Moduli pentru invocare functii , din sitemul operativ Moduli pentru gestionarea internetului Moduli pentru e-mail Pentru a scrie un modul , este de ajuns sa creean un " file.py " si sa scriem toate functiile necesare , pentru al putea folosii il vom importa cu , comanda " import " . Exemplu : NOTA : Nu va incerede tin moduli luati de pe internet . import library upa ce ati importat libraria ( modulul ) , ptem simplu invocare functiile continute , folosind " dot notation " . Scriem numele modululi un punct si numele functiei , reusim sa intram in modul si invocare functia . Exemplu : R0cc0.py , contine functiile " open() , close() " , si move(obiect ) , puteti sa invocati functii asa : import library library.open() ogg=5 library.move(ogg) library.close() Daca nu doriti sa utilizati numele librariei , mereu cand invocati o functie , este posibil sa puneti si numele functiei direct . import library from library import move libraty.open() ogg=5 move(ogg) library.close() In acest caz , fuctia mutat face parte din intregul de nume definite in program " namaspace " si nu necesita prefix de nume modul ( librarie ) . library.py in internul programului , este de ajuns sa utilizati caracterul "*" . from library import * open() ogg=5 move(ogg) close() String : Modul care aduna functii pentru gestionarea string-urilor . Functii pentru convertire din strind in numar Functii petru convertire din minuscula in MAJUSCULA Functii pentru inlocuirea de patilor dintr-un string Sys : modul care adna functii pentru reperarea de informatii din sistem , ex : reperearea argumentelor trecute in linia de comanda ( CmD ) . Os : Modul pentru a face operatii din sistemul operativ , ex : copierea , renumirea sau stergerea unui file . Pentru a se inetelege mai bine conceputl de import al numelor functiilor , trebuie sa punem in paralele conceputul " namespace " Fiecare modul are un intreg de nume ( cele de variabile si cele de functii ) care reprezinta nume utilizabile in internul sau . Acest intreg se mai numeste si " namespace " ( spatiul numelor ). Pentr a transporta numele dintr-un " namespace " in altul se poate folosii comanda " import " Mediant , functia " dir() " , cu , care este posibil sa vedem lista de nume . >>> dir() ['__builtins__', '__doc__', '__name__'] Aceste nume de mai sus , sunt nume definite de interpret inainte de a incepe a comunia . Daca noi importam modulul " R0cc0.py " , se obtine asta : >>> from libraty import * >>> dir() ['__builtins__', '__doc__', '__name__', 'open', 'close', 'move'] Acum dupa cum vedeti toate functiile continute de " R0cc0.py " fac parte din " namespace " , de asta nu mai sunt deloc vizibile variabilele precedente , doar cele locale pentru functia in sine . Uitasem , aici gasiti module ( toate ) . Scuzati eventualele greseli gramaticale .2 points
-
List of Bug Bounty program for PenTesters and Ethical Hackers | Hacking News | Security updates1 point
-
1 point
-
Nu trebuie sa va schimbati "toolul" pentru scanat, nu trebuie decat sa modificati source.txt in dubrute. Metoda consta in construirea fisierului source.txt in afara programului Dubrute (Care de fapt nu o construieste, ci acorda niste instructiuni pentru creearea ulterioara, in timpul scanarii.). RDP_SRCBuilder Aici introduceti lista cu ipuri/usernames si parole si o sa primiti un fisier sursa gata formatat. Atentie: Nu mai dati build la sursa, folositi ce va generati pe site! Pentru mine dubleaza rezultatele. Intr-un interval de 4 ore cu un singur utilizator si 25 parole si pe 10.000 ipuri am macar 50-60 rezultate. @demisec sunt!1 point
-
Template metoda pattern ( sablon ) in PHP Un template metoda pattern ( sablon ) este un model de proiectare (Behavioral Design Pattern) , difuzat in Object Oriented Programming , care ne lasa sa stabilim structura unui algoritm de clasa , inteles ca si procedura pentru solutionarea problemelor recurente , facand ca , clasele secundare ( derivate sau subclase ) sa poate efectua arbitrar partiale implementari si personalizari pentru redefinire anumitor comportamente , totul fara a necesita rescrierea codului sursa . Fnctionarea " Template methon Pattern In cazul specific al limbajului PHP , va fii in internul Template methon Pattern o clasa abstacta , adica o clasa svilupata partial in care metodele pot fii implementate prin clasele secundare , carora li se vor asocia definirea metodei prin care a fost corelat un algoritm , si metodele implicate de algoritm in sine . In programarea care se refera la biecte , frecvent trebuie sa gestionam diverse sub-clase care provin dintr-o clasa principala , o conditie , o fectiune in sine nu este negativa, dar poate sa ridice inconvenientul de a fii nevoie sa punem in aplicare structuri asemanatoare . O posibila solutie a aceste probleme este , de a redefinii sursa facand in asa fel ca orice suprapunere sa fie mutate din multitdinea de clase secundare , in singura clasa ( superclass ) . Cel mai bine este sa vedem o simpla tehnica de sesizare , daca credeti de exemplu ca trebuie sa gestionati o aplicatie mai complexa , care cuprinde mai multe parti inter-conectate intre ele , dar care trebuiesc sa pevada modificari care nu implica intreaga structura , o modalitate de intervent ar fii aceea sa va asigurati ca sub-casele pot actiona pe parti din algoritm dintr-o clasa abstracta . " Template Methon Pattern " ne perimite acest lucru , adica descrierea structurii de baza a unui algoritm intr-o operatie lasand clasele secunde libere sa urmeze eventualele implementari . Operatiuni primitive : Concepute pentru a redefinii clasele derivate . Hookc : Metode optionale redefinibile sau eredetabile in forma originala . Metode care nu pot fii inlocuite / modificate deoarece apartin superclasei . Un simplu exemlpu de utilizare este acela care prevede creearea unei AbstractClass care contine metoda template asociata algoritmului pentru definirea continutului structural dintr-un fisier . Definita abstractului si implementarea in Sub-Clase Un exemplu practic de utilizare al " Template Method Pattern " , sa presupunem o aplicatie in care superclasa , numita " TemplateBase , are integrata metoda : (ViewFullMessage()) , care invoca metodele : extractObject() si extractText() . <?php // definitia superclasei ca si subclasa abstract class TemplateBase { // metooda si structurarea algortmului de clasa public final function vewfullMessage($message) { $bozza_Object = $message->extractObject(); $bozza_text = $message->extractText(); $object_final = $this->correctObject($bozza_Object); $testo_definitivo = $this->correctText($bozza_text); if (NULL == $text_final) { $message_displayed = $object_final; } else { $message_dysplayed = $object_final." .:::. ".$text_final; } return $message_dysplayed; } // functie pentru overriding abstract function correctObject($bozza_object); // hook function correctText($bozza_text) { return NULL; } } /* ereditare subclase*/ // first ConcreteClass class TemplateConTesto extends TemplateBase { function correctObject($bozza_object) { return str_replace(" ","---",$bozza_object); } function correctText($bozza_text) { return str_replace(" ","---",$bozza_text); } } // a doua ConcreteClass class TemplateJustObject extends TemplateBase { function CorrectObject($bozza_object) { return str_replace(" ","~",$bozza_object); } } class MessageFull { private $bozza_text; private $bozza_object; function __construct($bozza_object_for_write, $bozza_text_for_write) { $this->object = $bozza_text_for_write; $this->text = $bozza_object_for_write; } function extractText() {return $this->object;} function extractObject() {return $this->text;} function extractTextAndObect() { return $this->extractObject() . " .:::. " . $this->extractText(); } } write_message("Exemplu practic de utilizare a Template Method Pattern."); $message_complete = new MessageComplete("hello rst.com","Hello from R0cc0."); $template_with_testo = new TemplateConTesto(); $template_just_object = new TemplateJustObject(); write_message("Firs execution: show message and object:"); write_message($template_with_text->viewfullMessage($message_complete)); write_message("a doua executie : show just object:"); write_messageo($template_just_object->viewfullMessage($message_complete)); write_message("Finished execution."); function write_message($output) { echo $output."<br/>\r\n"; } ?> Executia sursei ar trebuii sa genereze un output de genul : Exemplu practic de utilizare a Template Method Pattern. First execution : Show message and object: Hello---rst.com .:::. Hello---from---R0cc0 . Second execution : show just object: Hello~rst.com Finished execution Reasumand tot, in aplicatie vine introdusa o metoda template, care nu va face altceva decat sa defineasca structura algoritmului , pentru care a fost creata superclasa . Scuzati greselile gramaticale .-1 points
-
SRI confirma ca Romania a fost tinta unui atac cibernetic de proportii ce pare initiat de un alt stat SRI a confirmat vineri ca Romania a fost din nou tinta unui atac cibernetic relevant ce a vizat informatii confidentiale care pot fi valorificate, a spus purtatorul de cuvant Sorin Sava. "Acest atac este unul cu totul nou fata de Red October, este realizat insa de o entitate care prezinta caracteristicile unui actor statal", a spus el, citat de Mediafax. Kaspersy Lab a publicat miercuri o analiza efectuata impreuna cu CrySys Lab, relevand faptul ca saptamana trecuta mai multe organizatii guvernamentale din lume, inclusiv din Romania, au fost victima unui atac informatic personalizat si ciudat. Malware-ul a fost denumit MiniDuke, iar in atacuri au fost utilizate exploit-urile PDF din Adobe Reader. Potrivit analizei Kaspersky Lab, mai multe tinte importante au fost deja compromise de atacurile MiniDuke, inclusiv institutii guvernamentale din Ucraina, Belgia, Portugalia, Romania, Republica Ceha si Irlanda. In Romania a fost atacat un IP din reteaua guvermului, atacurile detectate fiind in datele de 20, respectiv 24 februarie. In afara de guvernele europene, atacul a vizat si un think-tank din SUA si un furnizor de servicii de sanatate din aceasta tara. Cei de la Kaspersky spun ca vorbim de un atac neobisnuit din punct de vedere al metodei, iar ca tipologie sunt asemanari cu Octombrie Rosu fiindca si aici au fost tintite tot institutii guvernamentale. "Acest atac este unul cu totul nou fata de Red October, este realizat insa de o entitate care prezinta caracteristicile unui actor statal. Din estimarile SRI, acest atac are un impact mai mare, din cauza nivelului tehnologic superior, care ii perimite sa se disimuleze mai bine si sa preia sub control reteaua compromisa, in scop exfiltrarii (opusul infiltrarii, n.r.) de informatii. Potrivit si estimarilor SRI, atacul are cu certitudine relevanta in planul securitatii nationale a Romaniei prin profilul entitatilor compromise, motiv pentru care, in prezent, Serviciul, prin echipele specializate de reactie la atacuri cibernetice, intreprinde masuri specifice pentru identificarea tuturor entitatilor afectate, evitarea consecintelor si stoparea atacului", a spus Sava. El a mentionat ca SRI coopereaza, in acest scop, cu STS si CERT-RO (Centrul national de raspuns la incidente de securitate cibernetica). "Serviciul reitereaza faptul ca amenintarea cibernetica reprezinta una dintre cele mai mari si mai dinamice amenintari la adresa securitatii nationale a Romaniei, astfel incat cresterea nivelului securitatii cibernetice este o prioritate a statului roman. Serviciul, in calitate de autoritate nationala in domeniul cyber-intelligence, acorda o atentie prioritara acestui domeniu, in stransa cooperare cu celelalte institutii ale statului roman, cu partenrii externi, precum si in parteneriat cu domeniul privat", a spus Sava. Cei de la Kaspersky spuneau ca atacatorii MiniDuke sunt activi in prezent si au creat fisiere malware chiar si pe 20 februarie 2013. Pentru a compromite victimele, atacatorii au utilizat tehnici de inginerie sociala foarte avansate, care implica trimiterea de documente PDF malitioase catre tintele vizate. Documentele trimise erau create sa para foarte credibile pentru destinatari, avand un continut bine construit, care sa imite prezentarile despre un seminar pe tema drepturilor omului (ASEM), strategia de politica externa a Ucrainei si planurile NATO pentru tarile membre. Atacul a fost sustinut de servere din Turcia si Panama. Source-1 points