24 februarie 2011

Compilari & Makefile-uri

Exemplu un Makefile care creeaza o biblioteca statica.

Intr-un director avem hexdump.c, hexdump.h, sample.c, main.c si vrem un Makefile astfel incat: la rularea comenzii make libhexdump_static să creeze biblioteca statică libhexdump_static.a (biblioteca va conține fișierele obiect asociate fișierelor hexdump.c și sample.c) si la rularea comenzii make să creeze executabilul main_static obținut din legarea fișierului obiect corespunzător lui main.c cu biblioteca libhexdump_static.a.

all: main_static

main_static: libhexdump_static
gcc -Wall main.c -o main_static -lhexdump_static -L.

libhexdump_static: hexdump.o sample.o
ar rc libhexdump_static.a hexdump.o sample.o

main.o: main.c

hexdump.o:
gcc -Wall -c hexdump.c
sample.o:
gcc -Wall -c sample.c

.PHONY:
clean:
rm -f *.o main_static libhexdump_static.a


Exemplu de Makefile care creeaza o biblioteca dinamica

Avand la dispozitie aceleasi fisiere, la rularea comenzii make libhexdump_dynamic să se creeze biblioteca dinamicălibhexdump_dynamic.so. Biblioteca va conține fișierele obiect asociate fișierelor hexdump.c și sample.c
La rularea comenzii make pe lângă executabilul main_dynamic obținut anterior să se creeze și executabilul main_dynamic obținut din legarea fișierului obiect corespunzător lui main.c cu biblioteca partajată libhexdump_dynamic.so.

all: main_dynamic

main_dynamic: libhexdump_dynamic.so
gcc -Wall main.c -o main_dynamic -lhexdump_dynamic -L.

libhexdump_dynamic: libhexdump_dynamic.so

libhexdump_dynamic.so:
gcc -shared hexdump.o sample.o -o libhexdump_dynamic.so

main.o: main.c
hexdump.o: hexdump.c
sample.o: sample.c

clean:
rm -f *.o main_dynamic libhexdump_dynamic.so

In consola trebuie setata o variabila de mediu: export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
Pentru ca loader-ul (programul responsabil cu încărcarea programului în memorie) să știe unde să caute biblioteca partajată pentru a o încărca în memorie în cazul în care aceasta nu a fost încărcată deja.

23 februarie 2011

Fire de executie in Python

Un exemplu de program in Python care afiseaza (oarecum aleator) id-urile unor thread-uri aflate in executie:

import time
from threading import Thread
from threading import Lock

class MyThread(Thread):

def __init__(self,n):
Thread.__init__(self)
self.tid=n

def run(self):
a = 0
for i in range(100000):
a += 1
print self.tid
def test():
nt = 10
for i in range(nt):
thr1=MyThread(i)
thr1.start()
thr1.join()

test()


Elementele de sincronizare in Python sunt:

* Lock - se poate afla intr-una din doua stari:

- blocat: daca se apeleaza release() se trece in starea neblocat

  • - neblocat (este creat neblocat): daca se apeleaza acquire() se trece in starea blocat

    Exemplu: Acelasi program de mai sus, insa cu id-urile threadurilor afisate ordonat (se foloseste Lock pentru ca in momentul afisarii zona sa fie exclusiv a firului de executie si sa nu poata interfera un alt thread)
import time
from threading import Thread
from threading import Lock

# afisare in ordine folosind lock
class MyThread(Thread):

def __init__(self,n):
Thread.__init__(self)
self.tid=n

def run(self):
a = 0
lock.acquire()
for i in range(100000):
a += 1
print self.tid
lock.release()
def test():
nt = 10
for i in range(nt):
thr1=MyThread(i)
thr1.start()
thr1.join()

lock = Lock()
test()


* Mecanisme de comunicatie - evenimente si conditii

Evenimente: un thread semnalizeaza un eveniment - notify(), iar altul asteapta ca evenimentul sa se intample - wait().

In Python, un obiect de tip event are un flag intern, initial setat pe false. Acesta poate fi setat pe true cu functia set() si resetat folosind clear(). Pentru a verifica starea flag-ului, se apeleaza functia isSet().

Un alt thread poate folosi metoda wait([timeout]) pentru a astepta ca un eveniment sa se intample (ca flag-ul sa devina true): daca in momentul apelarii wait(), flag-ul este true, thread-ul apelant nu se blocheaza, dar daca este false se blocheaza pana la setarea eventului. De altfel, la un set(), toate thread-urile care asteptau event-ul cu wait() vor fi notificate (si eligibile deci pentru a rula).

O variabila de tip conditie (Condition) este asociata cu un obiect mutex Lock. Acesta poate fi transmis ca parametru atunci cand mai multe variabile condition partajeaza un lock sau poate fi creat implicit.

Metodele prezente sunt acquire() si release() care le apeleaza pe cele corespunzatoare lock-ului si mai exista functiile wait(), notify() si notifyAll(), apelabile doar daca s-a reusit obtinerea lock-ului:

  • - metoda wait() elibereaza lock-ul si se blocheaza in asteptarea unei notificari
  • - metoda notify() deblocheaza un singur thread aflat in asteptare
  • - metoda notifyAll() deblocheaza toate thread-urile care asteptau indeplinirea conditiei

! Apelurile notify() si notifyAll() nu elibereaza lock-ul, deci un thread nu va fi trezit imediat ci doar cand apeluri de mai sus au terminat de folosit lock-ul si l-au eliberat.


* Semafoarele - sunt obiecte de sincronizare similare Lock-urilor insa difera de acestea prin faptul ca salveaza numarul de operatii de deblocare efectuate asupra lor. Un semafor gestioneaza un contor intern care este decrementat de un apel acquire() si incrementat de apelul release().

Contorul nu poate ajunge la valori negative deci atunci cand este apelata functia acquire() si contorul este 0 thredul se blocheaza pana cand alt thread apeleaza release(). Atunci cand este creat un semafor contorul are valoarea 1.

Exemplu: Problema producator-consumator, cand 3 producatori, 1 consumator si buffer nelimitat.


import time

import random

from threading import Thread

import threading

sem1 = threading.Semaphore(value=3) # 3 prod

# cons nu are semafor


class Prod(Thread):

def __init__(self,buf,n):

Thread.__init__(self)

self.idt = n

self.buf = buf


def run(self):

while True:

global sem1

sem1.acquire()

self.buf.append(1)

print "Prod",self.idt, " produce; Buffer=", self.buf

time.sleep(random.random()*5)

sem1.release()


class Cons(Thread):


def __init__(self,buf,idt):

Thread.__init__(self)

self.idt = idt

self.buf = buf


def run(self):

while True:

if len(self.buf) > 0:

del self.buf[0]

print "Cons",self.idt, " consuma; Buffer=", self.buf

time.sleep(random.random()*5)


def test():

buf = []

p1 = Prod(buf,0)

p2 = Prod(buf,1)

p3 = Prod(buf,2)

c = Cons(buf,0)

p1.start()

p2.start()

p3.start()

c.start()

test()

21 februarie 2011

Exemple introductive in SQL (SQL*Plus)

* creare tabel
CREATE TABLE nume_tabel (nume_col1 tip, nume_col2 tip, ... )
tipurile pot fi: CHAR, VARCHAR2, NUMBER, DATE, etc

* descriere tabel - info despre coloane si tipul acestora
DESC nume_tabel

* introducere date
INSERT INTO nume_tabel VALUES (val1, val2, ... )
valorile trebuie sa fie conform coloanelor si tipurilor acestora.
- insertia in anumite coloane:
INSERT INTO nume_tabel(colx, coly) VALUES (x, y)

* vizualizare date din tabela
SELECT * FROM nume_tabel
SELECT colx, coly FROM nume_tabel WHERE [conditie]

* modificare date dintr-un tabel
UPDATE nume_tabel SET coloana=valoare WHERE [conditie] and [alta_conditie]

* stergeri
- a unor randuri
DELETE FROM nume_tabel WHERE [conditie]
- completa a tabelului
DROP nume_tabel

* variabile substituite: &var
Variabila se seteaza din consola cu o anumita valoare: DEFINE var=valoare;
ex_1:
DEFINE functie = 'CLERK';
SELECT * FROM emp WHERE job = '&functie';
ex_2:
DEFINE text = '* FROM emp';
SELECT &text;

* rularea de scripturi - se face in consola prin: @'C:\..cale script.\script.txt' [param_1] ... [paramk]

ex: Crearea unei tabele salarii ce are drept coloane nume si salariu. Scriptul va insera doua randuri in tabel: pt primul insert numele si salariul se introduc ca parametri din linia de comanda, pentru al doilea insert se va cere introducerea din tastatura a numelui si a salariului (acesta din urma fiind stelat ***)

insert into salarii(nume,salariu) values ('&1', &2);
accept name char prompt 'numele sefului:';
accept sal number prompt 'salariul sefului:' hide;
insert into salarii(nume,salariu) values('&name', &sal);
undefine name;
undefine sal;
select * from salarii;

ex. Script pt afisarea numelor angajatilor dintr-un tabel care au salariul anual>o valoare intro de la tst. Se selecteaza doar angajatii dintr-un anumit departament.

select ename || '**' || sal from emp where deptno=&1 and sal*12+nvl(comm,0)>=&2;

|| = operator de concatenare
&1 = primul parametru ce reprezinta departamentul dorit
&2 = al doilea parametru ce repr. limita minima a salariului anual
nvl(val1, val2) = inlocuieste val1 cu val2 in cazul in care val1 este NULL

16 februarie 2011

Exemple simple in Python

Sortarea unei liste

lista = [10,34,11,8]

ok = 0
while ok==0:
ok =1
for i in range(0,len(lista)-1):
if(lista[i] > lista[i+1]):
aux = lista[i] # a,b = b,a
lista[i] = lista[i+1]
lista[i+1] = aux
ok = 0
print lista


Al n-lea element din sirul Fibonacci

n = 7
a = 1
b = 1
c = 0

for i in range(0,n-2):
c = a+b
a = b
b = c

if n==1 or n==2:
print 1
else:
print c


Definirea unei clase Multime, si a unor operatii: reuniune, intersectie, diferenta

class Multime:

def __init__ (self, lista):
self.n = 0
self.val = []
for i in range(0, len(lista)):
self.addEl(lista[i])

def contains (self, x):
for i in range(0,self.n):
if(self.val[i]==x):
return 1
return 0

def addEl (self, x):
if(self.contains(x)==0):
self.n += 1
self.val.append(x)

def reunion (self,l2):
nou = Multime(self.val)
for i in range(0,l2.n):
nou.addEl(l2.val[i])
return nou.val

def intersection(self,l2):
nou = Multime([])
for i in range(0, l2.n):
if(self.contains(l2.val[i])==1):
nou.addEl(l2.val[i])
return nou.val

def diferenta(self, l2):
nou = Multime([])
for i in range(0, self.n):
if(l2.contains(self.val[i])==0):
nou.addEl(self.val[i])
return nou.val

m1 = Multime([1,2,3])
m2 = Multime([3,4,5,6])

print "m1 U m2 = ",m1.reunion(m2)
print "m1 ^ m2 = ",m1.intersection(m2)
print "m1 \ m2 = ",m1.diferenta(m2)

03 februarie 2011

Supraincalzirea laptopurilor

Simptomele ce le are un laptop ca urmare a supraincalzirii:

Laptopul incepe sa beepuie, imaginea de pe ecran ingheata, se restarteaza de unu singur sau se inchide dupa ce a fost pornit o perioada de timp, de obicei 15-20 de minutesau chiar si mai mult. Daca il pornesti apoi imediat reactioneaza la fel dupa cateva minute.

Care este cauza supraincalzirii?

Cauzele ce duca la supraincalzirea laptopului sunt praful, scamele, si mediul in care acesta este folosit.

Cea mai importanta parte a laptopului tau care trebuie sa fie curata este … radiatorul.

Pozitionarea radiatorului si a cooolerului

Pozitionarea radiatorului si a cooolerului. 1-radiator; 2-cooler;

Caldura este „cauza mortii” pentru cele mai multe laptopuri. Caldura nu cauzeaza doar contractarea si dilatarea unor componente (atunci cand se porneste si se opreste laptopul), ci poate atinge si nivele foarte ridicate ce iti pot face mai apoi laptopul sa cedeze sau sa se inchida daca cooler(ul)ele si radiatorul sunt infundate cu praf si scame.

Toate calculatoarele functioneaza aproape la fel ca un aspirator, trag aerul pe o parte si il scot afara pe cealalta parte. Din nefericire calculatoarele nu vin cu filtre pentru a aduna toate scamele si praful. Dupa cateva luni de folosire ventilatoarele si radiatorul sunt pline de praf si scame. Daca acestea nu sunt curatate performanta lor scade si se poate chiar sa scada spre zero cand radiatorul este blocat de praf si scame, complet.

Pentru calculatoarele de tip desktop, acest process este mai lent deoarece acolo exista foarte mult aer care circula in carcasa calculatorului, uneori chiar cu ventilatoare ce introduc si scot afara aerul din carcasa. De asemenea radioatorul si coolerul pentru processor (CPU) sunt mai mari si mai puternice. Exista cooler pentru sursa de alimentare, placa video, dar si pentru alte componente. Deci pentru un calculator procesul de raciere este asigurat de 3 pana la 6 coolere (ventilatoare). Diferenta intre sitemul de racire a unui laptop si sistemul de racire a unui calculator e aceea ca laptopul are doar unul, si uneori 2 coolere mici, care trebuie sa raceasca laptopul.

Radiator infundat-ceea ce produce supraincalzirea laptopului

Radiatorul infundat - este ceea ce produce supraincalzirea laptopului.

Iti voi sugera sa faci un mic experiment. Gaseste o lampa ce are un bec obisnuit de 100 W. Porneste-o pentru 5 minute si tine mana la aproximativ 2 centimetri distanta de ea (ai grija sa nu atingi becul pentru ca te poti frige). Simti ? Da aceea este caldura care este generata in noul si frumosul tau laptop, pe care ti l-ai luat, sau il ai deja.

Cum poti preveni/rezolva problema supraincalzirii?

Leacul pentru aceasta problema este destul de simplu, si usor de administrat. Cumpara un spray cu aer comprimat, si sufla praful si scamele de pe cooler si radiator. Acest „leac” trebuie administrat o data la cateva luni sau dupa 50-60 de zile de folosire a laptopului. Acest gen de spay-uri se gasesc cam la toate magazinele de calculatoare!

Perioada dupa care se face curatarea de praf a laptopului e diferita in functie de mediul in care acesta e folosit. Un mediu in care e mult praf, sau laptopul sta mai mult pe patura de exemplu, e nevoie ca operatiunea de curatare sa se faca mai des, sa zicem o data la 30 de zile. Daca laptopul e folosit intr-un mediu fara prea mult praf si sta pe un birou, are o aerisire buna, curatarea acestuia se poate face o data la 6 luni.

Aerul comprimat este destul de folositor si pentru tastatura laptopului, suflarea tuturor mizeriilor dintre taste.

Aceste operatiuni nu sunt un lucru foarte cunoscute dar sunt cele mai importante lucruri ce le poti face pentru a-ti intretine laptopul.

Ce sa faci daca laptopul este mai vechi iar acesta are probleme cu supraincalzirea?

Daca radiatorul este deja infundat curatarea cu aer nu va ajuta la rezolvarea problemei. Aerul comprimat nu este suficient pentru desfundarea radiatorului. Daca nu ai curatat nicioata sistemul de racire al laptopului si il folosesti de cel putin 1 an, sunt foarte mari sanse ca atat coolerul cat si radiatorul sa fie infundate de praf si scame si sa nu mai functioneze optim.

In acest caz solutia este sa scoti radiatorul, sa il cureti si apoi sa il pui la loc. Aceasta actiune este de preferat sa fie facuta intr-un service de calculatoare sau daca exista, un service de laptopuri. Este necesar ca aceasta curatare sa fie efectuata de un specialist deoarece e nevoie de ceva experienta si dexteritate. O alunecare gresita a surubelnitei poate sa iti „omoare” laptopul.

Unele laptopuri mai noi au un capac de plastic pe spate pentru a avea acces la sistemul de racire. Cele mai multe laptopuri insa nu au asa ceva, si este nevoie sa fie dezmembrate in totalitate pentru a accesa sistemul de racire (ex: Acer TravelMate 2480).

Accesare usoara a sitemului de racire, nu necesita demontarea completa. E suficient sa dam jos un capac de plastic.

Accesare usoara a sitemului de racire, nu necesita demontarea completa. E suficient sa dam jos un capac de plastic.

Curăţarea cooler-ului

Aceasta operatiune se poate face cu un spray pulverizator de aer, cu o pompiţă, chiar cu un aspirator, dar cu mare grijă şi de la distanţă! Praful se acumulează cu timpul în interiorul laptop-ului şi astfel împiedică aerisirea corectă a lui, reţinând căldura!

Cum veţi proceda:

1- Înainte de a începe, opriţi laptop-ul, deconectaţi-l de la sursa de curent şi scoateţi bateria! Apăsaţi de câteva ori pe butonul de oprire pentru a fi siguri că s-a scurs orice urmă de electricicate!

2- laptop-ul trebuie desfăcut pentru a ajunge la cooler! ATENŢIE: unele laptop-uri pot fi desfăcute, chiar dacă se află în perioada de garanţie, altele nu, deoarece se va ajunge la pierderea ei! Este bine să vă interesaţi înainte de a executa această operaţiune!

Inainte de a trece la desfacerea propriuzisa a laptopului descarcati-va electrostatic, pentru a nu afecta componentele sensibile. Cea mai simpla metoda ste aceea de a pune mana pe un obiect ce are impamantare, ca de exemplu un calorifer.

Daca te-ai hotarat sa iti desfaci tu laptopul iti sugerez sa cauti pe Google, Youtube, pe internet tutoriale ce arata cum se demonteaza modelul tau de laptop tau sau un model ce are o configuratie asemanatoare, pentru a stii cam ce urmeaza sa faci.

După ce l-aţi desfăcut, aveţi grijă să nu atingeţi componente din interior, nu doriţi să stricaţi ceva, plus că toată grăsimea de pe mâini va ajunge pe acele componente! Apoi începeţi curăţarea propriu-zisă, dar cu mare grijă! Dacă folosiţi un spray de aer, trebuie ţinut la o distanţă de cca 5 cm, o pompiţă poate fi ţinută mai aproape, iar cu aspiratorul nu recomand, decât în cazul când laptopul nu este desfăcut şi se face prin gura de evacuare a aerului şi de la o distanţă adecvată, precum si o turatie a aspiratorului cat mai mica!

3- Trebuie să căutaţi prin casă nişte beţişoare de urechi şi să înceraţi să ştergeţi cu grijă orice părticică de praf pe care o vedeţi! Apoi, dar pe riscul vostru, de la o distanţă calculată precis, scoateţi cu aspiratorul tot praful care ramâne după ce aţi executat primele manevre! Acesta manevra o recomand a se face la turatia cea mai mica a aspiratorului si de la o distanta de cel putin 5 cm. NU ATINGEŢI CU ASPIRATORUL COMPONENTELE EXPUSE VEDERII!

Accesarea sistemului de racire prin dezasamblarea intregii carcase

Accesarea sistemului de racire prin dezasamblarea intregii carcase

Pasta Termoconductoare

O alta problema este pasta termoconductoare ce se afla intre radiator si procesor (CPU). Aceasta are rolul de a uniformiza racirea pe suprafata procesorului, totodata ea find cea care face lipirea dintre procesor si radiator.

Daca laptopul a avut probleme cu supraincalzirea sunt foarte mari sanse ca aceasta pasta sa se fi solidificat, facand foarte grea scoaterea radiatorului de pe procesor.

Rezolvarea problemei privind supraincalzirea, e legata si de inlocuirea acestei paste termoconductoare dintre procesor si radiator.

Arctic Silver 5 (AS5)

Este o pasta termoconductoare, alcătuită din 99.9% argint pur! Poate reduce cu până la 10-12 grade Celsius temperatura, ceea ce este un record! Înainte de a-l cumpăra, asiguraţi-vă că aveţi acces direct la procesor pentru a efectua această manevră!

O pasta termoconductoare foarte buna pentru a fi folosita in a reduce temperatura la care ruleaza laptopul tau este cea care contine cat mai mult argint. Mai exista si alte tipuri si modele de pasta termoconductoare, cu densitati diferite, dar aceasta este cea pe care o recomand eu. Este putin cam scumpa, dar adevarul e ca nu o schimbi in fiecare zi, iar imbunatatirea ce o aduce este incomparabila.

Uite aici un filmulet care iti arata cum se schimba pasta termoconductoare:
Pentru a schimba pasta termoconductoare vei avea nevoie de:
-alcool izopropilic
-un tub cu pasta termoconductoare
- o bucata de plastic tare, care te va ajuta la intinderea pastei
Nota: Pasta termoconductoare se aplica pe suprafata procesorului ca o pelicula subtire, atentie sa NU lasati pasta in exces.

Piciorusele de sustinere a laptopului

O alta metoda foarte buna pentru a preveni supraincalzirea este aceea de a te asigura ca acele picioruse de cauciuc ce se afla la baza laptopului sunt intacte, si nu cumva lipsesc. Din nefericire acestea sunt doar lipite de plastic si au tendinta dupa o perioada de timp sa cada. Acestea se pot gasi pentru a se inlocui in majoritatea magazinelor de calculatoare sau service de calculator/laptop.

Nu in ultimul rand nu folosi laptopul pe suprafete moi, precum paturi, pe huse de pat, scaune cu nvelis pufos, mochete, etc. Daca vor fi folosite pe astfel de suprafete acestea vor bloca aerisirea coolerului iar laptpul se va supraincalzi. Daca nu tii laptopul pe birou, incearca sa folosesti ceva cu o suprafata tare sub laptop, ca de exemplu o bucata de carton, placaj, sau chiar o carte ceva mai mare, ori atlas.

Cooling Pad-ul

O alta metoda pentru a ajuta la ventilarea foarte buna a unui laptop este folosirea acelor suporturi cu ventilatoare ce se gasesc in comert, numite Cooling Pad.

Din moment supraincalzirea laptopurilor a devenit o problema foarte des intalnita, cateva firme ce produc accesori pentru laptopuri ofera suporturi pentru laptopuri dotate cu ventilatoare. Cele mai multe astfel de suporturi de laptop sunt alimentate prin portul USB, dar altele folosesc surse de alimentare separate, pentru a evita suprasolicitarea de energie electrica pentru laptop. Unele ofera si facilitatea de a beneficia de un hub USB sau cititoare de carduri, pentru a aduce un plus de functionalitate pe langa functia de racire.

Cooling-Pad

Cooling-Pad

Dupa experienta mea aceste sisteme de racire, sunt destul de bune, dar pentru a achizitiona unul foarte bun pentru laptopul tau trebuie sa fii atent la zonele unde are laptopul tau orificii de aerisire, pentru ca acestea sa coincida cu cele ale suportului tau. Trebuie sa mai acorzi atentie si zgomotului pe care il pt produce aceste suporturi datorita coolerelor pe care le contin. Unele sunt silentioase, altele snt mai zgomotoase.

Un astfel de suport de racire FOARTE IEFTIN pe care l-am folosit si este destul de bun, conform si datelor pe care le-am auzit ca le-au obtinut si altii, este folosirea unui biblioraft. Biblioraftul e un fel de dosar mai mare folosit pentru indosarierea diverselor foi, dosare, etc. Il veti gasi in orice librarie.

E nevoie sa alegi unul ce are cartonul mai gros, si apoi sa vezi unde are orificiile de aerisire laptopul tau, si apoi sa gauresti biblioraftul, astfel incat orificiile facute in acesta sa coincida cu cele ale laptoplui.

Biblioraft

Biblioraft

Uneori ce este mai ieftin este si mai bun. In comparatie cu suporturile de racire (cooling-Pad-urile) aceste bibliorafturi au un avantaj, poti sa le faci orificiile de aerisire acolo unde trebuie, pe cand acele suporturi sunt mai greu de modificat, pentru a le face in conformitate cu laptopul tau.

In alta ordine de idei caldura este cel mai mare inamic al tuturor laptopurilor. Prin mentinerea capaciatii de racire a unui laptop, ii vei creste, chiar dubla durata de viata a acestuia.

Ignorarea problemei supraincalzirii laptopului tau, poate duce la aparitia altor probleme mai grave, precum arderea procesorului sau a placii de baza, deformarea carcasei, etc.

Unul din programele care te poate ajuta sa vezi care este temperatura la care ruleaza laptopul tau este SpeedFan.

Pe Google gasiti si alte programe, dar eu consider ca acesta este destul de bun pentru utilizatorul obisnuit care vrea doar sa verifice care e temperatura laptopului sau. Acest program are o interfata simpla, usor de inteles, si iti ofera informatii despre temperatura la care opereaza procesorul tau, hard-diskul, si temperatura generala a laptopului tau.


sursa AICI