Programiranje

Prvi utisci...

Telefon sam kupio pre nekoliko dana i mogu da kažem samo dobre stvari o njemu... NOT! xD Ima mnogo mana:

1. Na zaštitnoj foliji ekrana piše NOKIA Nseries, tako da ste primorani da je odlepite odmah pri paljenju telefona.

2. Plastika na tasterima je sjajna, ekran ogroman pa se telefon vrlo brzo prekrije otiscima prstiju.

3. Tasteri 1, 2 i 3 su teško dostupni zbog toga što su previše blizu ekrana.

4. Kontrolni tasteri za muziku se nalaze sa prednje strane telefona, i iznad ekrana kada se telefon slajduje na dole. Pa se postavlja pitanje, čemu to!?

5. Nema tastera olovkica (kao kod 6630 na primer)!!! Pa je editovanje teksta totalno glupo i nezgodno. 

6. Navi Wheel (centralni kontrolni taster D-Pad) ne radi ono za šta je bio namenjen, a to je skrolovanje osetljivo na dodir. To su skinuli jer je kočilo telefon... Pa je upotreba internet browsera malo otežana.

7. Skoro svako koga znam ima jedan bad pixel na telefonu, ali nije toliko strašno, vidi se samo kad je ekran totalno crn, inače, vrlo brzo naučite da živite sa tim.

8. Podešavanja koja dolaze sa telefonom kada se otpakuje su TOTALNO GLUPA!!! Pa se većina ljudi razočara u fon i slično...

9. Nokia Maps previše koristi A-GPS i time vam jede kredit (pravi račun).

10. Postoje 3D Ringtones, ali ne mogu da se koriste.

11. Postoje Video Ringtones, ali ne mogu da se koriste.

12. Baterija traje manje od jednog dana... mada ovo možda i nije mana jer ga ja akam svaki čas.

13. Snimanje videa nema AUTO FOKUS, što je pokazatelj APSOLUTNOG debilizma ljudi iz Nokije. Inače, nije neka mana, ali zasmeta kad nešto približite kameri, pa se slika zamuti.

14. Ako isključite Warning Tones, ne čuje se zvuk pri slikanju kamerom i paljenju telefona. Ali ako ga ostavite, nervirace vas zvuk PiiiiiP pri svakom obaveštenju.

15. Mala mana je i to što dolazi sa nekim relativno meni glupim mp3 pesmama i nekoliko stotina megabajta bezvrednih video snimaka.

16. Igrice se skupo plaćaju!!! 

 

Ali, nisam ga vratio... još je kod mene i pored svih onih mana i manica... Zašto? Zato što:

1. Mnogo dobro izgleda!!!

2. Ima savršen prikaz boja, jasnoću zvuka, brz odziv...

3. Ima nekoliko načina pristupa GPS servisu: Integrisani GPS, Assisted GPS, Bluetooth GPS i Network GPS!!! Garmin na njemu radi kao sat!!!

4. Ima 16GB memorije koja može da se koristi kao eksterni plug and play HDD! Takođe, poseduje i dodatni port za MicroSD karticu (ako je nekome 16GB malo)!

5. Ima TV-OUT koji radi bez greške! Na LCD je slika kristalna...

6. Ima jake stereo zvučnike, kvalitetne slušalice i punjač za auto.

7. Ima procesor koji hardverski dekoduje video zapise, pa nema nikakvog seckanja pri puštanju filmova. Takođe procesor je 32-bitni sa podrškom za Java Byte Code, što znači da se Java aplikacije (midleti) izvršavaju neverovatno brzo!

8.  Multimedijalna aplikacija je perfektna... Ne kočni ni sa preko 1000 pesama.

9. Ima odličnu zaštitu od virusa, mogućnost blokiranja bluetooth uređaja i još mnoge druge sigurnosne novotarije.

10. Podržava naš jezik u potpunosti, pa postoji predviđanje reči i za srpski. Meni je ovo do jaja. xD Kao i pisanje naših UNICODE slova.

11. Uz njega dobijete jedan film, ja sam dobio Transformers i prosto sam se oduševio kvalitetom slike i zvuka!!! Takođe, player podržava titlove.

12. GPRS i wireless internet rade savršeno! Bez zastoja, bez nervoze, sve je pregledno i jasno! YouTube radi ko na PC... 

13. Wireless skener radi odlično.  

14. Poseduje nGage mod, ako igrate nGage igrice koje morate da kupite... al dobijete jednu uz telefon za dž.

15. Ima prekidač za zaključavanje, što je veoma praktična stvarčica.

16. Glasovne komande su predefinisane i sve što hoćete možete da otvorite vrlo jednostavno i brzo dok ste u kolima!

E sad, neko bi rekao da je N95 bolji telefon. Imao sam priliku da vidim kvalitet plastike na N95 i N95 8gb i mogu da kažem da N96 nema prefarbanu plastiku, pa vam se neće desiti da se tasteri izližu i postanu providni. ;)

Tako da sve u svemu, ovaj telefon mi se i pored dosta mana, dosta svideo. Ima on svoj šarm. xD

 


Devojčin broj brusa u C++

Za određivanje broja brusa kod devojke potrebno je izmeriti njen obim ispod grudi i preko grudi tamo gde su najšire. Te mere uneti u program i kao rezultat ćete dobiti broj brusa koji Vaša devojka nosi.

KOD PROGRAMA (C++):


#include <iostream>
using namespace std;

void main()
{
 double x=.0,y=.0,k=.0;

 cout << "Obim ispod grudi: ";
 cin >> x;

 cout << "Obim grudi: ";
 cin >> y;

 k =((x += (int(x)%2 == 0?10:12.5)), y-x);
 
 cout << "Broj brusa = " << x << " " 
  << (k>=0 && k <2.5?"AA":(k>=2.5 && k <5?"A"
  :(k>=5 && k <7.5?"B"
  :(k>=7.5 && k <10?"C"
  :(k>=10 && k <12.5?"D":"E jebiga...")))))
  << endl;
}


 

ALGORITAM PROGRAMA:


Da bi saznali koja je veličina brusa vaše ribe morate da imate krojački santimetar i da izmerite obim ribe odmah ispod grudi. Dobicete meru X. Ukoliko je ta mera paran broj, na nju dodate 10cm, a ako je neparan dodate 12.5cm. To je veličina grudnjaka (brusa).

Zatim, potrebno je santimetrom izmeriti obim grudi (golih xD) tamo gde su najšire. Dakle, uzeti najveću meru obima grudi. Tako dobijete meru Y. E sad je potrebno odrediti veličinu korpe brusa kao razliku Y i X. Obeležimo tu razliku sa K, pa određujemo K=Y-X

U zavisnosti od vrednosti parametra K određujemo veličinu korpe:


K = 0: korpa AA

K ~ 2.5: korpa A

K ~ 5: korpa B

K ~ 7.5: korpa C

K ~ 10: korpa D


~ približno jednako

Kad odredimo broj korpe, zapisujemo BROJ BRUSA u formatu:

VELIČINA_BRUSA KORPA


Primer 1:
Stanislava ima X = 70cm, a Y = 85cm. Koji je broj njenog brusa?

Rešenje:

X je paran broj => X = 70 + 10

X = 80

Računamo K=85-80=5cm

Dobijemo da je veličina korpe = B

Pa je broj brusa = 80 B


 


Stringovi

Ako ste do sada intenzivnije koristili C i C++ sigurno znate kako da baratate stringovima. Međutim, način rada sa stringovima u Windowsu je malo drugačiji, jer u njemu postoji podrška za UNICODE karaktere. UNICODE predstavlja standard kodovanja teksta u 2 bajta memorije. On za razliku od ASCII sadrži većinu svetskih pisama, raznih simbola i slično. Zahvaljujući njemu, u Windowsu možemo da napravimo folder sa imenom "ћирлирца". Funkcije koje prihvataju parametre u UNICODE formatu su obeležene sa W (wide char), a one koje koriste standardni ANSI format sa A. 

Za čuvanje podatka koji se posmatra kao ANSI string koristi se običan jednobajtni pokazivač char*, a za UNICODE string potrebno je koristiti poseban tip wchar_t koji predstavlja dvobajtni pokazivač (nešto kao short*). 

Na osnovu ovoga Windows API definiše posebne tipove za rad sa stringovima:

LPSTR =  char*
LPCSTR = const char*
LPWSTR = wchar_t*
LPCWSTR = const wchar_t* 

Ukoliko želite da Vaš kod ima maksimalnu portabilnost, koristite makroe LPTSTR i LPCTSTR. Onda u zavisnosti od toga da li ste definisali simbol  "_UNICODE" stvarni tip promenljive će biti char* ili wchar_t

LPTSTR = char* ili wchar_t* (zavisi od _UNICODE)
LPCTSTR = const char* ili const wchar_t* (zavisi od _UNICODE)

Ako želite da pozovete funkciju koja zahteva UNICODE argument i taj argument joj prenosite direktno u kodu, onda ga morate konvertovati u UNICODE. To radite jednostavnim pozivom makroa L. Na primer:

FunkcijaKojaZahtevaUnicodeTekst(L"Neki UNICODE tekst");

To be continued...


Prozori u Windowsu

U Windows operativnom sistemu prozor predstavlja interfejs za komunikaciju korisnika i procesa kom taj prozor pripada. Jedan proces može imati više prozora. Svaki prozor ima svoj jedinstveni identifikator koji se naziva HANDLE. Srpski prevod HANDLE-a bi bio ručka. Na ETF izvesni LK koristi taj termin... meni se koža ježi od toga, tako da ću ovde koristiti originalni anglosaksonski naziv.

Ukoliko znamo handle nekog prozora, sa tim prozorom možemo softverski raditi bilo šta što hardverski može onaj ko je za računarom, iako taj prozor ne pripada procesu koji se trenutno izvršava ili je sakriven, minimiziran u taskbar ili tray. Windows SDK sadrži jednu funkciju koja obilazi sve prozore koji trenutno postoje, poziva funkciju koju joj mi zadamo i prosleđuje joj handle od svakog prozora koji nađe. Funkcija se zove EnumWindows:

BOOL EnumWindows(WNDENUMPROC Funkcija,  LPARAM Parametri)

Prvi argument je dakle adresa funkcije koju pišemo mi, a koju će EnumWindows() da pozove za svaki prozor. Drugi argument služi za prenos parametara, u ovom članku koji je za početnike, on nije bitan. 

Ovom funkcijom možemo da obiđemo sve prozore koji postoje, da pronađemo prozor sa željenim naslovom (na primer) i da ga pomeramo po ekranu (na primer). Prvo, napravimo novi C++ prazan Console projekat u Visual Studio (ili bilo gde drugde) koji će nam ispisati imena svih prozora koji trenutno postoje. Dodamo novi C modul, napišemo osnovni kostur jednog C programa, uključimo windows.h kako bi mogli da koristimo Windows SDK funkcije. I kad pozovemo EnumWindows, naš kod izgleda ovako:

#include <stdio.h>
#include <windows.h>

main()
{
  EnumWindows(Funkcija, NULL);
}


Sada je potrebno napisati Funkciju kojoj će EnumWindows pozivati svaki put kad pronađe novi prozor. Deklaracija te funkcije je standardna i završena izgleda ovako:

BOOL __stdcall Funkcija(HWND prozor, LPARAM param)
{
 char naziv[1024];  
 
 GetWindowTextA(prozor, naziv, sizeof(naziv));

 printf("%sn", naziv);
 
 return TRUE;
}


Prvo smo definisali promenljivu u koju ćemo smestiti naziv prozora pomoću funkcije GetWindowTextA(). Ovo A na kraju naziva funkcije znači da se tekstualni parametri funkcije posmatraju kao ANSI standardni tekst (u odnosu na GetWindowTextW() koji ih posmatra kao UNICODE). Moguće je koristiti i GetWindowText() što je u stvari makro koji u kod na mesto poziva ugrađuje A ili W verziju funkcije u zavisnosti od podešavanja kompajlera (da li da kompajlira karaktere kao UNICODE ili kao ANSI).

Poziv GetWindowTextA() sadrži handle prozora koji nam je pronašla funkcija EnumWindows(), zatim adresu bafera u koji treba da smesti karaktere koji predstavljaju naziv (naslov) prozora, i koliko tih karaktera najviše može da smesti u bafer. 

Sledeće što treba da uradimo jeste da ispišemo naziv na ekranu. Dobijeni prikaz može izgledati ovako:

Connections Tray
MediaCenter

ActiveMovie Window

NVSVCPMMWindowClass

GDI+ Window


MCI command handling window



GDI+ Window
SysFader
GDI+ Window




Program Manager
Press any key to continue . . .

 

Svaki prazan red predstavlja prozor bez imena. Na to trenutno nećemo obraćati posebnu pažnju, ali vrlo je jednostavno ispisati samo one koji imaju naziv:

if(naziv[0]) printf("%sn", naziv); 

Da bi našli neki poseban prozor, konkretno u ovom primeru Notepad, potrebno je da malo izmenimo Funkciju:

BOOL __stdcall Funkcija(HWND prozor, LPARAM param) 
{
 char naziv[1024];  
 
 GetWindowTextA(prozor, naziv, sizeof(naziv)); 

 if(strstr(naziv, "Notepad")) 
 { 
  MoveWindow(prozor, 0,0,100,100,TRUE);
 }
 
 return TRUE;
}

Ovde koristimo standardnu bibliotečku funkciju strstr() koja proverava da li je zadati drugi parametar, podstring prvog parametra. I ako jeste, sa MoveWindow() pomeramo taj prozor na koordinate (0,0) i postavljamo mu veličinu na (100x100).

Otvorite nekoliko notepad-a i pokrenite ovaj program. Svi notepadi će se skloniti u gornji ćošak ekrana i smanjiće se na 100x100 piksela.

Naravno, sledeći notepad koji otvorite neće mrdnuti, jer je naš program prestao sa radom. Ukoliko bi želeli nekoga da iznerviramo i da mu svaki notepad koji otvori sklonimo u ćošak, moramo da obezbedimo da naš proces stalno poziva EnumWindows():

main()
{
 while(1)
 {
  EnumWindows(Funkcija, NULL);
  Sleep(100);
 }
}

Ova beskonačna petlja će na svakih 100 milisekundi pozivati EnumWindows(). Funkcija Sleep uspavljuje pozivajući proces na određeno vreme, kako bi drugi procesi mogli da koriste procesor. Da nema ovoga, Windows bi se zablokirao ili usporio na jednoprocesorskim računarima.

Ako sad pokrenete program, pa onda neki notepad, on će automatski da se pomeri u desni gornji ćošak i da se smanji na 100x100 piksela. Ukoliko pokušate da mu razvučete neku ivicu i time ga proširite nećete uspeti, jer će naš program na svakih 100ms sve prozore koji u svom imenu sadrže Notepad, da pošalje u desni ugao ekrana.

Naravno, primećujete da je prozor konzole stalno otvoren. Ako bi nekoga želeli da nervirate ovim, konzola bi predstavljala veliko dugme STOP, koje ne želite da imate. Potrebno je ga sakrijemo. Prvo funkcijom GetConsoleTitleA() nađemo naziv prozora konzole, zatim da nađemo handle prozora sa tim nazivom sa FindWindowA() i da sa ShowWindow() prikažemo prozor konzole sa uključenim flegom SW_HIDE. Onda će naša main funkcija izgledati ovako:

main()
{
  HWND konzola;  
  char naziv[1024];
 
  GetConsoleTitleA(naziv, 1024);
  konzola=FindWindowA(NULL, naziv);
  ShowWindow(konzola,SW_HIDE);
 
 while(1)
 {
  EnumWindows((WNDENUMPROC)Funkcija, NULL);
  Sleep(100);
 }
}

Konzola predstavlja handle prozora koji vraća funkcija FindWindowA(). HWND je tip za handle. Ponovo, svaka funkcija u Windows SDK koja koristi stringovne (tekstualne) parametre ima dve verzije, jednu sa W na kraju i jednu sa A i makro sa čistim imenom funkcije. Ovde i svugde koristimo A jer su nam nazivi prozora u ANSI formatu.

Ako sad pokrenete program (poželjno je u Debug modu), konzola če se sakriti i program će beskonačno da pomera sve prozore koji u nazivu imaju Notepad. Da bi ga ugasili, stopirajte Debug. Ili ako ste ga samo pokrenuli, otvorite task manager i ugasite proces programa.

Ako ste malo kreativni, možete napraviti svoje animacije prozora, posebne izglede, možete hronološki čuvati sadržaj otvorenih prozora (kao neki špijunski program), itd... i to sve počevši od ovoga.

Primeri za neke kreativnije poduhvate, biće okačeni na ovom blogu, so stay tuned! xD

 

Ceo kod programa: 

 (Dalje)


Moj Blog xD

Evo napravih i ja taj blog... nije loše moram da priznam. xD