miercuri, 27 mai 2009

Videotutoriale

Incepand din aceasta saptamana cursurile de Excel si PowerPoint dispun de videotutoriale.  Aveti doua episoade gratis din aceste cursuri mai jos:





Lucram in continuare si pentru realizarea de videoturiale pentru cursurile de Java Fundamentals, Java Advanced si C# Training.

Identificarea unui dispozitiv mobil in cazul aplicatiilor ASP.NET

In prezent, dispozitivele mobile de tip smartphone, pocketPC, palm sunt utilizate in mod frecvent pentru a naviga pe Internet. Acest lucru este permis de software, aplicaţiile browser pentru dispozitive mobile (Opera, Safari, Pocket Internet Explorer) si de capacitatea dispozitivului de a accesa o retea de date wireless sau una oferita de furnizorul de comunicatii mobile.

In acest scenariu, apare o problema privind dezvoltarea aplicatiilor Web, deoarece dispozitivul mobil este limitat in comparatie cu un PC sau Notebook din punctul de vedere al:

  • dimensiunilor fizice ale ecranului;
  • capacitatea de a afişa resurse multimedia (imagini, filme, sunet);
  • viteza de transfer a datelor
  • capacitatea de a rula script-uri.

Diferenţele enunţate influenţează negativ experienţa utilizatorului deoarece, in majoritatea cazurilor, aplicaţia este conceputa sa ruleze minim pe un ecran ce permite rezoluţia 800X600. Astfel, utilizatorul mobil întampină dificultati la vizualizarea meniului aplicatiei, a conţinutului si la completarea unor formulare de date.

Solutia problemei consta in dezvoltarea de versiuni diferite ale aplicaţiei Web. Utilizand tehnologia ASP.NET framework 2.0 si Visual Studio 2005

Cu toate că URL-ul site-ului Web rămâne neschimbat, trebuie să existe posibilitatea de a detecta tipul dispozitivului care face cererea şi în funcţie de acesta de a-i furniza conţinut care să ţină cont de particularităţile acestuia.

Soluţia prezentată este implementată utilizând ASP.NET 2.0 si Visual Studio 2005 ca mediu de dezvoltare. Pentru testare se utilizeaza emulatoarele de dispozitive mobile puse la dispozitie de Visual Studio 2005. Acesta sunt iniţializate prin intermediul Device Emulator Manager din opţiunea Tools a mediului.

Identificarea tipului dispozitivului se realizeaza din pagina principală a site-ului analizând cererea HTTP făcută de browser-ul acestuia. In această zonă există informaţii care indică tipul aplicaţiei de tip browser. In situaţia identificării unui dispozitiv mobil, serverul va face o redirectare a cererii catre o pagina Web construită în mod explicit pentru dispozitive cu ecran de dimensiuni reduse si capacitate particulara de interpretare a unui formular.

Interogarea tipului dispozitivului se face în pagina principală a site-ului, în funcţia Page_Load prin intermediul obiectului HttpContext.Current.Request.Browser ce are proprietatea IsMobileDevice. Această metodă analizează header-ul HTTP al cererii căutând informaţii despre platformă şi browser. Proprietatea intoarce true daca informaţiile gasite indica un dispozitiv mobil.

protected void Page_Load(object sender, EventArgs e)

{

if(Request.Browser.IsMobileDevice)

Server.Transfer(”MobileVersion/Default.aspx”);

}


Datorita numarului mare de dispozitive mobile si a evolutiei rapide a tehnologiei, metoda IsMobileDevice nu contine informatii despre toate dispozitivele mobile. Lista oficială a platformelor recunoscute se gaseste la http://www.asp.net/mobile/tested-devices/

După cum se observă, această listă nu este actualizată în mod curent, fapt care generează destul de uşor situaţii în care dispozitivul nu este identificat corect. In această situaţie este recomandată o abordare mai pragmatică ce implică definirea de metode proprii care să simuleze execuţia metodei IsMobileDevice.

Informaţiile ce pot fi analizate pentru a identifica platforma utilizatorului sunt obţinute prin intermediul metodei UserAgent pentru obiectul HttpContext.Current.Request.

De exemplu, pentru un telefon mobil Nokia N95, datele puse în cererea HTTP sunt

Mozilla/5.0(SymbianOS/9.2;U;Series60/3.1NokiaN95_8GB/15.0.015; Profile/MIDP-2.0Configuration/CLDC-1.1) AppleWebKit/413 (KHTML, like Gecko) Safari/413

Utilizand emulatorul Windows Mobile 6 Professional (este disponibil pentru Visual Studio 2005 si 2008 descarcand Windows Mobile 6 Professional and Standard Software Development Kits de la adresa http://www.microsoft.com/downloads/en/default.aspx)

Mozilla/4.0(compatible; MSIE 6.0; Windows CE; IEMobile 6.12)

Acest string poate fi parsat cu usurinta. Cea mai simpla metoda este data de cautarea unui substring dintr-o colectie data. In aceasta situatie metoda Page_Load devine

protected void Page_Load(object sender, EventArgs e)

{

if(Request.Browser.IsMobileDevice)

Server.Transfer(”MobileVersion/Default.aspx”);

else

if(Request.UserAgent.ToString().ToLower().Contains(“nokia”))

Server.Transfer(”MobileVersion/Default.aspx”);

}

Aceste profile de dispozitive mobile pot fi inserate in Web.config sau in fisiere XML externe astfel incat sa fie gestionate fara a modifica codul aplicatiei. O solutie devoltata pentru a genera astfel de profile poate fi descarcata de la adresa http://www.asp.net/mobile/profile/default.aspx.

Pentru browser-ele de pe dispozitivele mobile ce nu accepta URL relative, de tipul MobileVersion/Default.aspx, redirectarea se va realiza dacă aplicaţia Web este configurată să genereze URL complet. Acest lucru se obţine prin modificarea fisierului Web.config, adăugand setarea:

Aceasta solutie poate fi utilizata si pentru dezvoltarea de aplicatii ASP.NET utilizand Visual Studio 2008. Diferentele dintre cele doua medii de dezvoltare sunt vizibile la abordarea continutului unei pagini ASP.NET destinata dispozitivelor mobile. Pentru Visual Studio 2005 exista conceptul ca browser-ele mobile au capacitati reduse, lucru adevarat la nivelul anilor 2004 – 2005. In prezent, aceste aplicatii au evoluat suficient de mult astfel incat sa fie capabile sa interpreteze continutul la fel ca un browser clasic, destinat PC-urilor.

luni, 18 mai 2009

Filtru avansat – problema intampinata la copierea rezultatulul in alta foaie de calcul .

Sa se interogheze tabela de mai jos printr-un filtru avansat a.i. sa se afiseze doar angajatii care au un salariu mai mare decat salariul mediu , iar rezultatul obinut sa fie copiat in alta foaie de calcul .

Din tabelul initial (A1:D33) vreau sa pastrez doar inregistrarile pentru angajatii care au un salariu mai mare decat salariul mediu . Pentru asta am nevoie de un filtru avansat in care criteriul de filtrare sa fie criteriul definit in celula G8 (salariul sa fie mai mare decat rezultatul functiei AVERAGE aplicata pe intreaga coloana “Salariul lunar”) .

SOLUTIA GRESITA :
Dupa stabilirea criteriului actionez Data – Filter – Advanced Filter , de pe bara de meniu din foaia de calcul in care se afla tabelul initial .Va aparea casuta de dialog pentru filtru avansat , in care voi stabili tabela pe care doresc sa o filtrez (List Range) , aria de celule in care se afla criteriul de filtrare (Crteria Rnage) si locul unde vreau sa copiez rezultaul filtrarii (Copy to) . Atentie! Pentru a activa rubrica Copy to , dintre cele doua optiuni dn partea de sus a casutei de dialog trebuie sa alegem Copy to another location .



- A1:D33 este adresa in care se afla tabela initala
- G7:G8 este adresa compusa din celula in care am stabilit criteriul (salariul sa fie mai mare decat salariul mediu) si celula aflata imediat deasupra acesteia (G7 ramane necompletata deoarece criteriul este stabilit pe baza unei formule)
- Sheet2!A1 este adresa in care vreau sa copiez rezultatul filtrarii .
Am spus la inceputul exercitiului ca vreau ca rezultatul filtrului avansat sa fie copiat in alta foaie de calcul (in cazul acesta Sheet2 , tabela initiala aflandu-se in Sheet1)

Pentru a inchea filtrarea se apasa butonul OK .
Insa in locul rezultatului asteptat vom primi din partea Excel-ului urmatoarea atentionare :
Asadar , ni se atrage atentia ca putem copia rezultatul filtrarii doar in foaia de calcul activa (adica acolo unde am actioant comanda Data – Filter - Advanced Filter)

SOLUTIA CORECTA :
Daca dorim copierea in alta foaie de calcul (in cazul acesta in Sheet2 , nu in Sheet 1 unde avem tabela) , va trebui sa actionam Data-Filter-Advanced Filter chiar in foaia in care dorim sa copiem , nu in cea in care avem tabela .
Pentru asta mergem in Sheet2 , iar casuta de dialog pentru filtru avansat va arata in felul urmator :



joi, 14 mai 2009

Table Layout - partea 2

4. Alinierea
O componenta care se intinde pe o singura celula poate fi aliniata atat pe verticala cat si pe orizontala. Pentru fiecare orientare sunt patru variante posibile. Pentru aliniera pe orizontala este posibila left, center, right, and full. Acestea au efect decat daca atributul preferred width al componentei este mai mic decat lungimena celulei.

Componetele pot fi de asemenea aliniate pe verticala. Cele patru variante sunt top, center, bottom, and full. Comportamentul este similar cu cel de la alinierea pe orizontala.
Pentru a specifica alinierea unui component nu trebuie decat sa precizati prima litera a variantei dorite. De exemplu pentru a alinia la dreapta si sus, va trebui sa utilizati literele r si t (right si top), in paramentru de tip string pe care il trimiteti metodei de adaugare:

frame.add(component, "2, 1, r, t");

Alinierea pe orizontala este specificata inaintea alinierii pe verticala. Daca ar fi sa transpunem in cuvinte linia de cod de mai sus aceasta ar suna in felul urmator : pozitioneaza componenta in partea dreapta a coloanei cu indexul 2 si in partea superioara a randului cu indexul 1.

Aliniera default pentru o anumita componenta este cea de umplere (full) atat pe orizontala cat si pe verticala. Prin urmare linia de cod container.add (component, "2, 1"); este identica din punct de vedere functional cu  container.add (component, "2, 1, f, f");.

5. Adaugarea pe mai multe celule 
O anumita componeta poate fi adaugata si pe un set dreptunghiular de celule. Aceasta se realizeaza specificand colturile din stanga sus si dreapta jos pentru acest dreptughi. De exemplu linia de cod frame.add (component, "1, 1, 2, 3") va adauga componenta trimisa ca parametru pe toate celulele cuprinse de dreptunghiul delimitat de colturile 1,1 si 2,3. Componetele care ocupa mai mult de o singura celula au dimensiunea egala cu aria totala a celulelor pe care le ocupa. Pentru acest tip de componeta nu se poate specifica nici un atribut de aliniere.

6. Un simplu exemplu
Urmatorul cod creeaza TableLayout-ul de mai jos :

import info.clearthought.layout.TableLayout;
import javax.swing.*;

public class Simple
{    
    public static void main (String args[])
    {
        // creare fereastra
        JFrame frame = new JFrame("LEC Exemplu TableLayout");
        frame.setBounds (100, 100, 300, 300);

        // creare table layout
        double border = 10;

        double size[][] =
            {{border, 0.10, 20, TableLayout.FILL, 20, 0.20, border},  // Columns
             {border, 0.20, 20, TableLayout.FILL, 20, 0.20, border}}; // Rows

        frame.setLayout (new TableLayout(size));

        // creare componente
        String label[] = {"Top", "Bottom", "Left", "Right", "Center", "Overlap"};
        JButton button[] = new JButton[label.length];

        for (int i = 0; i <>
            button[i] = new JButton(label[i]);

        //adaugare butoane
        frame.add (button[0], "1, 1, 5, 1"); // sus
        frame.add (button[1], "1, 5, 5, 5"); // jos
        frame.add (button[2], "1, 3      "); // stanga
        frame.add (button[3], "5, 3      "); // dreapta
        frame.add (button[4], "3, 3, c, c"); // centru
        frame.add (button[5], "3, 3, 3, 5"); // suprapunere

        
        // afisare frame
        frame.setVisible(true);
    }   
}

Imaginea din stanga reprezinta frame-ul creat folosind codul de mai sus. In imaginea alaturata ei, au fost adaugate linii pentru a delimita randurile si coloanele. Lungimea coloanelor este afisata in marginea inferioara si inaltimea randurilor este afisata in partea dreapta.

Dupa cum se poate observa acest exemplu utilizeaza TableLayout pentru a crea un border de b pixeli in jurul componetelor de interfata grafica. Acesta este o tehnica usor de folosit pentru a crea un border pe un container care nu dispune de asa ceva. Din moment ce b este doar o primitiva de tip double cu valori intregi mai mari decat decat zero, borderul poate fi creat la orice dimensiuni. 

De asemenea acest exemplu arata cum se pot pune spatii intre componete. In acest caz a fost inserat un spatiu de 20 de pixeli atat pe verticala si orizontala, pentru a separa componetele intre ele. Majoritatea layout managerilor utilizeaza atributul padding pentru a insera spatii intre componente. Folosind TableLayout, singurul lucru care trebuie facut este un rand si/sau o coloana de o anumita dimensiune si sa nu plasati nimic in acestea. 

Butoanele din stanga si dreapta ocupa o singura celula si tot timpul de aceeasi dimensiune ca si celula. Butoanele de sus si jos se intind pe parcursul a cinci celule. TableLayout poate fi folosit oricand in locul lui BorderLayout si multi alti layout manageri, cu un plus considerabil de flexibilitate. 

Butonul cu denumirea Center se afla in celula din centru si este centrat atat pe verticala si pe orizontala. Dat fiind faptul ca s-au utilizat optiunile de aliniere acestui buton i-au fost alocate dimensiunile din atributul preferred size. In cazul in care acest frame este micsorat foarte mult atunci butonul center se va miscora, insa niciodata nu va depasi dimensiunile precizate in preferred size indiferent cat de mare va fi fereastra. 


Dupa cum se poate observa acest exemplu utilizeaza TableLayout pentru a crea un border de b pixeli in jurul componetelor de interfata grafica. Acesta este o tehnica usor de folosit pentru a crea un border pe un container care nu dispune de asa ceva. Din moment ce b este doar o primitiva de tip double cu valori intregi mai mari decat decat zero, borderul poate fi creat la orice dimensiuni. 

De asemenea acest exemplu arata cum se pot pune spatii intre componete. In acest caz a fost inserat un spatiu de 20 de pixeli atat pe verticala si orizontala, pentru a separa componetele intre ele. Majoritatea layout managerilor utilizeaza atributul padding pentru a insera spatii intre componente. Folosind TableLayout, singurul lucru care trebuie facut este un rand si/sau o coloana de o anumita dimensiune si sa nu plasati nimic in acestea. 

Butoanele din stanga si dreapta ocupa o singura celula si tot timpul de aceeasi dimensiune ca si celula. Butoanele de sus si jos se intind pe parcursul a cinci celule. TableLayout poate fi folosit oricand in locul lui BorderLayout si multi alti layout manageri, cu un plus considerabil de flexibilitate. 

marți, 12 mai 2009

Microsoft Excel - Grafice combinate

Microsoft Excel are o istorie lunga, ce evolueaza si se schimba in mod constant.  Asadar, sper ca urmatoarele indicatii va vor fi de ajutor. Excel ofera o larga varietate de grafice, cum ar fi cele de tip: Line, Column, Area, Bar, Scatter sau Pie. Poti combina mai multe tipuri de diagrame pe acelasi grafic prin atribuirea acestora unor serii de date diferite. Acestea sunt graficele combinate, sau “Combo Charts”.

Iata cum cream grafice combinate. In Chart Wizard, cand alegi tab-ul Custom Types, ai doua posibilitati de alegere a unui grafic combinat: Column – Area sau Line – Column. Sa nu credeti ca acestea sunt singurele tipuri de grafice combinate ce se pot crea. De fapt, crearea de grafice combinate este foarte flexibila. Cheia este sa intelegi cum funtioneaza comenzile Chart – Chart Type. Cand selectezi aceasta comanda, ai doua posibilitati: daca selectezi o serie de date, atunci tipul graficul pe care-l alegi se aplica doar la seria selectata, iar daca selectezi totul , tipul graficului se aplica tuturor seriilor  din grafic. Insa prima varianta iti va asigura o flexibilitate mai mare.

De exemplu, sa presupunem ca vrei sa creezi un grafic sa contina o diagrame Line, Column si Area. Incepe prin a crea un grafic tip Column. Apoi selecteaza o a doua serie si alege Chart – Chart Type. Selecteaza un grafic de tip Line pentru seria respectiva. Selecteaza si o a treia serie, repeta comanda anterioara, dar alege un grafic de tip Area. Rezultatul va fi un grafic combinat ce cuprinde trei tipuri diferite de diagrame.

Atentie, nu toate tipurile de diagrame pot fi folosite spre a crea un grafic combinat. De exemplu, Excel nu permite diagramelor 3-D sa fie folosite pentru grafice combinate.
Figura de mai jos ilustreaza, cu scop demonstrativ, un grafic ce contine cinci tipuri de diagrame. Nu cred sa existe vreo situatie care sa necesite un grafic atat de confuz :).

Iata un alt exemplu, mai aproape de realitate: previziunea intr-o firma. Aceasta apare sub forma de coloane, in timp ce valorile actuale corespund unei linii. 

Daca valorile seriilor reprezentate variaza foarte mult,  sau graficul contine tipuri diferite de date, atunci va fi nevoie sa folosesti o axa Y secundara. Scala axei secundare reflecta valorile seriei asociate. De exemplu: datele de mai jos sunt din intervale diferite, au unitati de masura diferite (moneda si procente)si nu pot fi reprezentate  pe aceeasi axa.


Pentru a reprezenta cele doua serii pe axe diferite, trebuie mai intai sa le reprezinti pe acceasi axa. Apoi selecteaza seria ce trebuie reprezentata pe axa secundara si alege Format Data Series din meniul shortcut. Din tab-ul Axis alege optiunea Secondary Axis. Graficul va avea o axa secundara pe partea dreapta a graficului.

luni, 11 mai 2009

Table Layout - partea 1

Obiective
Scopul acestui tutorial este de a exemplifica modul de functionare si utilitatea layout managerului TableLayout. Acest tutorial presupune cunostinte medii despre limbajul Java si despre modul de construire a interfetelor grafice folosind Swing. In cadrul sau vor fi abordate doar elementele necesare explicarii modului de utilizare a TableLyout.

1. Ce este TableLayout?
TableLayout este un layout manager care partitioneaza un container intr-o serie de randuri si de coloane. Intersesctia dintre un rand si o coloana formeaza o celula. Componentele adaugate containerului sunt plasate in celule. In cazul in care containerul este redimensionat atunci si celulele din acel container vor fi redimensionate, prin urmare si componetele continute de aceste celule fiind redimensionate. 

Luam spre exemplificare un simplu element de tip JFrame impartit in patru coloane si cinci randuri. Acesta este vizibil in figura alaturata. Observati ca nu toate randurile au aceeasi inaltime. Fiecare rand poate avea propria sa inaltime. De asemenea fiecare coloana poate avea aceeasi lungime. Pe masura ce containerul este redimensionat, fiecare rand si coloana este de asemenea redimensionata corespunzator specificatiilor date. 

Pe parcursul acestui tutorial orice lucru care este precizat pentru randuri este aplicabil si pentru coloane si vice versa. De exemplu, orice spunem despre inaltimea unui rand, este valabil si despre lungimea unei coloane. TableLayout este simetric ca proprietati atat pentru axa OX cat si pentru axa OY.

Randurile si coloanele sunt numerotate in cadrul ilustratiei. Observati ca indexarea coloanelor incepe de la 0. Notarea celulelor se face conform modelului (coloana, rand). Celula din stanga sus are coordonatele (0,0) si cea din dreapta jos are coordonatele (3,4). Liniile care despart randurile si celulele sunt doar la nivel logic, acestea neaparand efectiv in interfata grafica.

2. Crearea unui TableLayout
Figura de mai sus prezinta impartirea containerului la o dimensiunea data. Ce se intampla cu acest container atunci cand se face resize asupra lui. Asta depinde de tipul pe care l-am precizat pentru randuri si pentru coloane. Poate fi posibil ca toate coloanele sa aiba aceeasi lungime tot timpul sau de asemenea este posibil ca primele trei coloane sa fie de o lungime fixa iar cea de patra sa ocupe restul spatiului.

Sunt cinci moduri in care se poate specifica lungimea unei coloane. Aceasta poate avea o valoare fixa in pixeli, un procent din spatiul total, o portiune egala cu spatiul care ramane disponibil, o lungime determinata de atributul „preferred size” al componentelor care se afla in cadrul coloanei, sau o lungime determinata de atributul „minimum size” al componentelor care se alfa in cadrul coloanei. 

Pentru exemplul din figura de mai sus, sa presupunem ca vrem ca toate coloanele sa aiba o lungime egala. De asemenea toate randurile vor avea o inaltime fixa mai putin randul cu indexul 1 care va ocupa spatiul care va ramane disponibil. Urmatorul cod va realiza acest acest lucru:
public static void createFrame ()
    {
        Frame frame = new Frame();
        frame.setBounds (100, 100, 300, 300);
        frame.show();

        double size[][] =
            {{0.25, 0.25, 0.25, 0.25},
             {50, TableLayout.FILL, 40, 40, 40}};

        frame.setLayout (new TableLayout(size));
    }

Pentru crearea unui TableLayout sunt necesari doi pasi:

- primul pas : se creaza un array bidimensional de primitive de tip double, care va fi utilizat pentru a specifica lungimea coloanelor si inaltimea randurilor. 

- pasul doi: un nou obiect de tip TableLayout este creat utilizand array-ul creat la primul pas.

Lungimile coloanelor sunt specificate la 25% sau 0.25. Toate numerele reale, aflate in intervalul [0.0 si 1.0) sunt tratate ca fiind procente. Observati ca acest interval nu cuprinde si valoarea 1. Aceasta valoare nu inseamna 100% ci 1 pixel. 

Primului rand, cel cu indexul 0, ii sunt alocati exact 50 pixeli. Toate numerele intregi, mai mari decat zero sunt interpretate ca fiind valori in pixeli. Randului 1 ii este asociata constanta FILL, ceea ce inseamna ca acesta va ocupa restul spatiului disponibil. Am precizat mai sus ca procentual nu putem asocia unui element valoarea 100%, deoarece daca vom introduce valoarea 1 aceasta va fi interpretata drept 1 pixel. Folosind aceasta constanta FILL putem asocia unui element proportia de 100%.

3. Adaugarea Componetelor
Din momentul in care s-a construit layoutul pentru un anumit container componetele pot fi adaugate fie unei singure celule fie unui set rectangular de celule. Clasa Container contine o metoda de adaugare, semnatura acesteia fiind fiind urmatoare : 

public void add(Component comp, Object constraints) 

Atunci cand se utilizeaza un TableLayout parametrul constraints este un obiect de tip String care specifica celula, sau celule pe care respectiva componenta le va adauga. 
Pastrand exemplu creat anterior, pentru a aduga o componeta in celula (2,1) vom folosi urmatoare sintaxa: 

frame.add (component, "2, 1");

O componenta definita in acel mod, va ocupa intreaga celula. Pe masura ce aceasta celula isi va mari sau micsora dimensiunile, si componenta va face acelasi lucru, cele doua avand tot timpul exact aceeasi dimensiune. 

duminică, 10 mai 2009

Singleton - design pattern

Conceptul se numeste singleton. Reprezinta o tehnica prin care se limiteaza numarul de instante ale unei clase la una singura. Cu alte cuvinte nu pot construi decat un singur obiect din aceasta clasa.

O clasa care implementeaza conceptul de singleton arata in felul urmator:

public class Singleton {
  private final static Singleton INSTANCE = new Singleton();

  // constructorul este privat si nu permite crearea unei noi
instante
  private Singleton() {}

  // nu este obligatoriu numele getIntstance(), insa acesta se
foloseste de obieci
  public static Singleton getInstance() {
    return INSTANCE;
  }
}

Un obiect de tip Calendar se contruieste prin urmatorul apel:

        Calendar c = Calendar.getInstance();

nu printr-un apel clasic de genul:

         Calendar c = new Calendar();

Ideea de baza este ca programul nu are nevoie de mai multe obiecte de tip Calendar. Poate avea nevoie de mai multe obiecte de tip Date (de exemplu pentru a retine atat data de acum si cea de peste 5 zile), insa este suficient un sigur obiect Calendar care sa intoarca data actuala a sistemului.

Chiar daca vom face o bucata de cod de genul:

        Calendar c1 = Calendar.getInstance();
   Calendar c2 = Calendar.getInstance();
   Calendar c3 = Calendar.getInstance();

toate vor pointa catre un sigur obiect, si anume atributul static final din clasa pe care am implementat singletonul (in cazul nostru Calendar).

Tehnica de singleton se foloseste in special pentru a reduce consumul de memorie si pentru a centraliza anumite operatii catre un singur obiect.

sâmbătă, 9 mai 2009

Frequently Asked Questions

La sfarsitul cursului se elibereaza o diploma, care sa ateste participarea la curs ?
Da, la sfaristul fiecarui curs urmat in cadrul Line Education Center se elibereaza cu certificat de completare a acelui curs, in care sunt precizate notilunile si conceptele care au fost sudiate pe parcursul cursului.

Ce acte sunt necesare pentru reducerea acordata sudentilor ? In cazul in care sunt student la master pot beneficia de reducere ?
Pentru reducerile aplicabile sudentilor este necesara o copie dupa carnetul de student, sau o adeverinta din partea facultatii. In categorie de reduceri intra si cei care sunt studenti la master.

Pot sa platesc in rate ?
Da. Plata se poate face fie integral, in momentul inscrierii, fie in doua transe 50% in momentul inscrierii iar restul de 50% in termen de 4 saptamani de cand a inceput cursul.

Este prezenta obligatorie ? Ce se intampla daca lipsesc de la o sedinta?
Nu, prezenta nu este obligatorie. Cursurile au o abodare modularizata, aceasta insemand ca sedintele nu sunt legate foatre mult intre ele, astfel incat in cazul in care cineva nu poate ajunge la o anumita sedinta nu va intampina dificultati prea mari.

Cum fac sa ma inscriu la un curs ?
Primul pas pentru inscriere este completarea formularului de inscriere. Dupa completarea acestuia, veti fi contactat in maxim 2 zile lucratoare de un reprezentat LEC, pentru a vi se confirma daca mai sunt locuri libere in grupa selectata. Pentru finalizarea procesului de inscriere, va trebui sa treceti pe la sediul LEC pentru a achita un minim de 50% din valoarea cursului. Locul nu este rezervat decat in momentul achitarii sumei aferente, iar inscrierile se fac in ordinea platilor si nu in ordinea completarii formularului.

La sfarsitul cursului se va face o evaluare ?
La sfarsitul fiecarui curs se va face o evaluare, aceasta constand intr-un proiect care va contine materia predata de-a lungul cursului.

Prin ce se diferentiza cursurile organizate de Line Education Center ?
In principal cursurie organizate de firma noasta se diferentiaza prin abordarea extrem de practica a materiei predate. Consideram ca cel mai bun mod de a invata este „learning by doing”, iar din acest motiv peste 85% din timpul acordat cursurilor este dedicat exercitiilor practice si realizarii de proiecte care sa se aproprie cat mai mult cerintelor si mdului de lucru real.
Un al doilea aspect important care diferentiaza cursurile LEC, este calitatea instructorilor care sustin cursurile. Toti acestia lucreaza in domeniul pe care il predau, acest lucru premitandu-le sa cunoasca „insighturi” despre modul de lucru real al industriei de programare, notiuni care nu pot fi gasite in tutoriale.
Nu in ultimul rand, un alt aspect foarte important este faptul ca niciodata nu se lucreaza cu grupe mai mari de 10 oameni, in acest fel trainerul putand sa se concentreze asupra fiecarui cursant in parte, sa ii raspunda la intrebari si sa il ajute. De asemenea colaborarea dintre LEC si firme de software development va poate permite sa va angajati in domeniu, in cazul in care evoluati bine pe parcursul cursului.

SwingLabs PDF Renderer


SwingLabs PDF Renderer este o librarie Java pentru citirea si afisarea fisierele de tip PDF. Este un proiect opensource distribut sub licenta LGPL. Pagina oficiala a proiectului o puteti gasi aici .

Proiectul a inceput in 2003, fiind dezvoltat in cadrul SUN ca un instrument de colaborare intern denumit SUN Labs Meeting Suite. Ulterior a fost folosit pentru realizarea exporturilor in format PDF din OpenOffice. In principal permite citirea si afisarea fisierelor de tip PDF, insa pe langa citire permite si exportarea acestora in imagini tip PNG sau suprascrierea de elemente grafice peste continutul inital al documentului PDF.

Alaturi de SwingLabs PDF Renderer un alt tool Java pentru citrea/afisarea documentelor PDF este si JPedal distribuit insa sub licenta GPL care ii limiteaza gama de aplicatii in care poate fi folosit. Pentru generarea PDF-urilor poate fi utilizat iText , insa acesta nu permite si citirea sau afisarea lor.

vineri, 8 mai 2009

Scenarii in Microsoft Excel

Statistica? Previziuni? Interpretari? Posibilitati multiple..  Intr-un cuvant – scenarii. Aceasta este o functie utila si importanta a Microsoft Excel folosita in analizele “what if”, deoarece poti schimba intregul output / rezultat al calculului doar prin reeditarea unei singure celule. Ai posibilitatea de a salva diferite scenarii ce te vor ajuta sa iei decizii legate de cele mai bune valori pentru calculele tale. Prin invocarea unor scenarii, le poti demonstra clientilor sau managerilor impactul diferitelor evenimente sau posibilitati. Se pot de asemenea crea scenarii ce implica modificarea valorilor din multiple celule.

Vizualizarea scenariilor te ajuta in a vedea ce impact are cresterea sau descresterea valorilor din calculele tale. Un dezavantaj al acestui proces este acela ca nu este intotdeauna usor sa restaurezi datele initiale, mai ales la modificari multiple ale celulelor. Adaugarea de scenarii workbook-ului tau va modifica datele de la care porneste, asa ce este necesar o salvare a datelor initiale. 

Poti sa aplici orice scenariu oricand, iar celulele corespunzatoare se vor modifica spre valorile necesare.

Pentru a crea un scenariu, deschide aplicatia Excel. Intr-un worksheet nou, selectezi Tools – Scenarios pentru a afisa casuta Scenario Manager.  Initial, aceasta casuta va fi goala, iar pentru a adauga un scenariu se apasa Add.


Scenario name – numele scenariului;
Changing cells – celulele pentru care vrei sa vezi schimbarile previzionate. Poti specifica mai multe celule, prin separarea prin “,”;
Comment – permite descrierea tipului de scenariu;
Prevent changes – impiedica user-ul sa modifice ulterior scenariul. Acesta va avea efect numai daca woksheet-ul este protejat.
Hide – impiedica user-ul  sa vada scenariul atunci cand workbook-ul este deschis. Acesta va avea efect numai daca woksheet-ul este protejat.

Dupa ce selectezi Ok, casuta de dialog Scenario Values va aparea. Acum ai posibilitatea sa atribui noi valori celulelor din casuta Changing Cells. Aceste valori vor fi folosite in scenariul selectat.


Daca vrei sa creezi un nou scenariu, apasa Add din nou, si urmeaza pasii de mai sus. Cand ai terminat de creat toate scenariile dorite, alege Close din casuta Scenario Manager. 
Este posibila compararea rezultatelor tuturor scenariilor, prin crearea unui summary report. Acesta se creaza prin selectarea butonului Summary din casuta de dialog Scenario manager.

Acesta va afisa casuta Scenario Summary, avand astfel posibilitatea de a alege dintre cele doua tipuri de summary.

Scenario summary – creaza un tabel normal, ce este de folos atunci cand aceleasi celule sunt folosite pentru a crea scenarii diferite.
Scenario Pivot table report – creaza un tabel pivot, ce estede folos cand sunt folosite celule diferite pentru a crea scenarii.
Poti vizualiza scenariul creat, selectandu-l din casuta Scenario Manager si apasand Show.
Poti sa adaugi un Scenario dialog pe toolbar, prin click dreapta pe toolbar si selectarea tab-ului Customize – Commands.  Din categoria Tools, selecteaza Scenario listbox si drag and drop pe toolbar. Inchide Customize dialog. Acum poti vedea un scenariu la alegere, prin selectarea acestuia din Scenario list.
Pentru a edita un scenariu, alege Tools, apoi Scenario. Selecteaza scenariul ce va fi modificat si apasa butonul Edit, apoi Ok. Schimba valorile dorite si apasa Ok  pentru a salva schimbarile. Pentru a vizualiza rezultatele, alege scenariul din lista, si apasa Show.

joi, 7 mai 2009

JRuby

JRuby este o implementare open-source, bazata pe Java, a sintaxei limbajului Ruby si a librariilor aferente. Aceasta ofera simplitatea sintaxei de Ruby alaturi de avantajele oferite de interoperabilitatea cu aplicatii Java si automat portabilitatea, securitatea si librariile de clase specifice limbajului Java.

Limbajul Ruby a fost initial dezvoltat de catre Yukihiro Matsumoto avand la baza Perl, SmallTalk, Eifeel si Ada. Yukihiro Matsumoto declara ca a vrut sa faca din Ruby un limbaj mai puternic decat Perl si mai orientat obiect decat Python. Scopul sau este de a fi un limbaj natural, in asa fel incat sa permita simularea realitatii cat mai bine.

Ruby a inceput sa castige popularitate odata cu aparatia framework-ului Ruby on Rails, gandit in special pentru dezvoltarea cat mai rapida si agila a aplicatiilor web. Ruby on Rails a for dezvoltat David Hanssonavand ca unul dintre principalele avantaje metodologiile de tip CRUD (Create, Read, Update, Delete). Foarte pe scurt ideea framework-ului este de a acoperi cat mai bine partile comune care se regasesc in orice aplicatie, precum citirea/modificarea datelor dintr-o baza de date, oferind developeri-lor posibilitatea de a se concentra doar asupra partilor specifice, unice ale aplicatiilor la care lucreaza.

Prin intermediul JRuby a fost construita si echivaventul lui Ruby on Rails folosind masina virtuala si tehnologii Java - JRuby on Rails. Combinarea celor doua tehnologii reprezinta un avantaj pentru limbajul Ruby, in acest fel Ruby avand acces si la aplicatii de tip enterprise, insa reprezinta un plus si pentru Java oferind viteza de dezvoltare si productivitatea specifice Ruby on Rails. Mai multe detalii aici.

miercuri, 6 mai 2009

Aplicatii 3D folosind Java


Folosing Java 3D API se pot crea elemente de grafica 3D cu efecte destul de spectaculoase. Java 3D este dezvoltat in cadrul Java Community Process si ruleaza pe baza OpenGL. Pe langa suport 3D pentru sunet, API-ul ofera si o implementare foarte puternica, la nivel grafic, a conceptelor programarii orientate obiect, spre deosebire de celelate API-uri populare de OpenGL sau DirectX axate in special pe partea procedurala si modul de lucru al hardware-ului. In exemplul de mai sus obiectele grafice sunt incapsulate intr-o scena graf iar apoi scena poate fi manipulata pentru randare folosind Java 3D. Partea mai intersanta este reprezentata de cantitatea de cod foarte mica necesara pentru modificarea perspectivei. Puteti gasi aici un articol introductiv, destul de interesant, despre cum pot fi create aplicatii grafice puternice folosind Java 3D.


luni, 4 mai 2009

Certificari Java



Fiecare dintre certificarile oferite de SUN pentru platforma Java se concentreaza pentru o anumita pozitie din ciclul de software development.

In prezent SUN ofera opt certificari Java, care sunt clasificate in functie de nivelul de dificultate si gradul de specealizare. Majoritatea examenelor de certificare sunt constituite din intrebari grila cu raspunsuri multiple, insa sunt si cateva pentru care este necesara si realizarea unui proiect.

- Sun Certified Java Associate (SCJA): Aceasta reprezinta entrylevel-ul pentru certificarile Java oferind garantii doar pentru conceptele fundamentale ale limbajului Java si pentru cunostintele generale ale tehnologiilor SUN

- Sun Certified Java Programmer (SCJP): Atesta cunostinte solide despre principiile limbajului Java. (Nota: nu este necesara obtinerea SCJA pentru a avea acces la SCJP)

- Sun Certified Java Developer (SCJD): Majoritatea angajatorilor se concentreaza asupra acestui tip de certificare in principal din doua motive: trebuie sa treci SCJP (indiferent de versiune) inainte de a incera sa dai SCJD. De asemenea examenul de certificare cere canditatilor sa dezvolte un proiect conform specificatiilor si sa realizae un document in care sa explice designul arhitecturii si deciziile de dezvoltare.

- Sun Certified Web Component Developer (SCWCD): Acest examen poate fi interesant pentru dezvoltatorii web care vor sa se specealizeze in tehnologii Java precum Java Server Pages (JSP) si servleturi. Este necesar SCJP pentru a avea acces la aceast examen.

- Sun Certified Business Component Developer (SCBCD): Aceasta certificare, consta doar intr-un examen, si reprezinta nucleul certificarilor pentru tehnologii J2EE. Examenul este destul de greu de trecut in cazul in care candidatul nu are deloc experienta in proiecte axate pe Enterprise JavaBeans (EJB). Pentru sustinerea examenelui este necesara certificarea SCJP. Aceasta certificare poate fi interesanta pentru angajatorii care intentioneaza sa foloseasca EJB in cadrul proiectelor.

- Sun Certified Developer for Java Web Services (SCDJWS):Certificarea SCDJWS atesta cunostintele legate de dezvoltarea serviciilor Web. Pentru obtinerea acestei certificari se da doar un examen este necesara si SCJP.

- Sun Certified Mobile Application Developer (SCMAD): SCMAD atesta cunostintele pentru dezvoltarea aplicatiilor Java pentru telefoanele mobile sau alte device-uri care suporta J2ME. Proba pentru aceasta certificare nu presupune nici un proiect ci doar un examen. De asemenea, pentru a avea acces la aceasta certificare este necesar SCJP.

- Sun Certified Enterprise Architect (SCEA): Acesta este „scopul final” al programului de certificari SUN. SCEA certifica cunostintele necesare pentru a defini arhitectura si a crea aplicatii de tip J2EE de la zero. In ciuda faptului ca este cea mai avansata certificare SUN pentru sustinerea ei nu este necesara nici o certificare anterioara, cum este cazul celor de nivel 3. Proba consta intr-un examen grila cu raspunsuri multiple, un proiect asemanator cu cel de la SCJD, insa nivelul de complexitate este mult mai mare iar pe langa acestea trebuie realizat si un eseu in care sa fie explicat modul in care a fost construita aplicatia si motivele care au stat la baza deciziilor de arhitectura si programare.

duminică, 3 mai 2009

JavaFX

In urma cu ceva timp Sun a anuntat lansarea familiei de produse JavaFx. Scopul acestei tehnologii este sa permita aplicatiilor scrise in Java afisarea si utilizarea continutului multimedia avansat.

Initial suita JavaFx, va cuprinde JavaFX Mobile si JavaFX Script. James Gosling, CTO in cadrul grupului de client software al Sun, considerat parintele Java, a precizat ca JavaFx nu este un limbaj de programare generalist gen C++ ci se asemana mai mult cu o combinatie dintre JavaScript si HTML.

Concurentii directi ai JavaFx vor fi Microsoft SilverLight si Adobe Flash. Prin aceste trei produse se observa o tendinta destul de clara spre medii integrate (atat Microsoft cat si Adobe si Sun concentrandu-se foarte mult si asupra dispozitivelor mobile, pe langa PC-uri) si spre a oferi devzoltatorilor medii pentru creea unor aplicatii puternice din punctul de vedere a capacitatilor multimedia si al interfetei cu utilizatorul.

sâmbătă, 2 mai 2009

Greenfoot

Greenfoot este un proiect, initat de Sun si University of Kent, gandit ca un instrument prin intermediul caruia pot fi predate principiile programarii orientate obiect. Reprezinta o combinatie dintre un mediu de dezvoltare si un framework pentru manipularea unor elemente vizuale intr-un spatiu 2D, construit pe baza tehnologiei Java.

Framework-ul din greenfoot are in principal doua resposabiltati:

  1. - sa faciliteze crearea de reprezentari grafice pentru un obiect si al comportamentului acestuia
  2. - sa controleze controleze executia unui ciclu de simulare (start, stop si descrierea actiunilor pentru fiecare pas).

Pentru a reusi acest lucru framework-ul pune la dispozitie o clasa de baza - GreenfootObject care trebuie sa fie mostenita de toate celelate obiecte pentru care se doreste o reprezentare vizuala. Metodele cele mai importante care trebuie sa fie implementate sunt getImage(), care returezeaza imagina prin care este reprezentat obiectul si act(), metoda care descrie comportamentul acestuia.

Greenfoot a fost creat prentru a putea fi utilizat in predarea notiunilor de programre. Ideea de baza este ca stundetii pot avea foarte usor acces la un mediu interactiv, comportamentul codului scris putand lua foarte usor o forma vizuala.