Arhiva Categoriei ‘Tehnologie/Internet’
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.
Tepe si tepari
Elucubram cu gratie pe FB mai devreme descoperind ca munca innobileaza omul, dar nici de lene n-a murit nimeni. Si cum n-aveam de munca ci doar de lenevit, m-am gandit sa dau un click pe un site dintre cele stupizele gen “Afla-ti data mortii”, “Vezi cum vei arata peste 30 de ani”, “Vezi cu cine a facut-o mata pe sor’ta” etc…
Campaniile agresive de promovare ale acestor speculanti de buguri intelectuale ale oamenilor, majoritatea de buna credinta, m-au motivat in questul meu de a intelege “afacerea”. Adica inselatoria.
Pai e simplu. Am ales “Afla cum vei arata peste 30 de ani“, am dat o caruta de date personale p-acolo care, posibil, n-au nici o legatura cu evaluarea fetei tale peste 30 de ani, dupa care am dat GO.
Cu litere mari sub poza iti apare un text de genul: Trimite un SMS la numarul de telefon bla bla. Vei primi un cod pe care sa-l introduci aici! Codul costa, atentie: 0,05E.
Stiam ca nu are cum sa fie adevarat, de altfel e si stupid sa crezi ca poti primi un SMS la costuri mai mici decat cele ale unui SMS normal. Care daca nu ma insel costa 0,07E. Asadar am inceput sa citesc mai departe pe site. Si? Ce sa vezi?
In josul paginii, cu litere mici, apropiate de culoare fondului, costul SMS-ului pe care il trimiti este de 3E si trebuie sa trimiti 2 SMS-uri, nu stiu cum… Deci 6,05E in total. Asta e inselatorie? sau ce?
Pai nu e inselatorie, vor spune cei care se apara, pentru ca tu esti de acord cu conditiile siteului inainte sa faci orice. Iar acolo esti informat despre costuri. Dar hai sa vedem ce inseamna inselatorie.
Pai inseamna ca promiti ceva, primesti banii dar nu te tii de cuvant. Sau promiti ceva pentru niste bani dar taxezi mai scump. Sau te bazezi pe buna credinta a cuiva si te folosesti de ea pentru a obtine niste bani de la acea persoana, fara sa fie informata cu buna credinta si din partea ta.
Cand scrii costurile reale in josul paginii cu litere mici apropiate de culoarea fondului, si te bazezi pe faptul ca utilizatorii siteului tau nu citesc regulile siteului, deci te bazezi pe buna lor credinta ca sa-i rupi cu taxele… din punctul meu de vedere, adica al unui cetatean liber care traieste intr-o tara democrata in care dreptul la opinie si la exprimare e garantat, esti la limita inselatoriei.
Sfatul meu e sa cititi bine regulile acestui tip de siteuri, chiar si pe cele ascunse in josul paginilor, ca sa nu aveti surprize cand va vine factura la telefon. 6 Euro si ceva inseamna totusi o masa la restaurat, pe care multi o cedeaza unora care stiu sa profite de buna lor credinta…
Starcraft Broodwar: strategii
O sa ne ocupam aici de jocul pe Fastest Map, strategia Zergului, asa cum o vad eu dupa peste 2000 de meciuri pe BattleNet din care peste 1200 castigate.
Zergul are doua sanse. Una rapida, rash si una lenta, mass. Pe mass nu prea bate nimic zergul dar din pacate in etapa intermediara acesta e destul de slab, poate cea mai slaba rasa. Ca sa nu vorbim in termeni absoluti de starcraft, pentru ca nu se poate, vom spune totusi ca un jucator de alta rasa cu tine dar cu un APM (Actions Per Minute) superior, te va bate in orice moment al jocului.
Asadar, la inceput ai 2 sanse:
- 5 pool: la a 5-a drona astepti pana faci 200 de minerale, dupa care faci pool, apoi inca 2 drone si Overlord.
- cand iese poolul vei avea 3 larve, faci zerlingi, dai relay point in baza adversarului, pui zerlingii pe control imediat ce ies.
Acest rash merge la orice rasa, la Protos in cazul in care are un singur pilon care tine toate cladirile… jocul aproape ca s-a terminat. Terranul poate sa aiba un marin pana ajungi tu dar daca te misti bine ii faci ravagii prin SCV-uri. La zerg poti pleca pe sunk rush… dupa ce faci poolul continui cu drone pana cand constructia acestuia e la jumatate. Tii Overlordul deasupra bazei lui si pui dronele ca construiasca direct tureta in baza… ca sa nu mai stai acolo sa le invartesti… eventual poti pleca si cu 2 sau 4 zerlingi cand ies…
In timp ce faci rashul trebuie sa fii atent in baza, sa construiesti continuu. Vei avea nevoie probabil de un sunk sau doua la jocurile de echipa pentru ca, in mod normal te vor retalia imediat.
Daca nu pleci pe rash, si nu ai fost scoutat, nu are sens sa pleci pe pool la a 9-a proba. Este testat, Protosul nu are cum sa ajunga la tine daca la a 9-a proba faci hatch, apoi sunk. Terranul poate sa ajunga dar te poti apara cu zerlingi pana faci sunken.
Asadar ordinea e: 9 drone, Overlord, hatch, urmatoare drona eventual la minerale, a 11-a drona pool. Apoi hatchuri si sunkenuri. Daca vrei sa risti mult, in functie si de evolutia jocului, poti face intai 4 hatchuri si apoi sunken-ul. Daca iti reuseste asta, in general nu prea mai are nimeni ce sa-ti faca…
Daca nu pleci pe rash, pleci pe dezvoltare sau nu merge rashul, continui in ordinea urmatoare:
- 4 hatch-uri
- In functie de cat de mult vrei sa risti, poti construi sunken-urile mai devreme sau mai tarziu. Eu recomand 5 sunken-uri, bine ascunse in spatele cladirilor, in asa fel incat, la un eventual atac de zeloti sa poti sta in picioare cat mai mult.
- 2 gaze. In general cand te apuci de gaze, intre drona 14 si 16, dai de Overlord. La 19 sau 20 trebuie sa iasa Overlordul, in acelasi timp cu numarul de unitati pe care il faci. Imediat ce iese acest Overlord dai de urmatorul, pentru ca 8 drone le faci imediat, pentru gaz si pentru minerale.
- Faci drone continuu pana la 37 de unitati. Doua gaze sustin 4 hatchuri in conditii de mass. Trei gaze sustin 6-7 hatchuri. In general pe mass de hydre ai nevoie de 6 gaze vreo 35 de drone la minerale si 14-16 hatchuri… mai multe nu sunt folositoare, pentru ca poti sta linistit in 200 cu… sa zicem 15 hatchuri…
Sa ne intoarcem totusi la drona 20. Aici ai mai multe variante:
- Massul de zerlingi. Se face construind inca 2 hatchuri, punand inca 5-6 drone la minerale, dand upgradeul de viteza la zerlingi.
- Apoi Overlord – Zerlingi continuu pana in jur de 70 de unitati. Asta e momentul in care daca ataci bine ai o sansa buna sa dai peste cap pe cineva. In general asta e momentul ales de majoritatea jucatorilor pentru a face pasul urmator in tehnologie lasand-o putin mai moale cu armata… avantajul tau, acela de a nu fi tehnologizat si de a fi investit tot in armata, poate sa fie decisiv.
- Totusi, in timp ce faci massul de zerlingi obigat faci si al treilea gaz, faci cladirea de hydre, upgradezi hatchul… Cand ai terminat asaltul upgradeul de lurkeri trebuie sa fie pe drum daca nu chiar gata. Retalierea lor poate sa fie puternica dar in majoritatea cazurilor nu au observer… Cu siguranta Protosul nu are, terranul chiar daca are… marinii nu trec de lurkeri… zergul la fel… nu trece cu zerlingi.
- Intre al 4-lea si al 6-lea hatch trebuie sa fii atent ca nu cumva terranul sa-ti blocheze mineralele cu vreo cladire zburatoare.
- Trebuie sa fii atent la rashul de cannonuri al Protosului… se stopeaza foarte usor cu sunkuri… fara frica. Apoi pleci pe hydre + Dark Swarm sau Gardieni… recomand Hydrele cu Lurkeri…
- Trebuie sa fii atent la rashul de Mutalisti… In cazul in care observi gaze multe la un inamic Zerg faci 2 cladiri de Hydre si upgradezi atat distanta la care sa traga cat si Lurkerii. Faci Hydre si le tii langa baza.
- Daca faci lurkeri iti trebuie minim 3 gaze
- Daca pleci tu inasati pe Mutalisti iti trebuie toate gazele… dar la inceput ajung 4, restul le faci pe parcurs
- Pe Mutalisti pleci cand unul dintre inamici a facut rash dupa care s-a aparat cu canoane la intrare, sau oriunde daca e Zerg… in alte conditii nu prea renteaza… poate doar sa faci acel atac surpriza in schimb, daca coechipierii celui caruia i-ai scos baza principala nu sunt noobi, in secunda 2 ar trebui sa fii scos…
- Atentie la dropul de reaveri… se stopeaza facand 2 turete aeriene plus cativa lurkeri, ori cu scourge… in general e bine sa lasi un mic loc intre cladirile din spatele bazei si sa pui acolo lurkerii… in 80% din cazuri vor face drop fix in capul Lurkerilor. Daca-ti face dropul de reaveri, sau il vezi ca pleaca pe reaveri, in secunda 2 pleci pe “pasari”!
- Terranul bun, care pleaca pe siegeuri totdeauna poate fi infrant cu Gardieni…
Indiferent pe ce strategie pleci pana la drona 37:
- Dai upgradeul de viteza la Overlorzi
- Cand e la jumatate pui Qeen’s Nestul
- Cand se termina upgradeul de Overlorzi upgradezi imediat baza
- Faci cladirea de Defileri
- Dai upgradeul Consume, apoi pe cel de energie, apoi pe cel de Plague
- Daca e Protos si s-a inchis in baza aparandu-se cu Canoane si Dragoni mergi pe Zerlingi upgradati cu Ultralisti si Swarm… la fel si pe Terranul marini si goliati… daca are multe Siegeuri mergi cat mai mult pe Gardieni, proportia fiind aici foarte importanta…
Avantajele si dezavantajele Zergului:
- Asa cum spuneam Zergul e foarte rapid si face cel mai usor mass
- Pe Fastest Macroul fiind mult mai important decat Microul, mai ales cu cat avansezi in joc, Zergul devine foarte tare pe final, cand are tehnologia completa si poate sta fara probleme in 200 de unitati. Hydrele bat absolut orice la Protos: Dragoni, Cariere… orice. La terran Gardienii si swarmul pe ultralisti… intra in Siegeuri si e greu de batut…
- In partea intermediara, intre Zerlingi si Lurkeri Zergul e in general slab… un jucator mai slab decat tine te poate scoate daca joaca bine cu Marini + Medici, Zeloti + Dragoni sau mass de zerlingi mai puternic decat tine, in cazul in care ai plecat pe tehnologie…
- Dropul de Zerg e din punctul meu de vedere slab, decat la alt Zerg, prin tunelsau la inceput, dropul de Lurkeri, la Terran
- Avantajul cel mai important al Zergului este acela ca poate face cel mai bun mass dintre rase… daca nu-l exploatezi insa vei pierde sigur… Daca-l exploatezi bine vei castiga.
Dropul de Lurkeri la Terran se face plecand pe 4 hatchuri secundare si 3 gaze. Se upgradeaza 2 hatchuri, cand sunt ambele upgradate dai cele 2 upgradeuri la Overlorzi (viteza si transport) in acelasi timp cu cel de lurkeri. Iti trebe’ Overlorzi pana pe la 60-70 de unitati, atentie sa ai loc pentru upgradeul Hydrelor in Lurkeri. Imediat dupa ce dai upgradeurile strangi overlorzii intr-ul loc si faci Hydre pe care le duci sun ei. Apoi upgradezi Hydrele, cand ies Lurkerii ii incarci si duci totdeauna un Overlord gol in fata… ca sa nu-ti buseasca vreunul plin…
Va urez succese si GG
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!





