Articole ‘it’
Model – View – Controller
Model – View – Controller: N-o sa mai intru in detalii de patternuri, o sa scriu direct aici ce inseamna, si cum se traduce pe romaneste.
O aplicatie care respecta pattermul are 3 componente diferite:
- View: ce vede utilizatorul
- Controller: o cumponenta / un modul separat care preia inputul utilizatorului, face validari sau alte operatii asemanatoare necesare si cunoscand starea curenta a modelului face requesturi pentru schimbarea starii acestuia. Adica traduce o operatie precum un click de mouse in apeluri de metode de pe model.
- Modelul mentine datele (starea sistemului) si operatiile care se pot face pe acestea. Aplica aceste operatii cand i-o cere controllerul si raspunde cu noua stare a sistemului. Controllerul apoi notifica View-ul in legatura cu noua stare.
Un flavor de MVC accepta si urmatoarea impartire: Prezentare (View) – Functii (Controller) – Date (Model), acest pattern fiind mai degraba un 3-Tier Architecture.
Intrebari comune:
- Unde pui business logicul in MVC. Parerea mea e ca partea de business logic e impartita intre Controller si Model, nu numai in Model.
Exemplu: O aplicatie J2EE sa spunem Struts cu Hibernate:
- View e partea de JSP
- Controller este ActionServletul Struts plus partea din Action-uri in care faci validari, determini starea curenta a sistemului apelezi anumite metode care proceseaza datele, adica metode din Model.
- Model reprezinta totalitatea datelor plus operatiile directe pe care le poti face asupra lor, prelucrarile nu numai din proceduri stocate de exemplu dar si din partea de Hibernate sau Actionurile Struts care proceseaza date.
In cazul in care partea de model e separata 100% de partea de View vom avea de-a face cu un model pasiv. Daca modelul comunica cu view-ul fara sa mai treaca prin controller, prin intermediul unor observeri de exemplu, atunci acesta se va numi model activ.
Bottom Line avem asa:
- Ce stiu fac p-acolo (Model)
- Ce vad, reprezentat “prieteneste” (View)
- Traduc reprezentarea prieteneasca in reprezentare “conceptuala” a ceea ce stiu sa fac, si invers (Controller)
Probleme de logica la interviuri IT
Ce se urmareste mai exact cu problemele de logica propuse candidatilor la interviurile in IT? Mai jos cateva definitii si concepte:
- Gandirea analitica (Analytical thinking)
- Inclinatia spre rezolvarea problemelor (Problem solving)
Si acum pe rand:
- Gandire analitica inseamna capacitatea de a separa la nivel abstract intregul in componentele sale si de a gasi / studia relatiile intre acestea (definitia de dictionar).
- Problem solving: enumeram – abordarea sistematica a rezolvarii problemei, problem finding, problem shaping. Urmarim daca se abandoneaza sau nu gasirea solutiei (automotivarea). Capacitatea de adaptare la conditiile problemei (outside the box thinking).
- Abordarea sistematica a rezolvarii problemei inseamna crearea si urmarirea unui plan, a unui sistem, care sa te duca la o concluzie. Urmarim: intelegerea problemei, gasirea unui plan, mentinerea motivarii. Clasificarea conceptelor si despartirea clara a acestora, gandirea clara, neincalcita, evaluarea solutiilor doar dupa gasirea acestora etc.
- Mai urmarim: capacitatea de adaptare la conditiile problemei (inteligenta), capacitatea de abstractizare / concretizare, metodologia de rezolvare a problemei si anume inclinatia spre engineering / reverse engineriing.
Trei probleme de logica prin care putem urmari cele de mai sus: De multe ori nu e necesara gasirea raspunsului corect, ci doar analizarea tipului de gandire. Scopul unui interviu este strict: Evaluarea!
Problema 1: Pietrele din Piatra Craiului.
Legenda spune ca la Poarta Basmelor, in Piatra Craiului era o grota in care salasluia un capcaun. Acesta cobora in sat si rapea fete tinere. Intr-o zi, cel mai voinic flacau din sat si-a propus sa omoare Capcaunul dar nu stia cum. Asa ca s-a dus la batranii satului sa afle cum poate fi omorat capcaunul. Acestia i-au spus ca singura lui sansa este sa il astepte in Pestera Mica, de langa grota, si sa arunce in capul capcaunului 4 pietre de acelasi fel, stiind ca in Piatra Craiului sunt 4 tipuri diferite de pietre. Voinicul s-a dus in pestera sa-si aleaga pietrele dar si-a dat seama ca nu le poate deosebi tipul din cauza intunericului. Asa ca s-a decis sa ia numarul minim de pietre astfel incat sa fie sigur ca sunt 4 de acelasi tip.
Cate pietre a luat voinicul din pestera?
Cei care au fost la Poarta Basmelor stiu ca sunt 13 pietre in fata pesterii surpate intre timp, dar e bine sa nu triseze.
Raspuns:
Cazul defavorabil este 3+3+3+3, deci 12 pietre nu sunt de ajuns. Astfel 13 este numarul minim. Problema este una de atentie, inclinare spre detalii. Asta se observa prin capacitatea candidatului de a analiza: 4 pietre, 4 tipuri de pietre, numarul minim de pietre pentru a ne asigura ca sunt 4 de acelasi fel. Capacitatea de a sistematiza, eventual prin incercari. Cineva incapabil sa creeze concepte “on the fly” va cere repetarea anumitor elemente ale problemei.
Problema 2: Cutiile cu mere si pere
Avem 3 cutii cu mere si pere. Una e cu mere, alta cu pere si alta combinata, mere si pere. Cutiile sunt etichetate gresit. Problema cere sa etichetam corect cutiile dintr-o singura extragere.
Pe cazul asta analiza nu se aplica deoarece conceptele si relatiile dintre ele sunt definite clar de la inceput. Sistematizare inseamna de exemplu a incerca sa extragi un fruct din fiecare cutie si a observa ce se intampla. Repetarea problemei prin extrageri diferite.
Sa presupunem ca extragem un fruct din cutia etichetata cu mere. Avem doua cazuri:
- Extragem mar. Acea cutie va fi Mixta, deoarece e etichetata gresit “mere”, deci mere nu pot fi. De aici rezulta ca in cutia etichetata “Pere” vor fi “Mere”, deoarece pere nu pot fi, fiind etichetata gresit, iar cu Mixt deja am etichetat o cutie. In cutia etichetata Mixt vor fi pere, ce-a ramas.
- Extragem para. Avem inca doua cazuri: cutia contine pere sau e mixta. Blocajul e deja evident pentru ca putem eticheta cutia din care am extras cu doua etichete diferite.
Unul muncitor, cu mai putina intuitie, ar dezvolta problema si mai mult pe cazuri, numai pentru a ajunge la concluzia clara, aceea ca nu se poate face o etichetare corecta.
Unul ne-automotivat, ajuns in punctul asta, ar spune: OK, ma mai gandesc… nu stiu cum as putea face. Unul automotivat ar zice: “Ce plm fac gresit frate? Ia sa vad mai in colo”.
Unul sistematic, automotivat, s-ar intoarce la inceputul rezolvarii. Si ar zice, “OK, am inceput cu mere, intuiesc faptul ca si cu pere as ajunge la acelasi rezultat, hai sa incerc cu extragere din cutia etichetata Mixt”.
Unul foarte intuitiv, inteligent, ori sistematic, aplecat spre detalii ar clasifica inca de la inceput cutiile: Cutii uni-fruct si cutii bi-fruct. Ar face legatura intre faptul ca exista o singura extragere si o singura cutie in una din categorii (Mixt), si ar incepe cu extragere din aceasta. Aici ramane ca intervievatorul sa stabileasca daca a fost vorba de intuitie, nimereala sau analiza sistematica.
Problema se rezolva extragand un fruct din cutia etichetata Mixt:
- Mixt nu poate fi, daca e mar o etichetam cu “Mere”. Cutia etichetata gresit “Pere” nu poate avea pere si nici mere deoarece am etichetat deja o cutie cu “Mere”. Deci va fi mixta. Cea etichetata gresit cu “Mere” va avea, evident, pere. Si aici se poate observa intuitia in cazul in care a doua eticheta n-ar fi pusa pe cutia etichetata gresit “Pere” ci incercarea, mai dificila, de a eticheta cealalta cutie.
- Analog daca din cutia etichetata Mixt am extrage o para.
Problema 3: Cirese cu balanta
Avem 14 kilograme de cirese, o balanta, si o greutate de 2 kilograme. Cum obtinem 5 kilograme de cirese intr-o galeata din maxim 2 cantariri? Dar 3 kilograme?
N-o sa mai explic metodologia de evaluare a gandirii analitice / sistematice, a capacitatii de conceptualizare, abstractizare, concretizare ori a intuitiei. Se intelege de mai sus.
Rezolvare: se imparte cantitatea de cirese in doua obtinand 7 kilograme intr-o galeata si 7 in cealalta. se extrag 2 kilograme dintr-o galeata de 7 kilograme echilibrand cu greutatea de 2 kilograme pe care o avem, obtinand astfel 5 kilograme de cirese in acea galeata.
Partea a doua a problemei este una in care gandirea analitica ori sistematica nu prea te ajuta. Poti observa in continuare automotivarea, conceptualizarea etc. atunci cand candidatul incearca sa gaseasca orice solutie posibila de exemplu, scotand 2 kilograme din 14 apoi impartind la 2 si tot asa.
Aceasta parte a problemei este una care testeaza mai mult: “out of the box thinking”-ul. Exista un moment in care trebuie sa te opresti si sa zici STOP! Nu pot scoate 3 din 14 facand una dintre cele 2 operatii: scadere cu 2 ori impartire la 2, de maxim 2 ori. Trebuie sa fie altceva, ce nu se specifica explicit in problema ci trebuie dedus.
Se pune greutatea de 2 kilograme pe unul din talere. Se pun toate ciresele pe ambele talere astfel incat balanta sa fie echilibrata. Vom obtine 8 kilograme de cirese pe un taler si greutatea de 2 kilograme pe un taler plus alte 6 kilograme de cirese. Cantitatea de 6 kilograme de cirese se imparte la 2 obtinand 3 kilograme din doua cantariri.
Cam asta e tipul de probleme de “thinking”, inteligenta, logica etc. pe care vi le propun. Trebuie totusi avut in vedere ca la un interviu, al carui scop este exclusiv evaluarea, de multe ori nu conteaza complexitatea problemelor ci modul de lucru al candidatului.
Voi reveni cu mai multe probleme de conceputalizare, abstractizare, extindere a gandirii etc., in care se testeaza skilluri putin diferite.
Nonconformism sau abordare critica a muncii?
Exista foarte multe companii in Romania care incalca drepturile salariatilor. Patronii, pentru simplul motiv ca detin banii, si nu neaparat obtinuti pe cai legale, cred ca au drept de viata si de moarte asupra angajatilor loc. Se considera superioari ori zei calauzitori, in asemenea masura incat uneori au impresia ca pot coordona si viata personala a angajatilor, daca le permit sa aiba una.
Citeam pe siteurile gen “despre firme”, tot felul de comentarii si lucruri trasnite inventate de patronate pentru a transforma angajatul intr-un mic sclav. De fiecare data cand apare un comentariu gen:
- M-au fortat sa fac ore suplimentare si nu m-au platit
- Mi-au promis bonusuri si nu mi le-au dat
- M-au amenintat continuu, m-au pus sa semnez tot felul de hartii la angajare si din pacate am semnat fara sa citesc niste enormitati
- M-au tratat neprofesionist, aproape umilitor
… vin si cateva comentarii, evident interesate, din partea firmelor dar sub acoperire:
- Esti un frustrat, investesti prea mult timp intr-o frustrare
- Nu esti capabil sa rezisti la stres
- Nu esti profesionist
In general Arhitectul va recomanda:
- Nu mergeti la firme care genereaza frustrari in randul angajatilor
- Nu acceptati joburi la firme in care va trebui sa fiti stresati
- Comportamentul neprofesionist inseamna cu totul altceva decat atitudinea critica asupra muncii.
Frustrarile, daca exista si sunt reale, pleaca de la un lucru negativ pentru angajatul respectiv. Daca sunt destui frustrati in firma inseamna ca exista o sansa ca si tu sa devii unul. Daca-ti exprimi nemultumirea cu argumente care pot fi probate fata de o situatie ilegitima daca nu chiar ilegala, nu inseamna ca esti frustrat! In general, profesionist nu inseamna unul care tace si inghite orice.
Sunt unele firme care la interviu trimit un onanist, eventual un team leader, de multe ori inadaptat social, care pentru a-si dovedi lui insusi bartatia, incepe a te intreaba tot felul de chestii superspecifice, nu cu scopul de a te evalua obiectiv ci cu scopul de a-ti dovedi ca el e mai bun decat tine. Dupa care iti ofera jobul avand deja un avantaj psihic asupra ta, sau nu ti-l mai ofera deloc… nu conteaza. Dar la sfarsit spune ca s-a comportat asa pentru a observa cum reactionezi sub stres. Aceasta nu este unica situatie in care esti evaluat la capitolul “munca sub stres”.
Pai acestor firme, si acestor indivizi le raspundem asa:
- Scopul pentru care vin la munca nu este acela de a ma stresa ci acela de a produce ceva.
- Situatiile de stres intr-un mediu profesionist ar trebui sa fie exceptia si nu regula, pentru ca a fi profesionist inseamna a produce bani si nu a stresa ori a fi stresat. Asadar o firma care ma testeaza la interviu pe o situatie care ar trebui sa fie de exceptie… nu are comportament corect fata de angajati.
Pentru toate acestea, si pentru alte cateva chestiute, sunt considerat nonconformist de catre HR-izde in ce priveste abordarea muncii. Prefer insa obiectivitatea si logica simpla in detrimentul prostiei si a afacerilor de tip romanesc. Unde nu prea conteaza concepte gen: “castig de ambele parti”, ci mai mult “daca rezisti tu ca angajat sub stres”, satisfacand prin aceasta sefului nevoile de putere.
Recursive backtracking: A Java Implementation for Knight’s Tour Problem
Knight’s tour problem: A knight is placed on an empty board. Moving it according to the rules of chess you must visit each square exactly once.
The initial knight position is read from a properties file as well as the board dimensions. Even though a normal chess table is 8 squares long and wide, it would take very a long time to finish the execution of this algorithm so we have to chose smaller boards (like 5×5) .
The solutions to this problem are printed in a file.
The solution should be printed as a matrix containing each step number as values (i.e. the value of the matrix element [3][5] is 7 if the represented square was visited at step 7).
Here’s the Java implementation, and some explanations in the end:
… see the code in the article…
I don’t think you can understand much of this code, not when it is indented like this anyway, but I advice you to put it in Eclipse, or some Java IDE, indent it and read the following…
First of all you have to create a project, create a .java file named KnightsTour and copy the code above.
Also, If you want to change the input parameters create a knightsTour.properties file in the same directory, like this:
… see the code in the article…
How does the algorithm work?
- Let’s define the data structures you are working with
A Tag is an object containing:
- a square coordinates on the board like (2,3)
- a list of future possible coordinates where the knight may be moved, according to: the rules of chess and the already visited squares on this table. Also we have to be careful not to jump out of the table ![]()
- a method for iterating through the list above
- a method to generate this list
The branch is the stack of visited tags, each of them having their iterators placed according to the moves we’ve made.
The algorithm:
- going forward means a recursive call to the back() method using a next possible position, making this position the current one and adding it to the stack (I called it branch).
- going backwards is actually returning from the recursive call of the back() method, deleting the tag on the top of the stack (the current position), and iterating forward through previous tag list of possible moves.
Basically… we go forward as much as we can. When we get stuck on a tag (there are no more possible squares to jump on) we turn back, delete this tag, and try the next possible square of the previous tag’s list. Deleting the tag we leave when turn back from it, is very important because we might jump on it at a later time, coming from an other path (branch), so its list of future possible positions has to be regenerated.
More comments on the code.
Enjoy!
Afla nameserverul unui domeniu
Atunci cand iti cumperi un domeniu de la un seller si vrei sa-l gaszuiesti in alta parte va trebui sa-i setezi mai intai nameserverul hostului. Dupa ce ai facut operatiunea va trebui sa astepti o perioada pentru a se propaga dupa care sa setarile necesare pe care ti le da noul ‘hoster’.
Pentru a afla cand s-a propagat schimbarea de nameserver poti sa folosesti urmatoarea comanda:
command line> nslookup
> set querytype=soa
> stackoverflow.com (siteul tau)
Server: 217.30.180.230
Address: 217.30.180.230#53
Non-authoritative answer:
stackoverflow.com
origin = ns51.domaincontrol.com # (“primary name server” on Windows)
mail addr = dns.jomax.net # (“responsible mail addr” on Windows)
serial = 2008041300
refresh = 28800
retry = 7200
expire = 604800
minimum = 86400
cand iti apare noua adresa te poti apuca de treaba.





