luni, 31 mai 2010

Cum inserăm CSS în documentele HTML

O foaie de stil poate fi inserată în trei moduri:
• Foaie externă de stil
• Foaie internă de stil
• Stil inline

O foaie de stil externă este ideală atunci când stilul respectiv se aplică mai multor pagini. Cu o foaie CSS externă, puteţi modifica aspectul întregului site modificând un singur fişier. Fiecare pagină trebuie să se lege la foaia de stil folosind tagul <link> în interiorul secţiunii head:

<head>
<link rel="stylesheet" type="text/css" href="mystyle.css" />
</head>



O foaie externă de stil poate fi scrisă în Notepad, nu trebuie să conţină taguri html şi trebuie salvată cu extensia .css. Un exemplu de foaie de stil externă, memorată în fişierul stil.css, este prezentată mai jos:
hr {color:sienna}
p {margin-left:20px}
body {background-image:url("roses.gif")}

Obs. Nu lăsaţi spaţii între valoarea proprietăţii şi unitatea de măsură! Dacă scrieţi "margin-left:20 px" (în loc de "margin-left:20px") va merge în IE, dar nu în  Firefox sau Opera.


O foaie internă de stil trebuie folosită când un singur document are un anumit stil. Foaia internă de stil se defineşte în secţiunea head a paginii HTML folosind tagul <style>, ca în exemplul următor:

<head>
<style type="text/css">
hr {color:sienna}
p {margin-left:20px}
body {background-image:url("roses.gif")}
</style>
</head>

Un stil inline pierde multe din avantajele foilor de stiluri amestecând conţinutul cu prezentarea. Utilizaţi această metodă cât mai rar. Pentru a utiliza un stil inline, folosiţi atributul style în tagul respectiv. Atributul style poate conţine orice proprietăţi CSS. Exemplul următor ilustrează cum se poate schimba culoarea şi marginea stângă a unui paragraf:
<p style="color:sienna;margin-left:20px">Acesta este 
un paragraf.</p>


Ce stil va fi utilizat când într-un document HTML sunt specificate mai multe foi de stil pentru un element HTML?
La modul general, putem spune că stilurile se vor mixa într-o foaie de stil virtuală după următoarele reguli, unde prioritatea creşte odată cu numărul de ordine:
  1. Foi de stil externe (din fişiere CSS)
  2. Foi de stiluri interne (din secţiunea head
  3. Setările implicite ale browserului)
  4. Stiluri inline (din tagul elementului HTML)
Deci, stilul inline al unui element suprascrie stilul definit în <head>, într-un fişier extern sau în browser.

Obs: Dacă legătura către o foaie externă de stil este amplasată în secţiunea <head> după foaia internă de stiluri, atunci fişierul extern va suprascrie stilul intern!
 

Sintaxa CSS


  • CSS înseamnă Cascading Style Sheets (foi de stil în cascadă)
  • Stilurile definesc cum vor fi afişate elementele HTML
  • Stilurile au fost adăugate în HTML 4.0 pentru a rezolva o problemă
  • Foile de stiluri externe pot salva multă muncă
  • Foile de stiluri externe sunt memorate în fişiere CSS
 
În HTML 4.0, toate formatările pot fi înlăturate din documentul HTML şi stocate într-un fişier CSS separat. Toate browserele suportă CSS. În acest fel puteţi schimba uşor aspectul tuturor paginilor web dintr-un site modificând un singur fişier.


O construcţie CSS are două părţi: un selector, şi una sau mai multe declaraţii:


Selectorul este uzual elementul HTML pe care doriţi să-l formataţi.
Fiecare declaraţie este formată dintr-o proprietate şi o valoare.
Proprietatea este atributul de stil pe care doriţi să-l modificaţi. Fiecare proprietate are o valoare.
Declaraţiile CSS se încheie întotdeauna cu ; şi grupurile de declaraţii sunt scrise între acolade. 


Exemplu:
p {color:red;text-align:center}


Pentru a face declaraţiile CSS mai uşor de citit, puteţi scrie fiecare declaraţie pe câte o linie ca în exemplul următor:

p
{
color:red;
text-align:center;
}


Documentul HTML care conţine declaraţiile CSS de mai sus va arăta astfel:


<html>
<head>
<style type="text/css">
p
{
color:red;
text-align:center;
}
</style>
</head>

<body>
<p>Buna ziua!</p>
<p>Acest paragraf este stilizat cu CSS.</p>
</body>
</html>


Comentariile se folosesc pentru a explica codul şi pot fi utile când modificaţi codul sursă pe parcurs. Comentariile sunt ignorate de către browsere.
Un comentariu CSS începe cu "/*", şi se termină cu "*/", ca în exemplul următor:

/*Acesta este un comentariu si nu se va afisa*/
p
{
text-align:center;
/*Acesta este un alt comentariu*/
color:blue;
font-family:arial
}



Pe lângă setarea stilului unui element HTML, CSS vă permite să specificaţi doi selectori proprii numiţi id şi class.


Selectorul id este utilizat pentru a specifica stilul unui singur element . Selectorul id foloseşte atributul id al unui element HTML, şi este definit cu "#".

Exemplu: Stilul următor va fi aplicat elementului care are atributul  id="par1".


<html>
<head>
<style type="text/css">
#par1
{
text-align:center;
color:blue
</style>
</head>
<body>
<p id="par1">Buna ziua!</p>
<p>Acest paragraf nu este afectat de declaratia de stil.</p>
</body>
</html>

 


Obs. Nu începeţi numele id cu un număr deoarece nu va lucra în Mozilla/Firefox.


Selectorul class este utilizat pentru a specifica stilul unui grup de elemente. Astfel, puteţi seta un stil particular pentru toate elementele HTML care face parte din aceeaşi clasă. Selectorul class foloseşte atributul HTML class şi este definit cu  "."
În exemplul următor, toate elementele HTML cu atributul class="center" vor fi aliniate la centru:


<html>
<head>
<style type="text/css">
.center
{
text-align:center;
}
</style>
</head>
<body>
<h1 class="center">Acest titlu este aliniat la centru cu CSS</h1>
<p class="center">Acest paragraf este de asemenea aliniat la centru cu CSS.</p>
</body>
</html>


Puteţi de asemenea specifica ce elemente din clasă vor fi afectate de stil.
În exemplul următor, numai elementele p din clasa center vor fi aliniate la centru:

<html>
<head>
<style type="text/css">
p.center
{
text-align:center;
}
</style>
</head>
<body>
<h1 class="center">Acest titlu nu este afectat de stilul CSS</h1>
<p class="center">Acest paragraf este aliniat la centru cu CSS.</p>
</body>
</html>


Obs. Nu începeţi un nume de clasă cu un număr deoarece numai Internet Explorer acceptă acest lucru.

sâmbătă, 29 mai 2010

Singurătatea celor nemuritori

Am revăzut zilele trecute superbul film "The Green Mile" (Culoarul morţii), regizat în 1999 de Frank Darabont după o povestire de Stephen King şi având printre protagonişti pe Tom Hanks, David Morse şi Michael Clarke Duncan. 
Acum, ca şi atunci când l-am vizionat prima dată, am fost captivată de perfecţiunea şi profunzimea acestui film. 
Povestea este cutremurătoare în sine: un uriaş cu intelectul unui copil de 5 ani este condamnat la moarte şi adus în sectorul special al închisorii statale unde şef este Paul Edgecomb (Tom Hanks). 
Numai că acest negru uriaş (John Coffey, interpretat magistral de Michael Clarke Duncan) pare a fi un trimis divin, având în mâinile sale puterea de a vindeca bolile trupeşti şi a reda chiar viaţa unui şoricel strivit. Acţiunea se desfăşoară, în cea mai mare parte a timpului, în sectorul de închisoare denumit "Green Mile", provocând parcă o ruptură voită faţă de realitatea exterioară. Bunătatea şi inocenţa Lui John Coffey atrag imediat atenţia lui Paul, care este vindecat, împotriva voinţei sale de o urâtă infecţie urinară. Acest miracol clatină din temelii universul raţional bine ordonat al lui Paul şi îl determină să afle adevărul despre oribila crimă pentru care este condamnat John Coffey. 
În timp ce Paul încearcă să înţeleagă cine sau ce este John, în Green Mile apar două noi pesonaje, ambele la fel de rele şi fundamental viciate: un nou gardian, Percy Wetmore, condus de un sadism explicit şi "Wild Bill" Wharton, sociopat declarat şi adevăratul autor al crimelor pentru care este condamnat John Coffey. 
Mica comunitate din Green Mile are parte de propria confruntare "bine versus rău", numai că personajele pozitive nu sunt neapărat înafara gratiilor, iar cele negative în spatele lor. 
Prin puterea miraculoasă pe care o are, John Coffey reuşeşte să vindece soţia directorului de o tumoare fatală şi să restabilească ordinea firească a lucrurilor în propriul univers. "Wild Bill" este ucis de Percy care înnebuneşte şi devine prizonierul propriei întunecimi psihice.
Deşi Paul este dispus să-şi rişte cariera pentru a-l ajuta pe John să evedeze, acesta refuză. Memorabil schimb de replici între cei doi, Paul Edgecomb sfâşiat între dorinţa de a salva "minunea trimisă de Dumnezeu" şi necesitatea de a-şi îndeplini datoria, şi John Coffey îndurerat şi sfâşiat lăuntric de răutatea şi urâţenia lumii, dornic să-şi găsească pacea şi odihna binemeritată.
Previzibil, John moare pe scaunul electric, nu înainte de a-i dărui lui Paul un pic din magia lui pentru a putea să vadă cu proprii ochi adevărul privind crima pentru care era acuzat.
Un dar care se dovedeşte în timp a fi mai mult o pedeapsă. Timpul pare să încremenească pentru Paul şi pentru şoricelul readus la viaţă de John Coffey. Anii trec şi Paul trăieşte durerea de a-i pierde pe cei dragi şi a deveni un străin în propria-i lume.
Nemurirea, sau cel puţin îndepărtarea pe termen nedefinit a momentului morţii, reprezintă pedeapsa lui Paul pentru nesalvarea lui John Coffey. 
Un final apoteotic - viziunea  lui Paul şi a şoricelului rămaşi singuri într-un univers dezolant şi necunoscut. Final care mă obligă să mă gândesc la "Tous les hommes sont mortels" (Toţi oamenii sunt muritori) - cartea lui Simone de Beauvoir- Fosca şi şoricelul pierduţi în neantul timpului, îndepărtaţi din curgerea firească a acestuia şi din istorie, privind viitorul ca pe un trecut încheiat şi viaţa ca o moarte veşnică.
Nu ştiu dacă imaginea a fost împrumutată din această carte şi nici măcar nu contează. Efectul ei asupra spectatorului este, implacabil, un sentiment de profundă tristeţe şi alienare spirituală...

Pentru informaţii despre "The Gree Mile" puteţi accesa link-ul
   

marți, 25 mai 2010

Shutter Island

Ultimul film al lui Leonardo di Caprio reprezintă a patra colaborare cu regizorul Martin Scorsese, după "Gangs of New York"  (2002), "The Aviator" (2004) şi "The Departed" (2006).
Deşi am vizionat cu plăcere şi curiozitate majoritatea filmelor în care Leonardo di Caprio a fost protagonist, trebuie să mărturisesc că favoritele mele rămân "The Departed" şi "Gangs of New York".
Despre "Shutter Island" cred că că cel mai bun comentariu pe care în pot oferi este...interesant.
Interesantă povestea, foarte bun jocul lui Leonardo, final imprevizibil şi totuşi lipseşte ceva...
Prea mare asemănarea cu filmele lui Hitchcock, mai bine zis cu atmosfera acestora, minus tensiunea accumulată cadru cu cadru şi care dă fiori pe şira spinării.
Un întreg scenariu conceput de o minte alienată pentru a ascunde propria vinovăţie, propriile remuşcări. O întreagă galerie de personaje care participă la acest joc absurd a cărui finalitate este destul de înceţoşată.
Povestea pare a nu se închide, mesajul este destul de ambiguu şi personajul se auto-condamnă la o recluziune sine die în sanatoriu din cauza remuşcărilor sau pur şi simplu din imposibilitatea acceptării crimei oribile comise de soţie (sau de el însuşi  împotriva ei?!).
Ca de obicei, jocul lui Leonardo di Caprio este profund şi nuanţat, deşi eu prefer amestecul de duritate, frustrare şi vulnerabilitate etalat în "The Departed" (Billy Costigan).
Pentru cei care nu au vizionat aceste filme, le recomand cu căldură. Nu veţi fi dezamăgiţi.
Întreaga filmografie a actorului o găsiţi la http://www.imdb.com/name/nm0000138/ .
Vizinare plăcută!





luni, 24 mai 2010

Prelucrări elementare ale vectorilor în C++ - III

-->
Permutarea circulară cu o poziţie spre stânga. Prin acestă operaţie, elementele din poziţiile 2,3,……..,n se deplasează cu o poziţie spre stânga şi elementul din prima poziţie ajunge în poziţia n. Vectorul nu îşi modifică dimensiunea:
aux=a[0];        /*salvăm temporar primul element */
for(j=0;j<
-->n-1;j++) a[j]=a[j+1];       /* deplasăm elementele spre stânga */ 
a[n-1]=aux; /* mutăm elementul în ultima poziţie */

-->
Permutarea circulară cu o poziţie spre dreapta. Prin această operaţie, elementele din poziţiile 1,2,……,n-1 se deplasează cu o poziţie spre dreapta, iar elementul din poziţia n ajunge în poziţia 1. Vectorul nu îşi modifică dimensiunea:
aux=a[n-1];         /* salvăm temporar ultimul element */
for(j=n-1;j>=1;j--) a[j]=a[j-1];      /*deplasăm elementele spre dreapta */
a[0]=aux;              /* mutăm elementul în prima poziţie */
-->

Sortarea vectorilor. Prin sortare se înţelege aranjarea elementelor unui vector în ordine crescătoare sau descrescătoare. Pentru rezolvarea acestei probleme au fost concepuţi diverşi algoritmi, mai mult sau mai puţin rapizi, mai simpli sau extrem de complicaţi. În acest moment vom aborda două dintre cele mai simple metode de sortare de complexitate n2 .

A)      Metoda bulelor (bubblesort)
Conform acestei metode, vectorul este parcurs de la stânga spre dreapta comparându-se perechi de elemente succesive (a[j] cu a[j+1]). Dacă cele două elemente nu sunt în ordinea cerută, se interschimbă şi, o variabilă iniţial egală cu 0, se incrementează. În acest fel, la prima parcurgere a vectorului, elementul maxim din şir (dacă se face ordonare crescătoare) se deplasează spre dreapta până când ajunge în ultima poziţie. La a doua parcurgere a vectorului , al doilea cel mai mare element ajunge în penultima poziţie etc. Parcurgerea vectorului se reia până când nu mai găsim nici-o pereche de elemente consecutive neordonate. La fiecare parcurgere, lungimea secvenţei care se verifică scade cu o unitate:
k=n-1;  /* iniţial verificăm tot vectorul */
do{
         f=0;   /* numără perechile neordonate */
         for(j=0;j<k; j++)
           if(a[j]>a[j+1])    /* pentru ordonare crescătoare */
           {   aux=a[j]; a[j]=a[j+1];
               a[j+1]=aux;    /* interschimbăm elementele */
               f++;           /* numărăm in f  */
           }
          k--;    /* lungimea secvenţei care se verifică scade */
}while(f);  /* repetă cât timp mai sunt perechi neordonate */
-->

B)Sortarea prin selecţie directă
Conform acestei metode primul element (a[0]) se compară pe rând cu toate elementele de după el şi dacă ordinea de sortare nu este respectată, cele două elemente se interschimbă. După efectuarea tuturor comparaţiilor, în prima poziţie ajunge cel mai mic element din vector (în cazul ordonării crescătoare). Se compară apoi al doilea element cu toate elementele de după el etc. La ultimul pas se compară numai ultimele două elemente. Secvenţa corespunzătoare de program este :
for(i=0; i<n-1; i++)    /* elementul care se compară */
  for(j=i+1;j<n; j++)    /* elem. de după el cu care se compară */
     if(a[i]>a[j])      /* pentru ordonare crescătoare */
     {  aux=a[i]; a[i]=a[j];
        a[j]=aux;       /* interschimbăm elementele */
     }

Prelucrări elementare ale vectorilor în C++ - II

-->
Eliminarea tuturor elementelor cu o anumită proprietate. Cea mai simplă metodă de a elimina dintr-un vector toate elementele cu o anumită proprietate este să creăm un nou vector în care se păstrează elementele care nu au proprietatea respectivă. De exemplu, pentru a elimina dintr-un vector toate elementele negative, putem utiliza secvenţa:
j=-1;
for(i=0;i<n;i++)
 if(a[i]>=0)              /* nu are proprietatea cerută */
       b[++j]=a[i];       /* păstram elementul în vectorul b */
n=j;                               /* actualizăm dimensiunea vectorului */
Metoda este ineficientă datorită consumului de memorie necesară pentru vectorul b. O metodă mult mai eficientă este să folosim acelaşi vector în care vom „îngrămădi” pe primele poziţii elementele care trebuie păstrate. Prin actualizarea dimensiunii vectorului, elementele de prisos nu vor mai fi luate în consideraţie în prelucrările ulterioare. Secvenţa care realizează această operaţie este următoarea:
j=-1;
for(i=0;i<n;i++)
   if(a[i]>=0)        /* nu are proprietatea cerută */
       a[++j]=a[i];    /* mutăm elementul la începutul vectorului */
n=j;                            /* actualizăm dimensiunea vectorului */
  -->
Eliminarea elementului din poziţia k dată. Prin eliminarea elementului din poziţia k dată (elementul de indice k-1), se observă că primele k-1 elemente rămân neschimbate, în timp ce elementele din poziţiile k+1, k+2,…….,n se deplasează cu o poziţie spre stânga pentru a “umple” golul rămas prin eliminarea elementului din poziţia k.  Evident, dimensiunea vectorului scade cu o unitate :
for(j=k-1;j<
-->n-1;j++) a[j]=a[j+1];
/* deplasăm elementele spre stânga */
n--;         /* corectăm dimensiunea */ 
-->

Inserarea unui nou element y în poziţia k dată. Cum inserarea unui element se face fără a pierde vreun element din vectorul iniţial, elementele din poziţiile k, k+1,.......n trebuie să se deplaseze cu o poziţie spre dreapta pentru a face loc noii valori y introdusă în poziţia k (indice k-1). Dimensiunea vectorului creşte cu o unitate:
for(j=n;j>=k;j--) a[j]=a[j-1];      
/* deplasăm elementele spre dreapta */
a[k-1]=y;    /* inserăm elementul y */
n++;               /* actualizăm dimensiunea */


Prelucrări elementare ale vectorilor în C++ - I

-->
Deoarece limbajul C nu verifică depăşirea dimensiunilor maxime declarate pentru tablourile utilizate în aplicaţii, pentru a evita scrierea accidentală a unor zone de memorie, programatorul trebuie să asigure validarea dimensiunilor reale (implicit a numărului de elemente) citite de la intrare. Uzual, un vector se declară în următoarea manieră:
#define MAX 100  /* dimensiunea maximă admisă */
…………………………
int a[MAX];
int n;      /* dimensiunea reală citită la intrare */
      ..............
      cout<<“n=”; cin>>n;
-->
            
 Citirea elementelor. După validarea dimensiunii, citirea elementelor unui vector se face în ordinea crescătoare a indicilor, uzual cu o instrucţiune for :
      for(int i=0; i<n; i++)
      {    cout<<“a[“<<”]=”;
           cin>>&a[i];
      }
Observaţie:   Deşi tablourile sunt indexate în C începând de la 0, se pot utiliza elementele numai de la indexul 1 (ca în Pascal), elementul a[0] rămânând liber. În această situaţie secvenţa de citire (şi toate celelalte secvenţe de prelucrare) se vor modifica corespunzător, conform modelului de mai jos:
      for(int i=1;i<=n;i++)
      {   cout<<“a[“<<”]=”;
          cin>>a[i];
      }
 
-->
Determinare minim/maxim. Metoda tipică de determinare a elementului minim/maxim dintr-un vector este următoarea : se iniţializează minimul/maximul cu primul element din vector apoi se compară cu celelalte elemente din vector reţinându-se, pe rând, valorile mai mici/mai mari.
            minim=a[0];                    /* maxim=a[1]; */
            for(i=1; i<n; i++)
        if(minim>a[i])         /*  (maxim  */
                     minim=a[i];            /* maxim=a[i]; */

  Determinarea primului element cu o anumită proprietate. Pentru a determina primul element (de indice minim) cu o anumită proprietate, se parcurge vectorul de la stânga la dreapta până când găsim primul element cu proprietatea cerută sau până când epuizăm elementele vectorului. De exemplu, determinarea primului element nul dintr-un vector se realizează cu secvenţa:
f=-1; 
for(j=0;j<n; j++)
   if(!a[j])
   {    f=j; break; }
  
Verificând valoarea variabilei f decidem dacă în vectorul există cel puţin un element cu proprietatea cerută (f=indicele acestuia) sau nici unul (f =-1).
Determinarea ultimului element cu o anumită proprietate. Pentru a determina ultimul element (de indice maxim) cu o anumită proprietate, se parcurge vectorul de la dreapta spre stânga (în ordinea descrescătoare a indicilor) până când găsim primul element cu proprietatea cerută sau până când epuizăm elementele vectorului. De exemplu, determinarea ultimului element par dintr-un vector se realizează cu secvenţa:
f=-1;
for(j=n-1;j>=0;j--)
   if(!(a[j]%2))
   {    f=j; break; }