nedjelja, 6. rujna 2009.

Delphi - Smeštanje podešavanja programa u .ini fajl (I deo)


Ukoliko je potrebno da vaša aplikacija poseduje podešavanja koja treba pamtiti i nakon zatvaranja programa, onda imate na raspolaganju više mogućnosti, a najpoznatije su korišćenje Registry baze ili kreiranje .INI fajla. Obični tekstualni INI fajl predstavlja sigurno jednostavniju soluciju u slučaju da nemate mnogo ovih podataka. INI fajlovi predstavljaju format fajlova zasnovan na običnom plain tekstu, a služe za smeštanje aplikacionih konfiguracionih podataka u formatu koji se lako preuređuje, i čitljiv je svim jednostavnim parserima.

Većini ljudi koji koriste Windows, sigurno je poznat bar jedan .INI fajl, a najpoznatiji su svakako sistemski fajlovi WIN.INI i System.INI (nalaze se unutar Windows foldera). Čak i Windows smešta važne informacije kao što su konfiguracioni podaci o samom operativnom sistemu u običnom plain tekst fajlu, koji se lako briše, modifikuje i pregleda. Čak iako u 32-bitnim verzijama Windows-a Microsoft preporučuje korišćenje Registry-ja za smeštanje specifičnih podataka o konfiguraciji aplikacije, u mnogim slučajevima naći ćete da je korišćenje .INI fajla mnogo brže i sigurnije.

Jedna od jednostavnih upotreba INI fajlova kao mehanizma za čuvanje statusnih podataka, jeste za čuvanje informacija o veličini i lokaciji formi ukoliko želite da se forme nakon ponovnog pokretanja programa nalaze na mestu gde su se nalazile prilikom zatvaranja programa. Generalno govoreći, sve što inače smeštate u Registry možete smestiti u INI fajl.

Inicijalizacioni ili konfiguracioni fajl (.INI) je tekst fajl sa limitom veličine od 64Kb, koji je podeljen u sekcije, od kojih svaka može da nema nijedan ili ima više ključeva. Primer:


[Naziv_Sekcije]
Naziv_kljuca=vrednost
;komentar
Naziv_kljuca=vrednost
...



Nazivi sekcija se smeštaju u uglaste zagrade i moraju početi od nulte kolone svake linije. Nazivi sekcija i ključeva su neosetljivi na upotrebu malih/velikih slova i ne mogu sadržavati prazne karaktere. Nazivi ključeva praćeni su znakom jednako ("="), i opciono su okruženi praznim karakterima, koji se inače ignorišu. Ukoliko se recimo ista sekcija pojavi dva puta (ili više) u istom fajlu, ili se isti ključ pojavi više od jedanput u istoj sekciji, tada poslednje pojavljivanje ima prednost. Ključ može da sadrži string, intedžer ili bulovu vrednost.

Zanimljivo je da i sam Delphi koristi INI fajl format za mnoge potrebe. Na primer, .DSK fajlovi (desktop podešavanja) imaju format kao upravo opisan.

Delphi - Smeštanje podešavanja programa u .ini fajl (II deo)


Delphi obezbeđuje TIniFile klasu sa metodama koje su dizajnirane za potrebe čuvanja i iščitavanja informacija specifičnih za određeni program i podešavanja, unutar INI fajlova. Klasa TIniFile deklarisana je unutar unit-a inifiles.pas. Pre nego što počnemo rad sa TIniFile kontrolom potrebno je da kreiramo instancu klase:
uses inifiles;
...
var
IniFile : TIniFile;
begin
IniFile := TIniFile.Create('mojprogram.ini');



Ovaj programski kod kreira IniFile objekt i dodeljuje "mojprogram.ini" jedinoj osobini klase - FileName osobini - koja se koristi za određivanje naziva INI fajla koji ćete koristiti. Ako deklarišete INI fajl na ovaj način, onda će se on smestiti u \Windows folder. Bolje rešenje za čuvanje aplikacionih podataka je da INI fajl smestite u aplikacioni folder - zato kod metode Create odredite punu putanju i naziv INI fajla:
IniFile := TIniFile.Create(ChangeFileExt(
Application.ExeName,'.ini'));



Klasa TIniFile poseduje nekoliko metoda za "čitanje". Metoda ReadString čita string vrednosti iz ključeva, metode ReadInteger, ReadFloat i slične, koriste se za čitanje brojčanih podataka iz ključeva. Sve metode za čitanje imaju podrazumevane vrednosti koje će se koristiti ukoliko ne postoje ulazni podaci. Na primer, metoda ReadString se deklariše kao:
function ReadString
(const Section, Ident, Default: String):
String; override;



Klasa TIniFile za svaku metodu "čitanja" ima odgovarajuću metodu "upisa". Drugim rečima, to su metode WriteString, WriteBool, WriteInteger, itd. Na primer, ukoliko želite da program "zapamti" naziv poslednjeg korisnika, i sve potrebne koordinate forme, oformićemo sekciju nazvanu "Poslednji", sa ključnim rečima "Korisnik" i "Datum"; i drugu sekciju zvanu "Polozaj" sa ključevima "Top", "Left", "Width" i "Height". Ovde treba reći da ključ nazvan "Korisnik" sadrži string vrednost, "Date" koja sadrži TDateTime vrednost, a svi ključevi u sekciji "Polozaj" sadrže intedžer vrednosti.

Događaj OnCreate glavne forme je perfektno mesto za smeštaj programskog koda potrebnog za pristup vrednostima u inicijalizacionom fajlu aplikacije:
procedure TForm1.FormCreate(Sender: TObject);
var
IniFile : TIniFile;
PosKorisnik : string;
PosDatum : TDateTime;
begin
IniFile := TIniFile.Create
(ChangeFileExt(Application.ExeName,'ini'));

//ako nema posl. korisnika - prazan string
PosKorisnik :=
IniFile.ReadString('Poslednji','Korisnik','');
//ukoliko nema korisnika sa datumom,
vraca se danasnji
PosDatum :=
IniFile.ReadDate('Poslednji', 'Datum', Date);

//prikaz poruke
ShowMessage('Ovaj program je prethodno koristio '
+ PosKorisnik + ' dana '
+ DateToStr(PosDatum));

Form1.Top :=
IniFile.ReadInteger
('Polozaj,'Top', Form1.Top);
Form1.Left :=
IniFile.ReadInteger
('Polozaj','Left', Form1.Left);
Form1.Width :=
IniFile.ReadInteger
('Polozaj','Width', Form1.Width);
Form1.Height :=
IniFile.ReadInteger
('Polozaj','Height', Form1.Height);

IniFile.Free;
end;

Delphi - Smeštanje podešavanja programa u .ini fajl (III deo)


Nakon što smo se upoznali kako se čitaju ključevi iz INI fajlova, objasnićemo i kako se vrši upis podataka u INI fajlove. Najidealnije mesto za snimanje informacija o programu je na zatvaranju programa, tj. unutar događaja OnClose glavne forme. Pre nego što se aplikacija prekine, zapisaćemo trenutnu poziciju prozora i informaciju o poslednjem korisniku:
procedure TForm1.FormClose
(Sender: TObject; var Action: TCloseAction);
var
IniFile : TIniFile;
begin
IniFile := TIniFile.Create
(ChangeFileExt(Application.ExeName,'ini'));

IniFile.WriteString
('Poslednji', 'Korisnik', 'Taj_i_Taj');
IniFile.WriteDate
('Poslednji', 'Datum', Date);

With IniFile, Form1 do
begin
WriteInteger('Polozaj','Top', Top);
WriteInteger('Polozaj','Left', Left);
WriteInteger('Polozaj','Width', Width);
WriteInteger('Polozaj','Height', Height);
end;

IniFile.Free;
end;



Postoji nekoliko metoda koje služe za operaciju sa celim sekcijama unutar INI fajlova. Na primer metoda EraseSection služi za brisanje cele jedne sekcije unutar INI fajla. Metode ReadSection i ReadSections popunjavaju objekat TStringList sa nazivima svih sekcija (i nazivima ključeva) u INI fajlu. Da napomenemo i to da slična klasa postoji i u registry unit-u - klasa TRegIniFile - klasa koja omogućava laki pristup sistemskoj registracionoj bazi i bez potrebe za poznavanjem strukture samog Registry-ja. Klasa TRegIniFile koristi sličan funkcionalni pristup Registry bazi, otprilike kako to radi i TIniFile za pristup INI fajlu.

Klasa TIniFile koristi Windows API interfejs, koji nameće limit od 64KB po INI fajlu. Ukoliko vam je potrebno da sačuvate više od 64KB podataka, trebalo bi da koristite klasu TMemIniFile, koja nema ovakav limit. Još jedan problem koji može da iskrsne je ako imate sekcije koje sadrže vrednosti u količini većoj od 8 kilobajta. Metod ReadSection koristi API funkciju GetPrivateProfileString sa baferom od 8 kilobajta. Jedan od načina da rešite problem jeste da napišete sopstvenu verziju ReadSection metode. Činjenica da svako može da pristupi i modifikuje INI fajlove govori da integritet podataka unutar INI fajlova ne može biti garantovan. Ipak, možda je za utehu i to što se i baza Registry takođe može modifikovati, pa zato nema velike prednosti u ovom pogledu.

JavaScript - Korišćenje ActiveX kontrola


U ovom prilogu ćemo vam prikazati kako da kreirate ActiveX kontrolu koristeći JavaScript, i to preko primera koji će poslužiti za detekciju ActiveX za Flash animacije. Ova tehnika može vam kasnije poslužiti i za detekciju drugih kontrola i za kreiranje i korišćenje ActiveX kontrola. Treba reći i to da pošto se radi o ActiveX-u, predstavljeni programski kod i informacije važe samo za Internet Explorer i to u Windows operativnom sistemu.

Inače, mnogo je lakše izvršiti detekciju ActiveX ili recimo Adobe Acrobat-a sa VBScript-om, ali kako to uraditi uz pomoć JavaScript-a te ga tako uklopiti u ostali kod na stranici. JavaScript je sigurno sposoban da uradi sve ono što i VBScript, ali to možda nije šire poznato. Tipični VBScript za detekciju podrške Flash-a mogao bi da izgleda ovako:




U JavaScript-u ekvivalent funkcije VB CreateObject je ActiveXObject:
var xObj = new ActiveXObject
("ShockwaveFlash.ShockwaveFlash");



Ako želite da odredite i verziju, onda dodajte podatak o verziji nazivu kontrole:
var xObj = new ActiveXObject
("ShockwaveFlash.ShockwaveFlash.5");



Da biste proverili da li je ActiveX kontrola kreirana, treba samo uporediti vraćenu vrednost sa vrednošću Null:
if (xObj==null)
flashinstalled = false;
else
flashinstalled = true;



Pošto sve može da krene kako ne treba (po Marfiju), kada kreirate kontrole, biće potrebno da zaštitite stranice od generisanja skript grešaka. U VBScript-u iskaz on error pobrinuće se za sve. U JavaScript-u trebalo bi da koristite try/catch iskaz:
try
{
var xObj = new ActiveXObject
("ShockwaveFlash.ShockwaveFlash");
if (xObj==null)
flashinstalled = false;
else
flashinstalled = true;
}
catch (e)
{
flashinstalled = false;
}



Ukoliko se unutar try bloka desi bilo kakva greška, skript će momentalno preći na izvršenje naredbi u bloku catch.

Sve ovo će fino raditi u Internet Explorer-u, ali naravno ništa od ovoga nije podržano od strane Netscape Navigator-a. Zato ćete možda pomisliti da sve što je potrebno da uradite jeste da proverite browser i izvršite gornji programski kod ukoliko korisnik poseduje IE. Na nesreću, čak i ako Netscape ne izvršava gornje naredbe, on i dalje proverava sintaksu i sigurno će se "zakačiti" za try/catch iskaz. Da biste ovo zaobišli, smestite vaš kod unutar stringa i izvršite ga korišćenjem funkcije eval:
if(IE4plus && !isMac)
eval ('try {var xObj = new ActiveXObject
("ShockwaveFlash.ShockwaveFlash");
if (xObj) flashinstalled = true; xObj = null; }
catch (e) {}');

SQL - Upotreba alijasa


Podrška za dodeljivanje SQL alijasa (lat. alias) postoji gotovo kod svih sistema za upravljanje bazama podataka (SUBP), a ova osobina služi za dodelu alternativnog naziva poljima (atributima) i tabelama baza podataka. Takođe, alijase, kod nekih SUBP možete dodeliti i izvornim tabelama ili upitima kada se ista tabela ili upit koriste više puta unutar jednog upita (npr. kod rekurzivnih upita). Tako će na primer, Microsoft Access kada u određenom upitu koristite tabelu ili upit, izvršiti automatsku dodelu alijasa korišćenim tabelama ili upitima.

Sintaksa za dodelu alijasa polju u tabeli je sledeća:
SELECT polje AS alijas_polja
FROM naziv_tabele;



Za ilustraciju ovog i narednih primera, koristićemo podatke iz tabele koja je prikazana na slici. Primer dodeljivanja SQL alijasa nazivima polja (kolona) bio bi sledeći:
SELECT Prezime AS porodica, Adresa AS m_stana
FROM KUPAC;



Rezultat ovakvog upita bio bi:
porodica m_stana
------------------------------
Peric Beograd
Milic Nis
Petrovic Beograd
------------------------------



Primer davanja alijasa postojećim tabelama je vrlo sličan davanju alijasa poljima tabele, a može da izgleda npr. ovako:
SELECT Prezime, Ime
FROM Kupac AS Osoba;



Kao rezultat dobili bismo izlaznu tabelu [Osoba] sa sledećim izgledom:
table Osoba
------------------------------
Prezime Ime
------------------------------
Peric Ana
Milic Una
Petrovic Aca
------------------------------

subota, 5. rujna 2009.

VBScript - Matematičke funkcije


Kao i svaki programski, skript jezik, i VBScript poseduje poseban odeljak matematičkih funkcija, koje služe za operisanje sa brojevima u okviru VBS skriptova. Navešćemo vam i sve matematičke funkcije koje će vam sigurno zatrebati u svakodnevnom skriptovanju:
Abs - Funkcija Abs prihvata kao parametar broj, i kao rezultat vraća apsolutnu vrednost. Apsolutna vrednost broja je numerička vrednost broja bez odgovarajućeg predznaka (+/-). Ako kao argument pošaljemo -7, vratiće nam se samo 7.

Array - Funkcija Array vraća variant tip vrednosti koja sadrži niz. Sam niz može biti sastavljen od bilo kog podtipa podataka. Ova funkcija, kao parametar, preuzima listu vrednosti odvojenih zarezom.

Atn - Funkcija Atn kao rezultat vraća arkustangens prosleđenog broja, trigonometrijsku funkciju koja se koristi za određivanje uglova unutar trougla. Ova funkcija je inverzna funkciji tangens (Tan), koja računa odnos strana u pravouglom trouglu. I ova kao argument prihvata broj.

Exp - Funkcija Exp prihvata numerički argument i vraća e (osnova prirodnog logaritma) uvećano stepenom.

Hex - Funkcija Hex vraća string vrednost koja sadrži vrednost argumenta konvertovanog u heksadecimalni sistem. Ukoliko je argument razlomak, njegova vrednost će se zaokružiti na najbliži ceo broj pre nego što funkcija vrati string. Uvek pazite da ova funkcija vraća string. Ukoliko želite da izvedete matematičke operacije sa vraćenom vrednošću funkcije, moraćete prvo da konvertujete string nazad u numeričku vrednost. Heksadecimalni brojevi se u VBScript-u predstavljaju korišćenjem prefiksa &H.

Int - Funkcija Int vraća celobrojni deo argumenta. Ukoliko je argument negativna vrednost, ova funkcija će vratiti prvu integer vrednost, koja je manja ili jednaka argumentu.

Fix - Funkcija Fix radi slično kao i funkcija Int, pa vraća celobrojni deo argumenta. Razlika je u tome što ako je argument negativan, funkcija Fix vraća prvu integer vrednost koja je veća ili jednaka argumentu.

Log - Funkcija Log vraća prirodni logaritam numeričkog argumenta. Numerički argument koji ova funkcija procesira mora biti biti veći od nule.

Oct - Funkcija Oct vraća string koji predstavlja oktalnu vrednost numeričkog argumenta. Ukoliko je numerički argument razlomak, vrednost se zaokružuje pre nego što sama funkcija vrati vrednost. Kao i sa Hex funkcijom, vraćeni string mora biti konvertovan u numeričku vrednost ukoliko ćete dalje izvoditi matematičke operacije. Za korišćenje oktalnih vrednosti u operacijama, koristite prefiks &O.


Preostalo nam je još da objasnimo vrlo zanimljivu funkciju Rnd, što ćemo i uraditi u sledećem prilogu, i to sa odgovarajućom ilustracijom.

Baze podataka - Implementacija bezbednosne politike (I deo)


Kada projektujete određene strukture podatka, pored osnovnih postupaka u cilju definisanja opisa strukture podataka, potrebno je i definisati određene mere bezbednosti u pogledu pristupa i korišćenja date baze podataka. Zato ćemo vam u narednim redovima kroz malu checklist-u ukazati na šta treba obratiti pažnju u procesu dizajna, i pomoći vam u odlučivanju koje mere bezbednosti primeniti, i u kom obimu.
Procena bezbednosnih zahteva - Svaki proces koji koristi informacije, vremenom akumulira podatke, a te podatke potrebno je i kasnije učiniti dostupnim. Vremenom, skupljanjem većeg broja informacija raste i njihova unutrašnja vrednost. Kao što informacije treba da budu dostupne tokom procesa, tako mora da se održava i bezbednost podataka. Nivo postavljene bezbednosti mora da reflektuje rizik od gubitka informacija, krađe, ili oštećenja, kao i zakonske zahteve. U osnovi, ukoliko su informacije dragocene, bolje će biti da preduzmete odgovarajuće mere bezbednosti koje će sprečiti gubitak ili krađu podataka, a isto tako kada vam određeni podaci nisu više potrebni, osigurajte se da ste ih "uništili", jer, eventualno, mogu upasti u ruke neželjenih i neovlašćenih lica.

Procena bezbednosnih alternativa - Čak je i najbezbedniji kompjuterski centar podložan delovanju neočekivanih događaja, kao što su: gubitak napona, zemljotresi, ljudski faktor, požari, i tako dalje. Iako je važno uspostaviti fizičku bezbednost vašeg sistema, takođe je važna i komunikaciona i pristupna bezbednost, ako ne i više. Preko svega, i krađa automobila je vrlo laka i jednostavna ukoliko imate odgovarajuće ključeve. Usmerite vaše bezbednosne zahteve više ka komunikacijama i politici pristupa, i budite spremni da na njih utrošite nešto više novca. Dobro dizajniran i organizovan sistem backup-a zaštitiće vaše informacije u slučaju požara ili uništenja objekta, ali ako podaci dođu do ruku beskrupuloznih osoba, nećete ih nikada povratiti.

Izbor strategije sistema bezbednosti - Vaša strategija sistema bezbednosti mora da obuhvati komunikacionu bezbednost, pristupnu bezbednost i strukturalnu bezbednost. Zato, prvo razmotrite sledeća pitanja vezana za komunikacionu sigurnost sistema:

Da li će baza podataka biti na mreži, dostupna mnogobrojnim korisnicima?
Da li se u korisnike uključuju i spoljni korisnici?
Da li ti korisnici koriste Internet, modemsku vezu, ili koriste neku drugu telekomunikacionu tehnologiju?

Vaš mrežni administrator bi trebalo da se nosi sa svim nabrojanim aspektima, ali neke mrežne aspekte koji su vezani za samu bazu podataka potrebno je posebno razmotriti. Znajte i to da bezbedna mreža ne znači i potpunu sigurnost baze podataka.