luni, 21 martie 2016

Java String parsing: Pattern and Matcher

1. Requirements:

  - given a string formed of letters and digits, split the string into two arrays
    one array of numbers and one of words
  - sort the array of words alphabetically case insensitive and display them at console output
  - sum the array of numbers, display the array and sum
  - Example:
      - dog7break89Wind678solace2Dream23
      - sorted array of words: break, dog, Dream, solace, Wind
      - array of numbers: 7, 89, 678, 2, 23
        sum: 799

2. Regex description

  - to extract the desired components of the string, regular expressions were used.
  - to extract the natural numbers \\d+ was used
    \d stands for decimal and the extra \ is and escaping character
    + is one or more times the pattern
    so \\d+ will be one or more characters from the 0-9 group
  - to extract the words [a-zA-Z]+ was used
    the square brackets represent a character class and match one of the characters inside
    in our case it matches one of the letters from the alphabet
    by matching one or more times the pattern with + we can get a word
    in the current example a word is considered to be any iteration of letters
/** Regex for the natural number matcher. */
private static final String NUMBER_MATCHER_REGEX = "\\d+";
/** Regex for the word matcher. */
private static final String WORD_MATCHER_REGEX = "[a-zA-Z]+";

3. Pattern and Matcher

  - the pattern is defined with the help of the Pattern class
    the static method compile will take the regex expression parameter and return the Pattern instance
    using the instance you can retrieve the Matcher object, which will be used to retrieve the string
  - the Matcher object uses the function find to get the subsequence that matches the pattern
    if the function returns true, it means that a result was found and it can be retrieved with the
     function group
    by using a while loop you can retrieve all the matching subsequnces
    private ArrayList getWordList() {
        final ArrayList list = new ArrayList<>();
        final Matcher matcher = getWordMatcher();
        while (matcher.find()) {
            list.add(matcher.group());
        }
        return list;
    }

    private ArrayList getWordList() {
        final ArrayList list = new ArrayList<>();
        final Matcher matcher = getWordMatcher();
        while (matcher.find()) {
            list.add(matcher.group());
        }
        return list;
    }

4. Adding results to ArrayList

  - the strings resulted from the number matcher need to be parsed to Integers
    the created list can be initialized with Integers by adding a Integer.valueOf on the values provided
      by matcher.group inside the matcher.find loop
  - the strings resulted from the word matcher don't need parsing, but need sorting
    the sorting can be done with the Collections.sort function
    public ArrayList getIntegerList() {
        ArrayList list = new ArrayList<>();
        Matcher matcher = getNumberMatcher();
        while (matcher.find()) {
            list.add(getInteger(matcher));
        }
        return list;
    }

    public ArrayList getSortedWordList() {
        final ArrayList list = getWordList();
        Collections.sort(list, String.CASE_INSENSITIVE_ORDER);
        return list;
    }

5. Making the sum

  - the sum can be obtained by using a for to iterate each value and add it to the result
    this also can be done with streams, by retrieving the stream from the ArrayList
    the function mapToInt is used on the resulted stream to get the IntStream and finally the sum
      function is used to get the result
    public int getSum() {
        return getIntegerList().stream().mapToInt(e -> e).sum();
    }

6. Source code:

  - the source code is contained in the following zip file.
  - the source should be easy to import into Eclipse.
  - also the zip file is hosted on google drive.

  Any feedback is appreciated.

sâmbătă, 26 septembrie 2015

Sortare tabel HTML


Nume Prenume Data Suma
1 Popescu Otilia 01.03.2015 24
2 Ionescu Gheorghe 01.06.2015 534
3 Dunca Vlad 21.02.2011 21
4 Moerescu Ion 11.02.2015 12
5 Blandiana Ana 01.02.2005 45

1. Cerinte preliminare

Libraria javascript jQuery:
https://jquery.com/download/
Libraria javascript tablesorter:
https://mottie.github.io/tablesorter/docs/index.html

2. Cod tabel 

   Pentru a construi acest exemplu am folosit un tabel simplu cu 5 coloane si 6 randuri. De asemenea am folosit mai multe tipuri de date pentru a vedea cum se comporta sortarea.
   Identificatorii (id si class) leaga urmatoarele functionalitati:
1. myTable - scriptul de initializare al sortarii pe tabel
2. tabelAvansat - stilul CSS general al tabelului
3. resetSortare - scriptul de resetare al sortarii, un clic pe aceasta celula va reseta sortarea
4. celulaIndex - stilul CSS pentru coloana de index al tabelului

2. Cod stil CSS


3. Cod javascript


La incarcarea paginii se apeleaza functia de initializare a tabelului. In acest exemplu am setat tipul de data dare va fi folosit in tabel si am dezactivat sortarea pe primul tabel. De asemenea am atasat functia de resetare a sortarii pe prima celula din header.

luni, 16 martie 2015

Eclipse Luna - FindBugs install and simple configuration

1. Install FindBugs plugin


Under this section you will find all the install steps done to add the FindBugs plugin to your Eclipse Luna IDE.
Before starting the installation check for the newest repository link for the plugin. After a quick search on the FindBugs official site (http://findbugs.sourceforge.net/) you should find the repository link:
http://findbugs.cs.umd.edu/eclipse

1.1 Access "Install new software..." Eclipse view 


Click on the "Help" menu and select the "Install new software..." menu item.
This will lead you to the "Install" window.


1.2 Select the FindBugs repository

 

Press on the "Add..." button to open the "Add repository" dialog.
Fill the "Name" text box. Any non existing name can be introduced.
Fill the "Location" text box. Add the repository link from the official site:
                     http://findbugs.cs.umd.edu/eclipse
Press "OK" to finish adding the new FindBugs repository.

 

1.3 Select the plugin for install


After you finish adding the repository a new entry should be available.
Select the "FindBugs" check box and press the "Next" button to start the install.


 

1.4 Confirm installation for the selected sofware


The "Install Details" view will appear for you to see your current selections and confirm their install.
You will see details about your selected plugins: name, version and id.
To continue press "Next" button.


 

1.5 Review and confirm License agreement 


The "Review Licenses" view will appear.
Read the license and select the "I accept the terms and license agreement" to continue.
The "Finish" button becomes available.
After pressing the "Finish" button, the install will start.

 

1.6 Confirm security warning


A security warning will be displayed.
To continue the installation you will need to press the "OK" button.

 

1.7 Restart Eclipse


The restart prompt for Eclipse Luna will appear after the changes are done.
Press "Yes" button.
The plugin should be visible after the Eclipse is restarted.

 

2. Configuration


The plugin comes with a default configuration and can be used without further changes.
But you might want to make additional changes to the FindBugs plugin behavior.

 

2.1 Access Eclipse "Preferences" view


Click the "Window" menu and select the "Preferences" menu item.
The "Preferences" dialog will be opened.

 

2.2 Select FindBugs configuration view


Select the "FindBugs" entry from the tree to open it's configuration.
On the "Reporter Configuration" tab select the reported categories, level and marker type.
For example I add the "Malicious code vulnerability", "Security" and "Internationalization" categories to the plugin default selection.

 

2.3 Plugin settings


On the "Plugins and misc. Settings" you can change some of the plugin behavior.
It's a good idea to select the "Switch to FindBugs perspective after analysis" check box.

 

2.4 Rule configuration for FindBugs


On the "Detector configuration" tab you can select rules one by one.
But keep in mind that the selected rules won't be reported, if their category is not checked in the "Reporter Configuration" tab. These rules are greyed out.

miercuri, 11 februarie 2015

Comanda shutdown

Comanda shutdown permite unui utilizator sa execute, prin intermediul liniei de comanda, operatiuni de inchidere a calculatorului.

1. Inchidere planificata a calculatorului

Pentru a inchide calculatorul la un anumit interval de timp dupa lansarea comenzii folositi urmatoarea linie:

shutdown -s -f -t 2400

-s este folosit pentru stingerea calculatorului
-f va forta oprirea aplicatiilor din fundal. In general este recomandata folosirea acestei optiuni pentru a nu ramane cu calculatorul deshis.
-t este folosit pentru a defini perioada de timp dupa care se va inchide calculatorul. Perioada este definita in secunde. 2400 reprezinta 40 de minute.

2. Anularea inchiderii planificate

Daca s-a planificat inchiderea calculatorului si se doreste renuntarea la aceasta actiune.
Folositi urmatoarea linie:

shutdown -a

Optiunea -a anuleaza comanda. Poate fi folosita doar cand este planificata o actiune cu -t.

3. Restartarea calculatorului

Pentru a restarta calculatorului, folositi urmatoarea linie:

shutdown -r

-r este folosita pentru restartarea calculatorului
Daca se doreste si repornirea aplicatiilor curente folositi optiunea -g.


4. Crearea unui .bat

Pentru a executa comanda mai usor se poate crea un fisier .bat.
Acesta se poate executa ca orice alt program din sistemul de operare.
Pentru a crea acest fisier urmati urmatorii pasi:
- deshideti notepad
- scrieti linia de comanda
- salvati fisierul cu extensia .bat . Folositi "Save as.." din meniul file, si dati numele Inchide.bat
- dati dublu click pe fisier si se va executa comanda introdusa in fisier
- deshideti fisierul cu Notepad pentru  a modifica comanda stocata

5. Executarea comenzii fara a crea un fisier

Comanda se poate executa din cmd.
Pentru a deschide un cmd executati urmatorii pasi:
- apasati butonul de windows
- scrieti cmd si apasati enter (functioneaza pentru Windows 7)

sâmbătă, 15 noiembrie 2014

Nostalgia de Mircea Cartarescu

Nostalgia este un volum de nuvele scris de Mircea Cartarescu. Opera este versiunea intregita a cartii "Visul". Aceasta cuprinde "Ruletistul", "Mendebilul", "Gemenii", "REM" si "Arhitectul".

Prima partea a acestei carti se numeste "Ruletistul". Aceasta prezinta povestea tragica a unui om impatimit de jocurile de noroc. Ruleta era un joc de noroc in care un biet cersetor isi punea viata in ghearele mortii, sperand ca soarta ii va surade si il va scapa de sfarsitul iminent. Alaturi de acesta era "patronul", cel ce organiza evenimentul. El avea rolul de a face pariurile cu "investitorii" si primea majoritatea bailor castigati. Investitorii mizau anumite sume pe moartea ruletistului, avand una din sase sanse sa castige suma inzecit. Ruletistul punea degetul pe tragaci si daca supravietuia lua a zecea parte din suma totala. Personajul pincipal sfideaza moarte de nenumarate ori in rolul de ruletist, doar ca in mod ironic sa-si cunoasca sfarsitul la capatul unui revolver gol.

Mendebilul este porecla unui fost prieten din copilaria autorului si numele urmatoarei povestiri. Povestea se axeaza pe vara petrecuta cu acesta si copiii de la bloc. Naratiunea incepe cu un vis ciudat care trezeste amintiri demult uitate. Rascolind printre amintiri autorul descopera o intamplare, care si-a pus amprenta asupra vietii lui si probabil a celorlalti copii de la bloc. El cladeste contextul acestei intamplari si uneori face abateri de la poveste. Aceste abateri deveneau un pic enervante pentru mine, dar in acelasi timp ma faceau tot mai curios. Aveam un sentiment de nerabdare, vroiam sa trec pe la sfarsit, dar totusi m-am stapanit. Nu vroiam sa pierd detaliile. Intr-un final am aflat sfarsitul. Sa zicem ca a meritat asteptarea.

Gemenii, urmatoarea lectura a acestui volum, o poveste de amor, o tragedie sau ambele. Ritualul meticulos al tranzitiei. Tranzitia fortata dintre viata si moarte al unui barbat. Sfarsitul incert al acestuia si scriitorul care promite o carte. Carte ce avea ca subiect trairile unui tanar indragostit, patimile si suferinta acestuia. Legatura intre ei, inca nedefinita. Curiozitatea care apare, aproape insuportabila, si intrebarea care isi croieste drumul catre suprafata. Care este legatura intre cele trei ipostaze. Oare totul se petrece in mintea scriitorului, sau acel scriitor este presonaj in propria opera. Citind printre randuri tind sa cred ca acel adolescent, va deveni barbatul din ritual, ca mai apoi sa intre in starea de crisalida. Fiecare rand duce tot mai aproape de rezultatul acestei tranformari. Enigma acestei tranziti, acea emotie, ramane a fi deslusita de catre cititor.

REM este numele urmatoarei povestiri. Fiind curios de unde vine prescurtarea, am cautat pe internet sensul. Initialele provin de Rapid Eye Movement, perioda in care traim visele. Citind primele randuri caut legatura cu visul, dar gasesc urme din GEMENI, povestirea din care inca nu m-am dezmeticit cu totul. Si totusi, continuand decopar un tanar avand o  aventura cu o femeie matura, atinsa de umbra singuratatii. Alaturi de aceasta idila, apare, ca o panza de paianjen, un sir de istorisiri din viata celor doi. Prima istorisire este a tanarului, un pic interesanta, dar un cadru destul de banal. In schimb povestea femeii este un labirint complex, plin de trairi intense.
Povestea a ceea ce a fost si nu va mai fi niciodata. Acest sir de istorisiri se termina cu despartirea celor doi si cu o turnura interesanta, asemeni unei revelatii.

Arhitectul este ultima parte valumului "Nostalgia" si are rolul de epilog. Are ca subiect pasiunea devenita obsesie. Un mijloc de a depasi limitarile existentei umane. Cu o intorsatura stranie, personajul principal isi pune amprenta asupra lumii. Insa aceasta realizare vine cu un cost: pierderea laturii umane. O evolutie continua, aproape mecanica, ce absoarbe tot in jurul ei.

Acest volum mi-a placut destul de mult. Trairile intense pe care le-a provocat sunt clar un atu.
Evenimentele neasteptate dau un iz de originalitate unor cadre banale, cu care aproape orice om poate
corela. Astfel se creaza un fel de empatie cu personajele prezentate.
Singurul lucru care nu mi-a placut sunt descrierile lungi si anevoioase. Probabil au avut rolul de a crea suspans. Insa mult prea lungi ca sa fie pe gustul meu.

In concluzie, o carte buna care merita citita. In special pentru Gemeni si REM.

duminică, 26 octombrie 2014

Leviatanul (Leviathan) de Scott Westerfeld

    Leviatanul este prima carte din seria cu acelasi nume, scrisa de Scott Westefeld. Opera intra in categoriile aventura si fantezie. Lectura este usoara si captivanta, fiind potrivita pentru orice tip de cititor.

    Actiunea are loc intr-o realitate alternativa a primului razboi mondial, unde factiunile Europei sunt impartite dupa doua tehnologii diferite. "Clankers" sunt tarile care se bazeaza pe industrializare masiva folosind masinarii mecanice complexe. In schimb "Darwinist" au creat animale prin inginerie genetica pentru a inlocui masinariile. De exemplu, leviatanul este o balena cu propriul ecosistem folosita pe post ne nava de razboi.

    Povestea se axeaza pe cele doua personaje principale: Deryn Sharp (Dylan) si Printul Aleksandar (Alek).
    La fel ca si in primul razboi mondial, actiunea incepe prin asasinarea Arhiducelui Franz Ferdinand. Dar in "Leviatan" copiii acestuia sunt inlocuiti de un singur fiu pe nume Alek. Acesta este luat in toiul noptii de catre tutorii lui, cu pretextul unei unei lectii de pilotare a unui "Stormwalker"(masinarie de lupta pe doua picioare echipata cu tun). El afla mai tarziu de moartea parintiilor lui, marcand primul pas al, transformarii dintr-un copil rasfatat intr-un tanar capabil.

    Pe celalalt fir al naratiunii se afla Deryn, o fata de cincisprezece ani ce este hotarata sa intre in aviatia britanica. Ea este nevoita sa se imbrace si sa se comporte ca un baiat, deoarece in aviatie fetele nu erau acceptate. In ziua examenului ramane blocata pe un "Huxley" (creatura asemanatoare unei meduze plina de hidrogen, folosita pe post de balon zburator) fiind obligata sa taie legatura cu solul pentru a nu se izbi de o cladire. Deryn este adusa la bordul navei "Leviathan", iar din cauza crizei de timp va fi adaugata echipajului pe postul de Midshipman (un fel de ucenic). Ea ajunge sa-si indeplineasca visul, dar secretul ei risca sa ajunga la iveala, cand un nou venit se alatura echipajului.

    Intriga povestii este una buna, lasandu-te nerabdator sa ajungi la urmatoarea pagina. Pasul actiunii este unul rapid si plin de turnuri de situatie neasteptate. Pe masura ce actiunea inainteaza, povestea devine din ce in ce mai interesanta, datorita dezvoltarii personajelor.
    Find o persoana ce nu petrecea prea mult timp citind, am fost sceptic cand am inceput lectura. Dar dupa primele capitole citite am devenit curios si nerabdator sa aflu cum va decurge actiunea.
    Fiind placut impresionat am inceput sa citesc "Behemoth", urmatoarea carte din seria "Leviathan".

vineri, 3 octombrie 2014

Informatii utile profil Firefox

1. Profil Firefox

Profilul browserului contine informatii legate de customizarile utilizatorului.
In aceasta categorie intra:
  - parolele salvate
  - istoricul paginilor vizitare
  - bookmark-uri
  - istoricul cuvintelor folosite pentru autocompletare
  - cookies si setari specifice site-urilor
  - fisiere recunoscute si actinile executate la descarcare

2. Copiere Profil

Pentru a nu pierde setarile facute de a lungul timpului copierea si stocarea profilului intr-un loc sigur este recomandata.
Copierea se poate face in doua moduri:
1. Folosirea functiei de Cloud a browserului Firefox
    Pentru a face sincronizarea este necesara crearea unui cont Firefox.
    Dupa logare se foloseste butonul de sincronizare pentru a aduce setarile salvate.
2. Copierea fisierelor din folderul de profil
 Pentru a accesa folderul se apasa butonul de meniu , dupa care se apasa  butonul de ajutor . Din meniun nou deschis se selecteaza "Troubleshooting Information" (Informatii de depanare).
  Din pagina nou deschisa apasati butonul "Show folder" din Randul "Profile Folder".
  Copiati fisierele din dosar.
  Pentru a aplica setarile salvate, se deschide folderul de profil si se inlocuiesc fisierele existente cu cele salvate. Pentru ca tranzitia sa se efectueze browserul Firefox trebuie inchis.

3. Copiere istoric

Pentru a copia doar istoricul se acceseaza folderul folderul de profil (ca la punctul 2).
Fisierul places.sqlite contine site-urile vizitate, fisierele descarcate si bookmark-urile.
Daca suprascrieti fisierul dintr-un profil existent, doar istoricul va fi inlocuit.


4. Copiere parole

Pentru a copia doar parolele se acceseaza folderul folderul de profil (ca la punctul 2).
Fisierele key3.db si  ogins.json contin parolele salvate.
Ambele fisiere trebuie copiate si suprascrise pentru ca transferul sa fie cu succes.

4. Nota informativa

Daca suprascrieti fisierele din profil, setarile continute de acestea vor fi pierdute, fiind inlocuite cu noile setari.