-
Posts
21,635 -
Joined
-
Last visited
-
Days Won
784
Content Type
Profiles
Forums
Events
Everything posted by gaby
-
Ati primit vreodata eroarea aceasta? Daca da, uitati metoda prin care puteti sa activati aceste optiuni. Intrati in start->run-> si scrieti ce am scris eu mai jos: REG add HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System /v DisableRegistryTools /t REG_DWORD /d 0 /f
-
Pentru a putea face acest lucru urmariti toti acesti pasi de mai jos: 1. Start > Run 2. Scrieti regedit 3. HKEY_CURRENT_USERSoftwareMicrosoftWindowCurrentVersionPoliciesExplorer 4. Click dreapta > New > DWORD Value 5. La name puneti NoTrayItemsDisplay. 6. Dublu click pe NoTrayItemsDisplay, si la voaloare puneti 1 ca sa nu mai apara icoanele, sau 0 ca sa apara. 7. Reboot
-
Pentru a utiliza serviciul Internet Connection Sharing, calculatorul trebuie sa utilizeze doua placi de retea: 1. O placa de retea sustine conexiunea la Internet. 2. A doua placa mentine conexiunea cu calculatoarele vecine. Pasii necesari pentru a activa serviciul: Va asigurati utilizand documentul de verificare de adresa IP, ca placa de retea asignata retelei utilizeaza un IP de genul: 192.168.1.x, unde x este distinct fata de IP-urile celorlalte calculatoare din retea si se gaseste intre 1 si 254. Va autentificati pe calculator ca administrator sau ca proprietar. * Start > Control Panel. * Click pe icon-ul Network and Internet Connections. * Click > Network Connections. Click-dreapta pe icon-ul Local Area Connection asignat placii de retea utilizate pentru conexiunea la Internet. Pentru a afla care este acesta, deconectati fizic cablul. In momentul in care are loc acest proces, iconita isi va schimba forma si va afisa mesajul: Cable unplugged. In momentul in care ati aflat care este numarul asignat de MS Windows icon-ului puteti conecta cablul la loc. Se selecteaza Properties. Se selecteaza tab-ul Advanced. Sub frame-ul Internet Connection Sharing, se selecteaza "Allow other network users to connect through this computer`s Internet connection". In cazul in care utilizati o conexiune dial-up se selecteaza checkbox-ul "Establish a dial-up connection whenever a computer on my network attempts to access the Internet", pentru a permite initializarea unei conexiuni in momentul in care un utilizator al retelei doreste acest lucru. Apasand OK, se va afisa un mesaj care va va avertiza ca in momentul in care serviciul "Internet Connection Sharing" este pornit, este util ca statiile client sa obtina un IP in mod dinamic. O solutie mai simpla este asignarea manuala de IP-uri conform celor mentionate mai sus. IP-urile alocate in retea necesita forma: 192.168.1.x unde x poate lua orice valuare cat timp este una unica si se incadreaza intre 1 si 254. Selectati Yes.
-
mouse-ul numai merge deloc ? dezinstaleaza driver-ul, si instaleaza-l din nou, s-ar putea din cauza asta sa fie.
-
ori placuta este arsa, ori pur si simplu placa ta de baza nu o suporta. cand pui placuta care nu merge si pornesti pc-ul se aude vreun tiuit ?
-
Tag-ul pentru legaturi este "<a" si se inchide cu ">" (fara ghilimele). Are atributele: 1. href - adresa fisierului destinatie 2. target - in ce fereastra se va deschide fisierul destinatie 3. title - mica descriere asociata legaturii afisata in momentul in care mouse-ul se afla deasupra Adresa legaturii poate fi pusa: 1. pagina.html daca se afla in acelasi folder cu pagina curenta 2. http://www.pctroubleshooting.ro adresa completa a paginii web Atributele la target: 1. _blank pagina va fi incarcata intr-o noua fereastra 2. _parent pagina va fi incarcata in fereastra parinte 3. _top pagina va fi incarcata in fereastra top a cadrului 4. _self pagina va fi incarcata in aceeasi fereastra Culoarea link-urilor poate fi modificata introducand in eticheta body urmatoarele atribute: 1. LINK legatura nevisitata (default albatru) 2. VLINK legatura visitata (default rosu) 3. ALINK legatura activa (nu prea se foloseste - default portocaliu) Exemplu de link: <a href="http://www.pctroubleshooting.ro" target="_blank" title="Forum IT">PC Troubleshooting</a>
-
- 1
-
-
iti apare aia ? care aia? da mai multe detalii, eventual si o poza. nu e chiar necesar sa scri cu caps lock activ.
-
Dupa mai bine de un an de la lansare, Gothic 3 se pare ca va primi un expansion. JoWood, compania care detine drepturile asupra jocului, inca nu a facut public decat faptul ca Gothic 3 - Forsaken Gods va fi lansat undeva in ultima parte a anului 2008, probabil inainte de sarbatori. Curiozitatea este cu atat mai mare cu cat JoWood a renuntat la developerul initial al jocului (Piranha Bytes), acest expansion urmand a fi realizat de o alta echipa. Probabil mai multe detalii vor fi facute publice in urmatoarele saptamani in cadrul forumului oficial, unde sunt asteptate si idei din partea comunitatii.
-
Un nou MMORPG, produs de catre cei de la StarVault, un studio suedez ce a reusit sa obtina suportul, admiratia, precum si ultima varianta a engine-ului de Unreal 3 a celor de la Epic. Din primele impresii, jocul pare a fi un AoC cu elemente de Darkfall, pare foarte frumos ca concept, ca idei, pare extrem de promitator, insa vom vedea pe parcursul development-ului cu ce se va diferentia Mortal Online fata de alte MMORPG-uri. Pana acum, grafica excelenta, concept original de free game world, mounted combat, player driven economy and player build cities, no in game restrictions like leveling, grinding and such, forum bestial, developeri ce asculta comunitatea si cam atat. Pana atunci, poftiti trailer pentru deliciul ochiului. Trailer-ul oficial poate fi vizionat aici:
-
EA va lansa SimCity Box, continand ultimele aditii la seria SimCity. Aceasta va fi lansata in iunie pentru SUA, iar data versiunea europeana ramane sa fie anuntata. In mod surprinzator, "cutia" va avea pretul unui joc normal. SimCity Box va contine SimCity Societies: Destinations, SimCity 4, expansion-ul Rush Hour si SimCity Carnival SnapCity.
-
Tehnica SQL injection da posibilitatea unui atacator sa execute comenzi SQL neautorizate porfitand de oportunitati neortodoxe de intrare in aplicatiile web construind interogari SQL dinamice. Acesta devine posibil deoarece PHP combina sirurile interogarilor MYSQL pe care le setezi cu variabila inainte pentru ca cineva sa poata adauga o a doua interogare sau schimba interogarea ta pentru a le oferi informatii sau acces pe care nu ar trebui sa il aiba. Cele mai obisnuite dintre aceste intrari includ apostrofuri unescaped in declaratiile SQL. PROBLEMA Considerati urmatoarea interogare SQL in PHP: $result=mysql_query('SELECT * FROM users WHERE username="'.$_GET['username'].'"'); Interogarea selecteaza toate randurile din tabelul userilor unde username-ul este acelasi cu cel din sirul de interogari. Daca priviti cu atentie, veti realiza ca declaratia este vulnerabila la SQL injection - apostroful in $_GET['username'] nu sunt , si prin urmare nu vor fi cuprinse ca parte din declaratie, ceea ce permite un comportament defectuos. Ganditi-va ce s-ar intampla daca $_GET['username'] ar fi urmatorul: " OR 1 OR username = " (dublu apostrof, urmat de textualul " OR 1 OR username = " urmat de un alt dublu apostrof). Cuprins in expresia originala, interogarea devine urmatoarea: SELECT * FROM users WHERE username = "" OR 1 OR username = "". Altfel, un dublu apostrof va ramane la sfarsitul afirmatiei. Aceasta selecteaza toate sirurile din tabelul userilor. Desi nu pare periculos, alte coduri infectate pot fi adaugate, mai ales in interogarile DELETE sau UPDATE care modifica tabelul. De asemenea, un alt sir de coduri SQL poate fi adaugat la SELECT * FROM `users` WHERE username = '' adaugand un apostrof sau o semicoloana la sfarsit, astfel sirul devene SELECT * FROM `users` WHERE username = ''; ' care cu usurinta se transforma in SELECT * FROM `users` WHERE username = ''; DELETE * FROM `forum` WHERE title != '' SOLUTIA Niciodata sa nu aveti incredere in informatiile userului, procesati informatia numai dupa validare. De regula, aceasta se face prin pattern matching. In exemplul urmator, username-ul este restrictionat la caractere alfanumerice plus underscore si cu o lungime cuprinsa intre 8-20 caractere ??€� modificati la nevoie. if (preg_match("/^w{8,20}$/", $_GET['username'], $matches)) $result = mysql_query("SELECT * FROM users WHERE username=$matches[0]"); else // we don't bother querying the database echo "username not accepted"; O buna practica in codare afirma ca apostrofurile duble ar trebuie folosite mereu in oricarei informatii variabile. Ori folosing slash dublu apostrof , ori apostrof simplu, cadrand intreaga interogatie, pentru ca tipul opus de interogatie sa nu trebuiasca escaped, desi acelasi tip de apostrof trebuie escaped. $result = mysql_query('SELECT * FROM users WHERE username = "$usern"'); or $result = mysql_query("SELECT * FROM users WHERE username = "$usern" "); Pentru o siguranta mai mare, renuntati la executarea scriptului inlocuind echo cu exit() or die(). Aceasta inca se mai aplica atunci cand se folosesc checkboxuri, butoane ratio, liste de selectie, etc. Orice browser cerut (chiar si POST) poate fi REPLICATED prin telnet, situri duplicate, javascript, sau codare(chiar si PHP), asadar intotdeauna trebuie sa fiti prevazatori in privinta restrictiilor pentru codarea aferenta clientului. Folosirea mysql_real_escape_string() PHP ofera o functie care se ocupa cu inserarea userului in MySQL, si aceea este mysql_real_escape_string(string unescaped_string[, resource link_identifier]). Acest script scapa de toate caracterele potential periculoase din sir si transforma sirul escaped intr-unul prudent pentru a fi folosit in sirul MySQL. (Functia originala, myqsl_escape_string, nu a luat in considerare caracterul curent pentru a iesi din sir, nici nu a acceptat argumentul conexiunii. Este dezaprobata inca de la PHP 4.3.0) Spre exemplu, luati urmatorul exemplu: $result=mysql_query('SELECT * FROM users WHERE username="'.$_GET['username'].'"'); Aceasta poate fi escaped dupa cum urmeaza: $result=mysql_query('SELECT * FROM users WHERE username="'.mysql_real_escape_string($_GET['username']).'"'); Astfel, daca userul a incercat sa insereze o alta declaratie in afara de DELETE, ar fi interpretat inofensiv ca o parte din parametrul clauza WHERE: SELECT * FROM `users` WHERE username = '';DELETE * FROM `forum` WHERE title != '' Backslashurile adaugate de mysql_real_escape_string face ca MySQL sa le interpreteze ai degraba ca si caractere cu un singur apostrof decat ca si parte din declaratia SQL. Luati la cunostinta ca MySQL nu permite multe interogari asadar DELETE FROM din tabel nu merge oricum.
-
Semafoarele sunt una dintre metodele de comunicare inter-proces , un mod de a semnala unui proces producerea unui eveniment in alt proces. Pentru a putea folosi semafoare trebuie incluse headerele sys/sem.h, sys/ipc.h si sys/types.h . Pasii care trebuie urmati pentru a defini , initializa , folosi si , in final , distruge un semafor sunt urmatorii: 1) Definim o variabila de tip intreg; int id_semafor; 2) Luam (sau cream) semaforul; id_semafor=semget(IPC_PRIVATE, 1, 0777); Prototipul functiei semget este urmatorul: int semget(key_t key,int nsems,int semflg) - functia intoarce identificatorul pentru grupul cu nsems semafoare asociat cheii key; - daca cheia este IPC_PRIVATE sau cheia nu este IPC_PRIVATE dar semflg are setat bitul IPC_CREAT un nou grup de semafoare este creat; - semflg contine de asemenea drepturile de acces asociate semaforului (in exemplul anterior , 0777); - prezenta flagurilor IPC_CREAT si IPC_EXCL in semflg in acelasi timp va duce la esuarea apelului functiei semget; In caz de succes functia intoarce un numar pozitiv care reprezinta id-ul semaforului si in caz de eroare -1 3) Daca este nou creat , vrem sa setam valoarea initiala a semaforului (de obicei este 1 , dar i se poate da orice valoare) - pentru asta s-ar putea sa avem nevoie sa definim o structura (semun) astfel #if defined(__GNU_LIBRARY) && !defined(_SEM_SEMUN_UNDEFINED) //semun e deja definit #else //definim semun typedef union { int val; struct semid_ds *buf; unsigned short *array; struct seminfo *__buf; } semun; #endif semun value; value.val=1; semctl(semidscr, 0, SETVAL, value); Prototipul functiei semctl: int semctl(int semid,int semnum,int cmd,union semun arg) - functia executa operatia indicata de cmd asupra setului de semafoare indicat de semid , asupra semaforului semnum din set (primul are indicele 0) folosind arg pentru asta - in cazul exemplului de mai sus , se seteaza valoarea din value la semaforul 0 din setul indicat de semafoul nou creat - pentru mai multe informatii legate de parametrii functiei , man semctl 4) Vrem sa folosim semaforul ( de obicei pentru sincronizari intre procese) - exista 2 operatii care se folosesc uzual asupra unui semafor pentru asta , si au numele consacrate:down si up (sau U si V) - down va incerca sa scada 1 din valoarea semaforului - up va adauga 1 la valoarea semaforului - uzual , daca un proces incearca sa faca down pe un semafor care are valoarea 0 , se va bloca acolo pana cand alt proces va face up pe acelasi semafor ATENTIE: - daca se folosesc threaduri , in momentul in care unul din threaduri face down pe un semafor cu valoarea 0 , intreg procesul se va bloca , adica TOATE THREADURILE pornite de acel proces - pentru sincronizare intre threaduri vor trebui folosite mijloace dedicate; Functiile down si up: void down(int semid,short flags) { //scade valoarea 1 dintr-un semafor char buf[64]; struct sembuf op; //scad valoarea 1 din semafor op.sem_num = 0; op.sem_op = -1; op.sem_flg = flags; if(semop(semid, &op, 1)==-1) { //eroare strcpy(buf,"Eroare la semop!\n"); write(1,buf,strlen(buf)); exit(-1); } } void up(int semid,short flags) { //adauga 1 la valoarea unui semafor char buf[64]; struct sembuf op; //adaug 1 la valoarea din semafor op.sem_num = 0; op.sem_op = 1; op.sem_flg = flags; if(semop(semid, &op, 1)==-1) { //eroare strcpy(buf,"Eroare la semop!\n"); write(1,buf,strlen(buf)); exit(-1); } } Prototipul functiei semop: int semop(int semid,struct sembuf *sops,unsigned nsops) - nsops se foloseste pentru a specifica numarul de operatii care trebuiesc efectuate (in sops va trebui sa se gaseasca un vector) - daca flags contine IPC_NOWAIT , procesul nu se va bloca daca valoarea din semaforul asupra caruia vrea sa faca operatia si apelul va intoarce -1 - daca flags contine IPC_UNDO , toate operatiile vor fi undone cand procesul se termina; 5) Dupa ce ne jucam cu semaforul , vrem sa-l distrugem semctl(id_semafor, 0, IPC_RMID, NULL); - apelam functia semctl cu parametrul cmd IPC_RMID Semafoarele sunt resurse sistem , trebuie distruse cand nu mai sunt folosite , altfel vor continua sa ocupe resursele sistemului. Pentru a vedea toate resursele IPC care sunt active la un moment dat in sistem , puteti folosi comanda ipcs din consola. Resursele(semafoare,cozi de mesaje,memoria partajata) pot fi distruse si direct din consola cu comanda ipcrm. Folositi man ipcs si man ipcrm pentru mai multe detalii. Autor: Florin
-
Daca dorim sa rezolvam o problema care se preteaza la o implementare cu mai multe procese, primul lucru pe care ar trebui sa-l stim este cum sa creem un nou proces.In Linux , modalitatea de a crea un nou proces este apelul functiei fork() , care se gaseste in bibliotecile "unistd.h" si "sys/types.h" ,acestea trebuind incluse daca vrem sa utilizam (cu succes) functia fork. Prototipul arata cam asa: pid_t fork(void); Ce se intampla dupa un apel fork: -se creaza un nou proces , prin copierea segmentelor de date si de cod ale procesului apelant; -functia intoarce in procesul tata PID-ul(process identifier) procesului nou creat; -functia intoarce in procesul fiu 0; -intoarce -1 in caz de eroare (adica nu s-a reusit crearea unui nou proces). Sa urmarim un exemplu ca sa ne dam seama si mai bine ce se intampla. Programul urmator creaza un proces copil , dupa care fiecare proces isi tipareste PID-ul. #include #include #include int main() { pid_t pid; int status; //apelul fork() pid=fork(); switch(pid) { case 0: //aici ne aflam in procesul copil printf("PID fiu:%d\n",getpid()); return 0; break; case -1: //eroare //ar fi bine daca s-ar face si tratarea erorii break; default: //aici ne aflam in procesul parinte //asteptam intai sa se termine procesul copil wait(&status); //tiparim mesajul printf("PID parinte:%d\n",getpid()); } return 0; } Observatii: 1) Se vede ca in switch(pid) , cand ma aflu in procesul copil la sfarsitul sectiunii case corespunzatoare (case 0) folosesc inainte de break apelul return.Aceasta imi asigura ca dupa apelul fork procesul copil executa NUMAI ce se afla intre case 0: si apelul return , asigurand astfel terminarea procesului copil. Din cauza ca se copiaza zona de cod a procesului parinte in procesul fiu , dupa iesirea din switch() , ambele procese vor executa aceleasi instructiuni. In exemplul de fata , nu se mai executa decat return , deci s-ar fi putut si fara return la procesul copil. Daca programul ar contine o bucla in care se face un fork , daca procesul copil nu se termina , ar putea rezulta ceea ce se numeste un fork-bomb , programul generand la infinit noi procese , care vor provoca in cele din urma o blocare a sistemului de operare. 2) S-a folosit functia wait: pid_t wait(int *status); pentru a astepta terminarea procesului copil. Daca nu se face wait , procesele copil terminate vor fi inca prezente in sistemul de operare ca defuncte sau zombie. Daca vreti sa vedeti cum se manifesta asta faceti mai multe procese pe care nu le asteptati cu wait() si urmariti procesele pornite din sistem. Functia wait asteapta terminarea oricarui proces copil , dupa care in "status" se pot regasi informatii despre codul de return al procesului fiu si alte chestii interesante. Pentru a astepta terminarea unui anumit proces , se foloseste waitpid: pid_t waitpid(pid_t pid,int *status,int options); care asteapta terminarea procesului cu PID-ul pid. Pentru mai multe informatii consultati paginile man din Linux. Pentru a intoarce PID-ul procesului curent avem functia: pid_t getpid(void); Pentru a intoarce PID-ul procesului parinte avem functia: pid_t getppid(void); ATENTIE !!! Din cauza faptului ca dupa apelul fork se copiaza sectiunea de date a procesului parinte in procesul fiu , orice modificare asupra unei variabile declarata inainte de fork() intr-un proces nu va fi sesizata in celalalt proces. Daca explicatia de mai sus pare un pic imbarligata , sa luam un exemplu: Declaram niste variabile: int a=0,b=10,status; pid_t pid; pid=fork(); switch(pid) { case 0: a++; b--; return; break; case -1: break; default: wait(&status); a--; b++; } Greseala pe care eu am facut-o prima data cand am lucrat cu procese a fost ca avem impresia ca daca modific o variabila intr-un proces , si celalalt proces sesizeaza asta; din cauza copierii sectiunilor de date , fiecare proces lucreaza asupra propriilor variante ale fiecarei variabile , deci rezultatele operatiilor sunt independente. In urma executarii exemplului de mai sus , procesul parinte va avea a=-1 , b=11 in timp ce procesul copil va avea a=1 , b=9. Pentru ca procesele sa partajeze zone din sectiunea de date se poate folosi apelul clone (man clone pentru detalii). Chiar daca in urma apelului fork nu se poate comunica direct intre procesele create, sistemul de operare pune la dispozitie o serie de mecanisme de comunicare interproces (pipe-uri , memorie partajata , semafoare , cozi de mesaje) , care vor fi detaliate pe parcursul tutorialelor de aici. Autor: Florin
-
il voi schimba in curand. ma mai gandesc la ceva modificari.
-
asteapta putin !
