Numarul 42 - Decembrie 2015 - Today Software Magazine

Page 1

Nr. 42 • www.todaysoftmag.ro • www.todaysoftmag.com No. 36••Decembrie June 2015 •2015 www.todaysoftmag.ro • www.todaysoftmag.com

TSM

Download from

T O D A Y S O F T WA R E MAG A Z I NE

Windows Store

Comunicare în timp real cu alR ajutorul LeapMotion si Sign

IoT: from device to cloud

M E R R Y

C H R I S T M A S

Cluj IT Days 2015 Quality Assurance 101 ECMAScript 6 - de ce și cum să îl folosim Meet Jenkins De la Zero la RESTful în 4 pași. Fundația.

Bilanțul How To Web 2015 Impozitele pe clădiri la ce să ne așteptăm în 2016? 7 mituri despre muncă care sunt nocive pentru creierul tău



6 Cluj IT Days 2015 Ovidiu Măţan

8 Bilanțul How To Web 2015 Irina Scarlat

12 Interacțiunea Om-Computer: Comunicare în timp real cu ajutorul LeapMotion și SignalR George Rus și Daniela Fati

16 IoT: de la device la cloud Leonard Pitu

19 ECMAScript 6 – de ce și cum să îl folosim în prezent? Adrian Ulici

23 Quality Assurance 101 Vasile Selegean

22 Meet Jenkins Răzvan Ariciuc

32 De la zero la RESTful în patru pași Georgiana Gligor

35 Impozitele pe clădiri la ce să ne așteptăm în 2016? Ioana Costea

37 7 mituri despre muncă care sunt nocive pentru creierul tău Echipa Steelcase

39 Provocări pentru companii în 2016 Ana-Maria Trifan


editorial

L

Ovidiu Măţan

ovidiu.matan@todaysoftmag.com Editor-in-chief Today Software Magazine

a final de an, încheiem cu un mic bilanț al activității noastre din anul 2015. Constatăm cu bucurie că popularitatea revistei este în creștere, așa cum o dovedesc evenimentele de lansare la care participă tot mai multă lume. Numărul accesărilor online a trecut de 12,000 de sesiuni lunare. De asemenea, interesul e crescut și din partea programatorilor care trimit propuneri de articole. În ceea ce privește Cluj IT Days, evenimentul organizat spre final de an și care încununează activitatea desfășurată de-a lungul întregului an, acesta a fost apreciat ca un succes. Analiza feedbackului pe care ni l-a oferit publicul, denotă acest fapt, dar în același timp și nevoia optimizării unor aspecte ce țin de organizarea evenimentelor de acest tip. Un prim articol din acest număr vizează tocmai ecoul pe care l-a avut acest eveniment în rândul participanților. Referitor la desfășurarea lansării acestui număr, introducem un element nou - nu mai avem răbdare până în 2016 - prin transmisia live1 a evenimentului de lansare pe canalul nostru de YouTube. În acest fel veți putea să ne fiți alături chiar dacă nu sunteți în Cluj și veți avea ocazia să adresați întrebări celor care prezintă. Tot cu ocazia acestui număr, deschidem și o nouă rubrică destinată noutăților din industria IT. Planurile de viitor includ înființarea unor rubrici permanente care vor aborda limbaje și tehnologii software : Java, .NET, SAP, Management/Agile, HR, Mobile (iOS, Android, Windows Phone) & IoT, Stundenți/Universitare, Big Data/Machine learning, Arhitectură, Securitate, web & design și Testare. Aceasta se va realiza prin crearea unor grupuri de specialiști care vor putea colabora și realiza review-uri specifice. Surpriza va veni la ediția din 2016 a Cluj IT Days, atunci când plănuim să publicăm câteva cărți cu articolele publicate în timpul anului în revistă. Revenim la acest număr, începem cu două articole de IoT. Primul propune o noutate în ceea ce privește interacțiunea cu un calculator: Interactiunea Om-Computer: Comunicare în timp real cu ajutorul LeapMotion SignalR, iar cel de-al doilea prezintă riscurile la care suntem supuși atunci când intrăm în acest spațiu IoT: from device to cloud. Continuăm cu noul standard pentru limbajul JavaScript: ECMAScript 6 – de ce și cum să îl folosim în prezent? Din perspectiva quality assurance vorbim despre definirea și implementarea unui proces de management al calității într-un proiect de dezvoltare software în Quality Assurance 101. Un articol introductiv în Jekins, Meet Jenkins, sperăm să vă facă curioși în legătură cu acest limbaj de programare. Inițiem o serie de articole orientate spre domeniul web, care în acest număr vor descrie realizarea practică a unor microservicii, precum în articolul De la Zero la RESTful în 4 pași. Fundația. Încheiem cu noutățile fiscale pentru companii în Provocări pentru companii în 2016. Vă doresc o lectură plăcută !

Ovidiu Măţan

Fondator al Today Software Magazine

1 https://www.youtube.com/todaysoftmag/live

4

nr. 42/2015, www.todaysoftmag.ro


Redacţia Today Software Magazine Fondator / Editor in chief: Ovidiu Mățan ovidiu.matan@todaysoftmag.com Graphic designer: Dan Hădărău dan.hadarau@todaysoftmag.com

Lista autorilor Ovidiu Măţan ovidiu.matan@todaysoftmag.com Editor-in-chief Today Software Magazine

Irina Scarlat

Copyright/Corector: Emilia Toma emilia.toma@todaysoftmag.com Traducător: Roxana Elena roxana.elena@todaysoftmag.com

Programator junior: Alexandru Diniș alexandru.dinis@todaysoftmag.com Marketing și tehnoredactor: Ana Maria Bivol anamaria.bivol@todaysoftmag.com

Răzvan Ariciuc razvan.ariciuc@yonder.com

CMO @How to Web & TechHub Bucharest

QC engineer @ Yonder

robin.molnar@3pillarglobal.com

Today Software Solutions SRL str. Plopilor, nr. 75/77 Cluj-Napoca, Cluj, Romania contact@todaysoftmag.com

www.todaysoftmag.ro www.facebook.com/todaysoftmag twitter.com/todaysoftmag ISSN 2284 – 6352

Georgiana Gligor gb@tekkie.ro

QA Engineer @ 3Pillar Global Blog @ robintel.ro

Owner @Tekkie Consulting

George Rus George.Rus@yardi.com

Ioana Costea ioana.costea@ aiconsulting.ro

Software Developer @ Yardi România

Tipar realizat de Daisler Print House Produs de

QA Officer @ISDC

irina.scarlat@howtoweb.co

Robin Molnar

Contabil : Delia Mircea delia.mircea@todaysoftmag.com

Vasile Selegean vasile.selegean@ isdc.eu

Daniela Fati Daniela.Fati@yardi.com Software Developer @ Yardi România

Expert contabil Managing Partner @ A&I Consulting

Adrian Ulici Adrian.Ulici@3pillarglobal.com Software Engineer @3Pillar Global

Leonard Pitu leonard.pitu@siemens.com

Ana-Maria Trifan anamaria.trifan@happy-employees.eu

Senior Key Expert/Research Engineer @CT RTC ELE ELD-RO @ Siemens

PR & Custumer Care Specialist @ Azimut Happy Employees

Copyright Today Software Magazine Reproducerea parțială sau totală a articolelor din revista Today Software Magazine fără acordul redacției este strict interzisă. www.todaysoftmag.ro www.todaysoftmag.com

www.todaysoftmag.ro | nr. 42/decembrie, 2015

5


eveniment

Cluj IT Days 2015

C

luj IT Days 2015 a devenit un eveniment de referință pentru comunitatea de IT clujeană. Am avut peste 320 de participanți care timp de două zile au putut asista la prezentări tehnice de calitate și care au demonstrat capacitatea noastră de inovație dar și de integrare a ultimelor tehnologii în proiectele noastre curente. Pentru acest articol de review, am decis să includem articolul publicat pe blogul său de Robin Molnar, articol pe care l-am descoperit întâmplător după eveniment. Ca la orice eveniment pluridisciplinar și multitehnologic, unele prezentări au fost de interes pentru mine, altele nu, unele au fost mai interactive, altele mai statice… Cel mai important, însă, este faptul că: 1. Am avut acces la tehnologii la care altfel nu aș fi avut acces. 2. Am avut acces la câteva idei pe care, în alte condiții, le-aș fi aflat pe banii mei, după luni sau ani de muncă. Idei și informații despre procesarea unui număr mare de mesaje pe secundă folosind Microsoft Azure, ori despre cum se automatizează o casă inteligentă. Am aflat că generația mea, generația Y, are doar 39% șanse să schimbe lumea, în timp ce noua generație, generația Z, are 60% șanse să schimbe lumea sau, mai important pentru mine, ce probleme poți întâlni la testarea automată și la testarea de performanță și, mai ales, de ce… 3. În mod deosebit, mi s-a părut

grozav de utilă prezentarea ținută de Peter Lawrey despre Low Latency in Java 8. De mulți ani n-am mai întâlnit pe nimeni care să se ocupe de bytecode la un asemenea nivel. Practic, omul te învață acum să faci ceea ce programatorii anilor dintâi făceau des: având memoria mică și cicluri de CPU puține, aceștia își optimizau la sânge codul. Dacă ți se pare că acum nu avem nevoie de asta, înseamnă că este musai să participi la o prezentare ținută de Peter Lawrey, ca să înțelegi ceea ce acum nu înțelegi. Grozavă prezentare, ținută de un hacker în sensul arhaic al cuvântului. 4. M-am jucat cu Oculus Rift2, cu un alt headset de realitate virtuală de la HTC, îmi scapă acum modelul, iar jocul extrem de detaliat era făcut de Exosyphen Studios. Mă joc Fallout 4, un joc foarte detaliat, dar ce au făcut oamenii ăștia era și mai detaliat! Am băut cafea făcută de un robot pe nume Baxter, m-am jucat Sursa: http://www.robintel.ro/blog/tech/cluj-it-days-2015/

6

nr. 42/decembrie, 2015 | www.todaysoftmag.ro

cu Vector Watch, m-am jucat cu diverse dispozitive cu Windows 10, de la Lenovo și nu numai, m-am holbat la imprimante 3D și am învățat cum se programează unele… 5. Deși a fost obositor și zgomotos, a meritat să particip la Cluj IT Days. Am trăit experiențe noi, am încercat chestii noi, am intrat în contact cu tehnologii noi. A fost inedit!

Robin Molnar

robin.molnar@3pillarglobal.com QA Engineer @ 3Pillar Global Blog @ robintel.ro


programare

Planuri de viitor și statistici Mulțumim în primul rând pentru feedbackul acordat, care este foarte folositor pentru organizarea Cluj IT Days-ului din 2016. Ne-ar plăcea ca la următoarea ediție să avem un track cu subiectul Hands on Lab în care prezentările să aibă o durată de cel puțin o oră.Intenționăm ca unul dintre dintre track-uri să se desfășoare în limba engleză. Din perspectiva de organizator, principalele noutăți și provocări ale acestei ediții au fost: • realizarea celor două track-uri paralele; • crearea unei zone de gadget show în cadrul căreia partenerii să poată expune ultimele noutăți și realizări; • restructurarea întregii agende astfel încât să nu mai avem problema depășirii timpului alocat; • înregistrarea la nivel profesional a întregului eveniment și postarea acesteia și a slide-urilor pe site.

Overall, how would you rate the quality of the event?

TODAY SOFTWARE MAGAZINE

Un proiect pe care vom încerca să îl realizăm pentru 2016 este publicarea de cărți de specialitate. Acesta se va baza pe articole publicate de diferite grupuri tehnice: Java, .NET, SAP, Management/Agile, HR, Mobile (iOS, Android, Windows Phone) & IoT, Stundenți/Universitare, Big Data/Machine learning, Arhitectură, Securitate, web & design și Testare. Astfel participanții la eveniment vor putea să își aleagă ce carte doresc să primească în welcome package. Media locală a relatat despre eveniment: un reportaj și un interviu a fost difuzat la știrile de la ora 18:00 la Digi24 Cluj, iar Ziarul de Cluj a publicat un articol despre acesta. În continuare, vă prezentăm feedbackul primit de la participanți. La o primă analiză, acesta arată succesul ediția din 2015 a Cluj IT Days poate fi considerat un succes, dar și că există aspecte care pot fi îmbunătățite.

How helpful was the content presented at the event?

În încheiere dorim să mulțumim partenerilor care au fost alături de noi la această ediție: Microsoft, Yardi, 3Pillar Global, Gemini Solutions, Accenture, Accesa, Blade Solutions, Banca Transilvania, Subsign, Colors in Projects, Telenav, Yonder, Betfair, Bosch, Frequentis, Ve Interactive, Ullink, Lohika, Cos, Endava precum și celor ce ne-au ajutat în promovarea evenimentului: Cluj IT Cluster, Cluj Hub, Agora, AdHugger, Loopaa, Softlead, RABS, Free Wifi, IT Channel și Tech Hub. Mulțumim participanților și vă așteptăm la Cluj IT Days 2016 !! How engaging were the speakers at the event?

Ovidiu Măţan

ovidiu.matan@todaysoftmag.com Editor-in-chief @ Today Software Magazine Organizator @ Cluj IT Days

www.todaysoftmag.ro | nr. 42/decembrie, 2015

7


eveniment

Bilanțul How To Web 2015

B

ranch Track, start-up-ul care creează simulări interactive pentru pregătirea angajaților în vânzări și alte domenii conexe, a câștigat How to Web Startup Spotlight, competiție și program de mentorat cu premii în valoare de 20.000

Irina Scarlat

irina.scarlat@howtoweb.co CMO @How to Web & TechHub Bucharest

USD. Pe locul al doilea s-a clasat Jaboo, set de brățări inteligente care accelerează și îmbunătățesc tehnica sportivilor prin măsurarea vitezei, a forței și a caracteristicilor antrenamentelor. Cea de-a patra ediție Startup Spotlight a avut loc între 25 și 27 noiembrie în București, în cadrul How to Web Conference 2015. How to Web Startup Spotlight 2015 a adus împreună 30 de start-up-uri în domeniul tehnologiei din 9 țări din Europa Centrală și de Est. Prima zi a programului s-a desfășurat într-un cadru privat, la TechHub Bucharest, iar juriul a ales cele 8 echipe care și-au prezentat ulterior produsele pe scena principală a conferinței. Evenimentul a continuat cu două workshop-uri : unul despre tehnici de ecommerce pentru îmbunătățirea vânzărilor de software la nivel global, susținut de Adriana Iordan, Chief Product Evangelist, Avangate, și cel de-al doilea, despre SaaS în practică, susținut de Sorin Pește, Technical Evangelist, Microsoft. Pe parcursul următoarelor zile ale programului, finaliștii Startup Spotlight și-au prezentat produsele pe una dintre cele două scene ale How to Web Conference 2015, au primit feedback și au avut acces la oportunități unice de investiții și distribuție, participând la un număr total de 384 de sesiuni de mentorat unu la unu.

În urma deliberării, Branch Track, startup din Letonia care creează simulări interactive pentru pregătirea angajaților în vânzări și alte domenii conexe, a fost desemnat marele câștigător al How to Web Startup Spotlight 2015. Pe locul al doilea s-a clasat Jaboo, set de brățări inteligente care accelerează și îmbunătățesc tehnica sportivilor prin măsurarea vitezei, a forței și a caracteristicilor antrenamentelor. Symme 3D, o platformă delta multifuncțională pentru imprimare 3D și inscripționare cu laser, a primit IXIA Innovation Award, în timp ce SafeDrive, aplicație mobilă care îmbunătățește siguranța traficului răsplătind șoferii care nu utilizează telefonul la volan, a primit premiul pentru cea mai bună prezentare din cadrul programului. Câștigătorii au primit premii cash în valoare totală de 20.000 USD oferite de IXIA, principalul partener al programului. Startup Spotlight s-a desfășurat în cadrul How to Web Conference 2015, cel mai important eveniment dedicat inovației în tehnologie și antreprenoriatului din Europa de Sud-Est, organizat în colaborare cu Telekom Romania, Bitdefender, IXIA și CyberGhost. Cea de-a șasea ediție internațională a conferinței a avut loc pe 26 & 27 noiembrie și a adus împreună fondatori de start-up-uri, product manager-i, programatori, marketer-i și lideri de comunități din Europa Centrală și de Est.

În plus, acestea au concurat pentru premiile în valoare totală de 20.000 USD oferite de IXIA, partener principal al proPe toată durata evenimentului, aceștia gramului. Juriul a avut misiunea deloc au avut acces la oportunități de networking ușoară de a alege câștigătorii competiției. excelente cu actori relevanți din industria

8

nr. 42/2015, www.todaysoftmag.ro


TODAY SOFTWARE MAGAZINE tech la nivel global. Participanții au avut ocazia de a dezvolta conexiuni valoroase, de a face schimb de bune practici și experiențe, dar și de a identifica posibile modalități de colaborare. Toate acestea, utilizând o gamă de activități și instrumente dezvoltate pentru a facilita interacțiunile sociale: sesiunile de “Ask the expert”, mesele rotunde, petrecerile și evenimentele de networking și, nu în ultimul rând, How to Web Meet, aplicația mobilă a conferinței. În plus, participanții How to Web

schimbă lumea. De la exoscheleți și primul scuter electric inteligent din lume și până la dispozitivul de securitate care protejează toate aparatele din casă conectate la internet, participanții How to Web au avut ocazia să testeze 12 produse inovatoare în zona de expo și au asistat la 6 demonstrații live care au avut loc pe scena principală a conferinței. 89 de speakeri, mentori și investitori au urcat pe cele două scene ale conferinței... Aceștia au susținut 28 de prezentări și 11 paneluri... 30 start-up-uri cu potențial din 9 țări au participat la How to Web Startup

ecosistem.“How to Web este un eveniment pentru comunitate care se întâmplă în fiecare an cu sprijinul unui număr foarte mare de oameni care își unesc eforturile pentru a face lucrurile să se întâmple. Le mulțumim partenerilor noștri, ambasadorilor, voluntarilor, întregii echipe și fiecărui participant în parte. How to Web Conference 2015 a fost un eveniment reușit datorită implicării active a fiecăruia dintre ei și suntem convinși că, împreună, vom reuși să organizăm o ediție și mai bună anul viitor”, a declarat Daniel Dragomir, CEO al How to Web Conference 2015. How to Web Conference 2015 a fost un eveniment organizat în colaborare cu Telekom Romania, Bitdefender, IXIA și CyberGhost, cu sprijinul partenerilor Microsoft, Avangate, hub:raum, Ambasada Canadei în România, Mozilla, EIT Digital, Okapi Studio și Softlayer și al partenerilor logistici Clever Taxi, mReady, Aqua Consulting, Mucca, mobilPay, Marketizator, Zelist Monitor, TradeAds Interactive, AdLemonade, Ciuc, Aqua Carpatica și Domeniile Sâmburești.

Despre How To Web

Conference 2015 au avut ocazia unică de a învăța bune practici și lecții din experiența unor antreprenori și profesioniști remarcabili care au urcat pe cele două scene ale conferinței și au susținut 28 de prezentări practice și 11 paneluri care au abordat subiecte relevante pentru audiență. Înregistrările vor fi disponibile în curând pe canalul YouTube al How to Web. La toate acestea se adaugă posibilitatea de a descoperi ultimele tendințe din industrie și modul în care tehnologia

Spotlight și au beneficiat de 384 de sesiuni de mentorat specializate... 12 produse inovatoare au fost expuse în zona de expo, iar 6 dintre acestea au fost prezentate live pe scena principală a conferinței. 21 de comunități active din regiune și-au prezentate inițiativele și planurile pentru viitor în cadrul How to Web Community Spotlight. Bilanțul How to Web la câteva zile de la încheierea evenimentului aduce vești bune pentru comunitatea profesioniștilor în tehnologie din regiune și reflectă evoluția întregului

How to Web este cel mai important eveniment dedicat inovației în tehnologie și antreprenoriatului din Europa de Sud-Est. Conferința se adresează inovatorilor în tehnologie, antreprenorilor, dezvolatorilor de produse tech, agențiilor și companiilor de outsourcing interesate de inovație, investitorilor și tuturor celor interesați de tehnologie și inovație. Mai multe detalii despre eveniment și lista vorbitorilor confirmaţi pentru ediţia de anul acesta sunt disponibile online pe site-ul conferinţei.

www.todaysoftmag.ro | nr. 42/decembrie, 2015

9


noutăți

Noutăți IT

I

naugurăm rubrica de noutăți în industria IT. Aceasta va cuprinde o selecție de știri globale dar și locale. Noutățile pot fi semnalate direct la: news@todaysoftmag.com

Google: Calculatorul quantic D-Wave 2X este de 100 milioane mai rapid decât un calculator normal

D-Wave 2X folosește qubit1 care în afară de stări 0 și 1 ale unui bit are și starea de superpoziție a ambelor stări. Comparat cu o simulare pe un calculator cu un singur core D-Wave 2X este de 108 mai rapid. De asemenea, procesoarele2 folosite sunt pe 1000 de qubiți în vreme ce procesoarele clasice sunt pe 64 de biți. Mai multe detalii pot fi găsite pe Google Research Blog3.

Microsoft: suport de Objective-C în Visual Studiu Deși pare ireal, a fost lansată versiunea de preview a Windows Bridge for iOS (v.01) prin care se vor porta aplicațiile Objective-C pe platforma Universal Windows sau chiar dezvolta aplicații noi. Pentru cei interesați, se poate descărca fără a completa nici un formular de pe pagina proiectului, o mașină virtuală (~20GB) pentru un start-up rapid. Sursa: https://dev.windows.com/en-us/bridges/ios

Oracle: Java 9 va fi lansat doar în 2017

Apple: Swift este acum open source

Proiectul Jigsaw (Java 9) care are ca scop principal să adauge modularitate componentelor folosite la runtime. Astfel se va putea crea un runtime jar (rt.jar) care va conține doar componentele necesare. În acest fel, Java va scala mai ușor pe device-uri cu o putere mai redusă de procesare. Noua dată anunțată este martie 2017.

Oricine poate acum să descarce codul5 build-urile de development sau să fixeze bug-uri în Swift. A fost creat swift.org6 care este destinat comunității de programatori care dorește să contribuie.

Sursa: https://dzone.com/articles oracle-announces -jigsawdelays-push-java-9-launch

Sursa: https://developer.apple.com/swift/blog/?id=34

TechCrunch: Start-up-ul Jukedeck este câștigătorul TechCrunch Disrupt London

Jukedeck7, un start-up care generează automat muzică prin folosirea inteligenței artificiale a câștigat competiția TechCrunch Microsoft: Chakra, engine-ul de JavaScript al noului browser Edge Disrupt London. Soluția propusă de ei este de a genera ieftin este open-source fundal sonor pentru videoclipuri fără a încălca drepturile inteÎn cadrul conferinței JSConf din Florida, Microsoft a anunțat lectuale ale artiștilor. că va pune la dispoziția utilizatorului engine-ul noului său Sursa: http://techcrunch.com/2015/12/08/jukedeck-wins browser din Windows 10 sub licență MIT4. -disrupt-london-2015 – Sursa: http://arstechnica.com/information-technology/2015/12/microsoft-to-open-source-chakra-the-javascript-heart-of-its-edge-browser/ 1 https://en.wikipedia.org/wiki/Qubit 2 http://www.dwavesys.com/press-releases/d-wave-systems-breaks-1000-qubit-quantumcomputing-barrier 3 http://googleresearch.blogspot.ca/2015/12/when-can-quantum-annealing-win.html 4 https://en.wikipedia.org/wiki/MIT_License

PHP: Versiunea 7.0.0 a popularului limbaj este disponibilă PHP 7.0 vine cu o nouă versiune a engine-ului Zend care este până de două ori mai rapid decât versiunile anterioare și multe alte îmbunătățiri precum o mai bună folosire a memoriei sau optimizări de sintaxă. Acesta este efortul a doi ani de lucru a echipei de proiect și a numeroșilor contribuitori. Mai multe despre această nouă versiune de PHP puteți găsi în articolul8 dedicat din revistă. Sursa: http://php.net/archive/2015.php#id2015-12-03-1

Adobe: Animate CC va înlocui Flash Professional Animate CC va fi disponibil la începutul anului 2016 și va încorpora suport native de HTML5 și WebGL. Noul produs va suporta în continuare Flash (SWG) și formatul AIR, dar va putea exporta și în alte formate precum SVG. Sursa: http://blogs.adobe.com/conversations/2015/11/flash-html5-andopen-web-standards.html 5 http://github.com/apple 6 http://swift.org 7 https://www.jukedeck.com/ 8 http://todaysoftmag.ro/article/1679/php-7-o-privire-spre-viitor

10

nr. 42/decembrie, 2015 | www.todaysoftmag.ro


comunități

TODAY SOFTWARE MAGAZINE

Comunități IT

V

ă dorim sărbători fericite și ne vedem la începutul lui 2016 cu forțe proaspete și cu evenimente practice și interesante !

Transylvania Java User Group Community dedicated to Java technology Website: www.transylvania-jug.org Since: 15.05.2008 / Members: 598 / Events: 47 TSM Community Community built around Today Software Magazine Websites: www.facebook.com/todaysoftmag www.meetup.com/todaysoftmag www.youtube.com/todaysoftmag Since: 06.02.2012 /Members: 2700/ Events: 33

Calendar Decembrie 15 (Cluj) Lansarea numărului 42 al Today Software Magazine www.todaysoftmag.ro Decembrie 16 (Cluj) Apache Spark Workshop meetup.com/Big-Data-Data-Science -Meetup-Cluj-Napoca/events/227169515/

Cluj Business Analysts Comunity dedicated to business analysts Website: www.meetup.com/Business-Analysts-Cluj Since: 10.07.2013 / Members: 91 / Events: 8

Decembrie 16 (București) PMI: Symptoms of a Sick-Project meetup.com/PMI-Romania-BucharestProject-Management-Meetup-Group/events/227335062/

Cluj Mobile Developers Community dedicated to mobile developers Website: www.meetup.com/Cluj-Mobile-Developers Since: 05.08.2011 / Members: 264 / Events: 17

Decembrie 16 (Cluj) Kick-off sample learning project meetup.com/PHP-Cluj/events/227158930/ Decembrie 17 (Iași) Romanian Business Analysis Conference 2015 eventbrite.com/e/romanian-business-analysis-conference2015-rbac-2015-tickets-19080768091

The Cluj Napoca Agile Software Meetup Group Community dedicated to Agile methodology Website: www.agileworks.ro Since: 04.10.2010 / Members: 437 / Events: 93 PHP Cluj Our love for PHP gets us together Website: www.meetup.com/PHP-Cluj/ Since: 25.01.2013 / Members: 112 / Events: 6 Romanian Association for Better Software Community dedicated to experienced developers Website: www.rabs.ro Since: 10.02.2011 / Members: 251/ Events: 14

Decembrie 17 (Cluj) OpenStreetMapTime - missing bus stations in Cluj facebook.com/events/1523158184664319/ Ianuarie 16 (Cluj) Winning the Game of Business-Entrepreneur Night e ve nt br ite. c om / e / e nt re pre ne u r- n i g ht - w i n n i ng the-game-of-business-guest-of-svp-christine-sherberttickets-19137128667

Tabăra de testare Testers community from IT industry with monthly meetings Website: www.tabaradetestare.ro Since: 15.01.2012/Members: 1243/ Events: 107

www.todaysoftmag.ro | nr. 42/decembrie, 2015

11


noutati

programare

Interacțiunea Om-Computer: Comunicare în timp real cu ajutorul LeapMotion și SignalR

Î

ntr-o lume a tehnologiei și a device-urilor inteligente,în care comunicarea ar trebui privită ca un factor esențial, trebuie să dezvoltăm pe lângă formele tradiționale noi modalități de interacțiune om-calculator. Scopul acestui articol este de a propune ideea utilizării de căi alternative pentru a interacționa cu un calculator, căi aliniate noilor tehnologii disponibile. Propunerea va fi exemplificată printr-o aplicație de chat online în timp real, care va fi creată folosind ASP.NET MVC și SignalR și care va primi informațiile de la o tastatură controlată prin Leap Motion Controller.

Tehnologii Pentru a implementa aplicația de chat online în timp real care permite inputul de gesturi de la Leap Motion Controller, interpretate de către tastatura virtuală, avem nevoie de următoarele tehnologii: • ASP.NET MVC 5 - http://www.asp.net/mvc/mvc5 • SignalR - http://www.asp.net/signalr • LeapJS - https://github.com/leapmotion/leapjs • THREE.js - http://threejs.org/ • Tween.js - https://github.com/tweenjs/tween.js/ Funcționalitatea web-chat este dezvoltată folosind ASP.NET MVC și SignalR; tastatura virtuală este implementată pe baza THREE.js și CSS3DRenderer, iar inputul de gesturi și semnalele de feedback de la Leap Motion Controller sunt interpretate folosind extensiile LeapJS API și Leap-widgets.js.da

Comunicarea în Timp Real – SignalR În trecut, paginile web erau statice și nimeni nu se aștepta ca ele să facă un update singure după un timp. Fiecare acțiune a user-ului necesita ca întregul conținut al paginii să fie retrimis de la server. Încetul cu încetul, internetul și-a accentuat dezvoltarea, iar drumul de la pagini statice la pagini dinamice a început să se contureze. O primă încercare de a crea pagini dinamice a fost reprezentată de introducerea tag-ului iFrame și de controlul ActiveX. Mai târziu, odată cu introducerea Ajax și jQuery, paginile web dinamice au câștigat în fața vechilor pagini html (http:// www.evolutionoftheweb.com/). Când navigăm pe internet, avem nevoie de un browser web pentru a accesa și a afișa o pagină web. Acest browser are propriul lui motor de randare, care ajută la interpretarea și coordonarea diferitelor tag-uri, elemente și resurse de pe pagina respectivă, pentru a putea să le afișeze utilizatorului. Acum câțiva ani, foloseam calculatorul pentru a naviga pe internet; nu exista încă

12

nr. 42/decembrie, 2015 | www.todaysoftmag.ro

noțiunea de smartphone, tabletă, smart TV sau smartwatch sau orice alt tip de gadget inteligent. În prezent, aproape toate device-urile noastre folosesc un browser web care ne permite să stăm pe internet. Dorim ca aplicațiile pe care le dezvoltăm să fie disponibile și să poată fi accesate de pe toate aceste device-uri, însă tocmai datorită varietații lor conținutul arată bine pe unele, dar nu grozav pe altele. De asemenea, ne dorim ca aplicații precum un sistem de monitorizare sau o aplicație pentru verificat vremea să afișeze informațiile noi în timp real (imediat ce informația devine disponibilă) fără să fie nevoie să o cerem noi. Dacă ne conectăm de pe device-urile noastre la o aplicație de social media, ne așteptăm ca orice schimbare și actualizare făcute de pe device-ul propriu să fie vizibilă instant și pe tableta noastră sau pe smart TV, precum și pe device-urile prietenilor noștri, fără să fie nevoie să acționăm explicit în acest sens. Atunci cum am putea cr ea aplicații web care să funcționeze în timp real și pe care să le putem accesa de pe toate aceste tipuri de device-uri? SignalR ne ajută să găsim o soluție pentru a transfera datele între server și client într-un mod rapid și sigur, pentru comunicarea în timp real. SignalR este o librărie open source susținută de Microsoft. Oferă comunicare bidirecțională (full duplex) între client și server. Prin urmare, spre deosebire de modelul tradițional, unde clientul trebuia să facă o cerere către server, de această dată clientul și serverul împart un canal deschis iar serverul poate la rândul său să contacteze clientul.De asemenea, poate să furnizeze conținut în mod asincron, să suporte toate browser-ele și are o modalitate inteligentă de a decide ce tip de transport să folosească pentru a transmite mesajele.


programming Deciziile privind transportul se bazează pe tipul de browser și pe alte configurații client și server și încearcă diferite tehnici de transport, cum ar fi websocket, server sent events, forever frame și long polling, având un mecanism de selecție dacă unul din ele nu este suportat. Conexiunea începe ca HTTP standard și, dacă e posibil, se face trecerea spre websocket, care ar fi metoda de transport ideală din perspectiva SignalR. Protocolul Websocket este destul de nou pe piață (2011) și device-urile mai vechi nu îl suportă. Cu SignalR nu trebuie să ne facem griji și să scriem cod pentru clienți mai vechi deoarece SignalR poate decide ce alt tip de transport poate folosi pentru a stabili conexiunile cu ei. Dacă Websocket nu este disponibil, se ia decizia între server sent events (nu sunt suportate de Internet Explorer), forever frame (doar pentru Internet Explorer) și Ajax long polling. SignalR furnizează ca modele de comunicare Persistent Connections și Hubs. Persistent Connections este configurabilă și este similară web socket-urilor. Dacă, de exemplu, aplicația noastră are cerințe speciale și trebuie să avem control asupra acțiunilor pe care vrem să le facem când deschidem o conexiune, putem alege să o derivăm. Hubs sunt construite peste Connection API. Dacă alegem să folosim hub-urile oferite de SignalR, putem să apelăm metodele definite pe partea de server de pe client și viceversa, direct. Întreaga parte de management a conexiunilor este oferită de SignalR. Prin urmare, dacă ne folosim de Hubs, lăsăm SignalR-ul să facă toată treaba. Server side:

//DemoHub class is derived from class. This allows us to create public methods that can be called from script in web pages public class DemoHub : Hub { //method that can be called from the client public void MessageToServer(string sampleText) { //specify the function to call on the client, this //function has to be defined on the client; This will //

TODAY SOFTWARE MAGAZINE execute the js function messageToClient on all //the clients connected to the hub due to Clients.All //property that gives access to all connected clients } }

Clients.All.messageToClient(“message received”);

Client Side:

//reference to a hub proxy var demo = jQuery.connection.demoHub; //js function on the client that can be called from //the hub demo.client.messageToClient = function (message) { alert(message); }; //opening a connection to a hub jQuery.connection.hub.start().done(function () { //call MessageToServer method on the hub from the //client demo.server.messageToServer(“Sending message”), });

Leap Motion Controller Leap Motion Controller este un device care captează și interpretează semnale de la senzori optici și infra-roșu pentru a identifica mâinile, degetele și instrumentele de indicație. Acest device de urmărire este o alegere bună deoarece are suport API multi-language. De asemenea, oferă o cartografiere virtuală a spațiului, feedback în timp real, dar și recunoaștere și training pentru gesturi. Următoarea imagine prezintă acest device împreună cu sistemul său de coordonate. Câmpul vizual al senzorului optic este de aproximativ 150 de grade, iar raza de detecție se extinde de la 25 până la 600 de milimetri deasupra device-ului. Unitățile sale de măsură sunt reprezentate în milimetri pentru distanțe, microsecunde pentru timp, milimetri per secundă pentru viteză și radian pentru unghiuri. Modelul Entity al datelor captate de controller este denotat de un Frame, conținând informații din întregul spațiu de lucru, cum

www.todaysoftmag.ro | nr. 42/decembrie, 2015

13


programare Comunicare în timp real cu ajutorul LeapMotion și SignalR ar fi mișcarea și gesturile realizate, mâinile, degetele și/sau instrumentele de indicare. Folosind aceste informații, gesturi precum descrierea unui cerc, apăsarea unei taste sau atingerea ecranului pot fi identificate. Integrarea Leap Motion Controller în aplicație se va baza pe interfața WebSocket din arhitectura sistemului. Datele captate de device sunt transmise într-o structură de tip JSON printr-un WebSocket. În acest fel, librăriile JavaScript de pe client pot interpreta și analiza mesajele. Interpretarea datelor brute primite prin WebSocket se face în browser cu ajutorul framework-ului LeapJS.

Următoarele figuri ilustrează stările unei taste – normal, hover și tapped. Toate aceste stări se realizează folosind reguli CSS applicate elementelor de HTML, transpuse în THREE. CSS3DObjects și randate prin CSS3DRENDERER

Tastatura virtuală Elementul vizual care intermediază comunicarea cu calculatorul este tastatura virtuală. Această tastatură este implementată folosind tehnologii JavaScript client, cum ar fi THREE.js, Tween. js și CSS3DRENDERER ca motoare de randare. Folosind THREE.js, o scenă 3D este creată pentru a prezenta elementele tastaturii. Unele animații sunt ușor de integrat cu ajutorul funcționalității oferite de către framework-ul Tween.js. Alegerea modalității de randare este reprezentată de CSS3DRENDERER datorită faptului că acest tip de randare este rapid în cazul de față, funcționează pe browser-e de mobile, este de mici dimensiuni și se bazează în principal pe CSS. Următoarele linii de JavaScript prezintă codul minimal de care este nevoie pentru a crea un THREE.CSS3DObject și pentru a inițializa scena: function CreateButton(key, keyDescription) { var keyElement = document.createElement(’div’); keyElement.className = ’key’; keyElement.id = key; var letter = document.createElement(’div’); letter.className = ’letter’; letter.textContent = key; keyElement.appendChild(letter); var description = document.createElement(’div’); description.className = ’description’; description.innerHTML = keyDescription; keyElement.appendChild(description); var css3dObject = new THREE. CSS3DObject(keyElement); }

css3dObject.name = key; return css3dObject;

function InitScene() { var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 1000); camera.position.set(0, 0, 200); var scene = new THREE.Scene(); var key = CreateButton(’w’, ’w key’); key.position.set(20, 20, 20) scene.add(key);

var css3dRenderer = new THREE.CSS3DRenderer(); css3dRenderer.setSize(window.innerWidth, window.innerHeight);

document.getElementById(’scene’). appendChild(css3dRenderer.domElement);

var trackballControls = new THREE. TrackballControls(camera, css3dRenderer.domElement); }

14

trackballControls.minDistance = 50; trackballControls.maxDistance = 1000;

nr. 42/decembrie 2015 | www.todaysoftmag.ro

Aceste clase CSS vor fi folosite în timpul interacțiunii dintre taste și Leap Motion Controller pentru a furniza feedback vizual pentru acțiunile utilizatorului.

LeapJS și Interacțiunea cu tastatura Virtuală Interacțiunea dintre tastatura virtuală și LeapMotion Controller se va realiza prin framework-ul LeapJS. Informația furnizată de framework va fi actualizată repetitiv, captând date cu o frecvență de 60 de cadre pe secundă. Din cauză că vom avea nevoie de informații legate de poziția mâinii pe ecran și gesturile făcute de către utilizator, inițializarea controller-ului este descrisă prin următoarele linii de cod JavaScript: var leapController = Leap.loop({ enableGestures: true }) .use(’screenPosition’); leapController.connect();

Pentru a identifica ce fel de acțiune intenționează să facă utilizatorul, obiectul Frame furnizat de framework-ul LeapJS ar trebui luat în considerare. Obiectul Frame furnizează informații importante captate în zona de detecție privind: id-ul său, rata de cadre curentă, degete, gesturi, mâini, pointables, tool-uri, spațiul de interacțiune și totodată un indicator pentru validitatea datelor furnizate. Un Frame este considerat a fi valid când conține date pentru toți itemii detectați. Pe lângă aceste atribute, obiectul Frame furnizează și un set de funcții, cum ar fi: dump() , finger(), hand(), pointable(), rotationAngle(), rotationAxis(), rotationMatrix(), scaleFactor(), tool(), toString(), translation(). Aceste funcții sunt foarte folositoare în procesul de interogare și procesare a datelor captate. Frame Event Callbacks sunt folosite pentru a gestiona informațiile despre gesturile recunoscute și pentru a lua măsurile necesare. În primul rând, poziția mâinii este transpusă pe ecran. Acest lucru se face folosind event-ul de hand detection, după cum am arătat mai jos: var leapController = Leap.loop({ enableGestures: true }, { hand: function (hand) { var screenPosition = hand. screenPosition(hand.palmPosition); //... screen position related logic implementation } }) .use(’screenPosition’);


TODAY SOFTWARE MAGAZINE În funcție de poziția mâinii pe ecran, elementele de interes vor fi identificate – în acest caz, tasta care urmează a fi apăsată. Ca feedback pentru user, vor fi folosite clasele CSS prezentate în secțiunile de mai sus. Starea tapped este transpusă folosind informații legate de gesturi din Frame Object-ul curent. Dacă există un gest keytap după interogarea colecției de gesturi, atunci tasta situată în acea poziție își va schimba statusul și va fi adăugată la o colecție pentru a crea un mesaj care va fi trimis mecanismului de chat.

Concluzii Folosind ASP.NET MVC și SignalR, un mecanism de chat online în timp real a fost implementat. Combinând THREE.js cu CSS3DRENDERER, o tastatură virtuală 3D a fost creată folosind elemente HTML stilizate prin CSS. Interpretarea gesturilor userului ca formă de interacțiune cu tastatura s-a putut realiza prin integrarea LeapMotion Controller în aplicație folosind LeapJS și Leap-widgets.js. Rezultatul mixării acestor informații este o aplicație funcțională de web-chat în timp real, având ca input o tastatură interactivă care înțelege gesturile utilizatorului.

Bibliografie [1] http://www.evolutionoftheweb.com/ [2] https://en.wikipedia.org/wiki/History_of_the_World_Wide_Web [3] https://en.wikipedia.org/wiki/Ajax_(programming) [4] https://en.wikipedia.org/wiki/WebSocket [5] http://www.asp.net/signalr [ 6 ] h t t p : / / w w w. a s p . n e t / s i g n a l r / o v e r v i e w / g e t t i n g - s t a r t e d / tutorial-getting-started-with-signalr

[7] https://developer.leapmotion.com/documentation/cpp/devguide/Leap_ Overview.html [8] https://developer.leapmotion.com/documentation/javascript/devguide/ Leap_Architecture.html [9] http://leapmotion.github.io/leapjs-plugins/docs/#screen-position [10] https://github.com/leapmotion/leapjs-widgets [11] https://developer.leapmotion.com/documentation/javascript/devguide/ Leap_Frames.html [12] https://developer.leapmotion.com/documentation/javascript/devguide/ Leap_Gestures.html [13] http://threejs.org/docs/ [14] http://threejs.org/examples/ [15] https://github.com/mrdoob/three.js/blob/master/examples/css3d_periodictable.html

George Rus

George.Rus@yardi.com Software Developer @ Yardi România

Daniela Fati

Daniela.Fati@yardi.com Software Developer @ Yardi România

www.todaysoftmag.ro | nr. 42/decembrie, 2015

15


programare

IoT: de la device la cloud

S

ecuritatea digitală a fost şi este un subiect controversat. Necesară dar extrem de dificil de implementat, securitatea digitală constituie o provocare majoră atât pentru clienţi cât şi pentru companiile ce oferă produse IT al căror principal scop este interconectarea sistemelor de automatizare. Leonard Pitu leonard.pitu@siemens.com Senior Key Expert/Research Engineer @CT RTC ELE ELD-RO @ Siemens

16

nr. 42/2015, www.todaysoftmag.ro

De-a lungul anilor evoluţia a fost fulminantă pornind de la un domeniu de cercetare pură până la ceea ce numim o tehnologie „main stream”. Domeniul IT a cunoscut o evoluţie extrem de rapidă, pornind acum doar câteva zeci de ani, de la un simplu tranzistor. Această evoluţie a avut două direcţii – uşurarea activităţilor umane și facilitarea comunicării. Apariţia „Internet of Things”ului reprezintă un pas major în această evoluţie. Conceptul este unul extrem de simplu: fiecare aparat poate fi conectat la Internet şi accesat de la distanţă – indiferent dacă este vorba de o centrală termică sau de o întreagă fabrică. Potențialul este uriaș - toate aparatele ce ne înconjoară devin inteligente putând colabora între ele sau cu diverse servicii online. Un exemplu simplu îl poate constitui o centrală termică. În prezent, aceasta este reglată de producător, în fabrică. Utilizatorul poate doar parametriza centrala termică specificând

de exemplu, temperatura dorită într-un anumit interval orar. O centrală inteligentă introduce o serie de parametri suplimentari, cum ar fi prognoza meteo sau calendarul proprietarului. Astfel, dacă proprietarul este în concediu iar temperatura exterioară urmează să scadă, centrala va porni în mod automat, înainte ca proprietarul să revină din concediu pentru ca acesta să fie întâmpinat de o atmosferă plăcută la sosire. Totodată centrala termică poate fi optimizată de producător, tot prin Internet, prin intermediul actualizărilor software. În acest fel IoT-ul oferă o nouă viziune asupra interacțiunii om-mașină - totul devine interconectat și deci la îndemână. Însuși avantajul oferit de IoT devine însă o armă redutabilă în mâna unor infractori digitali. Cu aceeași ușurință cu care este reglată de la distanță centrala termică, un atacator poate să o compromită.


TODAY SOFTWARE MAGAZINE societății moderne motiv pentru care securizarea acestuia a devenit imperios necesară. În acest fel s-au cristalizat cerințele de bază ce formează domeniul securității digitale în IoT.

Figura 1: Numărul atacurilor de securitate este în continuă creştere (Data Breach Investigation Report 2014)

Încă din faza de concept a IoT-ului a devenit clară necesitatea asigurării securității sistemelor digitale ce stau la baza acestuia. Interconectarea unor sisteme până de curând izolate deschide noi oportunităţi pentru atacatori, indiferent de motivaţia acestora, după cum se poate observa şi din presa de specialitate care aproape săptămânal prezintă noi vulnerabilităţi exploatate în cadrul unor atacuri din ce în ce mai complexe. Prin natura lor, sistemele izolate pot fi protejate mai uşor – simplul fapt că sistemul este inaccesibil publicului larg ușurează această sarcină. În cadrul unor sisteme de acest fel au fost utilizați algoritmi privați de securitate, dezvoltați de cele mai multe ori de către o singură companie, fără un proces minuțios de evaluare a eventualelor breșe de securitate. Depășirea barierelor fizice, realizată prin intermediul IoTului, a însemnat totodată şi propagarea pe scară largă a noţiunilor de securitate, criptografie şi criptanaliză – noţiuni ce au permis unui public larg accesul la acest domeniu „închis” numit „securitate”. Aceste fapte au dus într-un timp foarte scurt la invalidarea conceptelor și tehnologiilor considerate sigure. Atacurile au relevat erori de concept, greșeli de implementare dar și probleme în aplicarea politicilor de securitate.

Pentru a putea dezvolta soluții fiabile pe termen lung, tendința este de a dezvolta aplicații simple dar scalabile. Un exemplu în acest sens îl constituie un furnizor de utilități care în mod curent are câteva milioane de utilizatori – toți acești utilizatori trebuie să poată utiliza în mod sigur același serviciu, simultan; toți trebuie să se autentifice, să fie autorizați, să poată vizualiza consumul și factura curentă, date istorice și eventual să efectueze plăți. În acest context, securitatea digitală a devenit parte integrantă a proceselor de dezvoltare influențând atât arhitectura sistemelor hardware cât și a celor software. Soluțiile software oferă flexibilitate și pot fi dezvoltate într-un timp mai scurt cu un efort mai mic dar sunt mai susceptibile erorilor. Un exemplu în acest sens este clasica eroare de „buffer overflow” care este extrem de ușor de exploatat față de cele hardware. Soluțiile hardware pe de altă parte sunt mult mai greu de implementat, necesită un efort uman și financiar mai mare, dar sunt mai puțin susceptibile erorilor. Crearea unui echilibru între soluțiile hardware și software constituie soluția optimă pentru realizarea unui sistem digital sigur. În prezent nu există nici un standard care să ofere o metodologie de determinare a acestui echilibru – singura măsură o constituie experiența inginerilor proiectanți de sisteme informatice și de securitate. În urma unei analize de risc pot fi identificate principalele clase de atac împotriva cărora sistemul trebuie protejat. Mai apoi urmează identificarea, respectiv dezvoltarea tehnologiilor necesare pentru a proteja sistemul. Arhitectura unui sistem informatic poate fi schimbată drastic în funcție de potențialele atacuri. Introducerea unor nivele suplimentare de securitate poate reduce performanța sistemului făcând necesare modificări suplimentare. În general, nu este suficientă o singură metodă de

Virușii informatici moderni au devenit din ce în ce mai complecși având multiple mecanisme de colectare și propagare. Spre exemplu virusul FLAME are o dimensiune de 20MB având probabil milioane de linii de cod. Deține cinci mecanisme independente de criptare a datelor și o bază de date SQL în care stochează structurat datele colectate. FLAME este capabil să infecteze un sistem informatic fără a lăsa urme - nu există nici un proces în sistem care să indice existența sa, în timp ce memoria alocată de virus nu poate fi accesată de nici un proces utilizator. Dat fiind acest context, a apărut pe cale naturală necesitatea dezvoltării unor noi concepte şi modele de securitate. Deși de cele mai multe ori extrem de complexe, soluțiile s-au dovedit ineficiente în fața atacurilor moderne. Dată fiind natura scalabilă a IoT-ului, puține concepte de securitate au putut fi adaptate noilor necesități. Prin natura sa, acesta expune date ce pot afecta sfera privată a oamenilor astfel încât o cerință primordială a noii ere o constituie asigurarea sferei private a actorilor umani. Realizarea practică a acestui deziderat presupune utilizarea de metode criptografice alături de tehnici de autentificare și autorizare. Transferul online de date stă la baza Internetului și chiar a

Figura 2: Securitatea digitală - o multitudine de tehnologii (www.microsemi.com)

www.todaysoftmag.ro | nr. 42/decembrie, 2015

17


programare IoT: de la device la cloud

Figura 3: Topul celor 10 pericole de securitate (sursa: Cloud Security Alliance)

protecție ci o multitudine. Totodată sistemele trebuie să fie active și nu doar pasive sau reactive. Astfel un sistem trebuie să fie capabil să detecteze, identifice și să reacționeze la atacuri de securitate similar sistemului imunitar al unui om. Toate aceste caracteristici definesc gradul de securizare pe care sistemul este capabil să îl ofere. Un aspect important al dezvoltării soluțiilor de securitate îl constituie verificarea acestora. Din păcate, nici aici nu există standarde care să asiste dezvoltatorii, singurul ajutor fiind câteva procese de evaluare și de ghidare („guidelines”). Acest domeniu este unul aflat într-o puternică schimbare momentan făcându-se tranziția de la o verificare sumară, bazată pe experiență personală, la o verificare formală, bazată pe modele matematice. Sistemele informatice ce stau la baza IoT-ului sunt distribuite pe o mare suprafață geografică împărțind astfel problema securității între „cloud” și multitudinea de „thing-uri”. Mai mult, „cloud-ul” este în general reprezentat de un terț motiv pentru care implementarea de soluții de securitate devine mai dificilă. Pe lângă aspectul tehnologic este necesară adaptarea cadrului legal care să permită exploatarea sigură, folosind metode criptografice puternice.

Cursa dintre atacatori și „protectori” este însă departe de a fi încheiată după cum se poate observa din numărul crescut al vulnerabilităţilor ce sunt exploatate în cadrul atacurilor de securitate astfel încât domeniul securităţii digitale va cunoaşte noi culmi tehnologice în anii ce vor urma. Tranziția spre securitatea intrinsecă, bazată pe proprietățile fizice ale unui circuit digital va contracara atacurile fizice de securitate și va asigura dezvoltatorilor software o ancoră de siguranță pentru a putea implementa noi modele de protecție. Pe partea de „cloud” noutatea majoră o va constitui criptografia homomorfă care permite executarea, respectiv procesarea datelor fără ca să fie necesară decriptarea acestora. Această tehnologie va asigura utilizatorilor o sferă privată puternică fără a-i lipsi însă de avantajele unei platforme digitale distribuite. Totodată fondarea unor organisme legislative gen „Cloud Security Alliance” sau „European Cloud Partnership” anunță pregătirea cadrului legal pentru vastul domeniu ce se anunță a fi IoT-ul.

Corporate Technology Romania

18

nr. 42/decembrie 2015 | www.todaysoftmag.ro


programming

programare

ECMAScript 6 – de ce și cum să îl folosim în prezent?

P

entru aceia dintre voi care nu au auzit de ECMAScript, vă informăm că acesta este standardul care definește limbajul de programare pe care noi îl știm drept JavaScript. Ediția anterioară a standardului ECMAScript 5 a fost lansat la sfârșitul anului 2009, cu îmbunătățiri semnificative ale limbajului, dar cu câteva funcții importante lipsă. ECMAScript 6 (ES6) a introdus în sfârșit caracteristici pe care dezvoltatorii le așteptau de mulți ani.

Adrian Ulici Adrian.Ulici@3pillarglobal.com Software Engineer @3Pillar Global

De fapt, denumirea of icială este ECMAScript 2015, dar se pare că în cadrul comunității, ES6 este încă versiunea pe care cei mai mulți o recunosc. Voi expune și analiza mai jos câteva dintre îmbunătățirile care mie personal îmi plac și care cred că mă vor ajuta cel mai mult. Bineînțeles, în funcție de tipul proiectului, s-ar putea ca voi să găsiți utile alte caracteristici.

După cum puteți vedea, am folosit cuvântul cheie ”funcție”, care deja ne scutește de niște caractere, dar lucrurile devin și mai bune. Dacă funcția Arrow necesită numai un argument, puteți scăpa de asemenea și de parantezele de deschidere și de încheiere din lista de argumente:

Câteva caracteristici majore noi

Aceasta arată bine, dar încă nu am terminat! Mai există încă o îmbunătățire pe care o putem face aici: dacă corpul funcției Arrow este numai o afirmație de returnare, putem scăpa de paranteze și de asemenea și de cuvântul cheie ”return” și vom obține ceva de genul:

Funcții Arrow Funcțiile Arrow (săgeată) sunt o nouă modalitate mai scurtă de a scrie funcții anonime. Dacă ești un programator care preferă programarea funcțională, cu siguranță îți vor plăcea. Iată un exemplu scurt: // versiunea es6 [1, 2, 3].map((item, index) => { return item * 2; }); // versiunea es5 [1, 2, 3].map(function(item, index) { return item * 2; });

[1, 2, 3].map(item => { return item * 2; });

[1, 2, 3].map(item => item * 2).filter(item => item % 3 === 0); // this will return [6]

Acum, să comparăm aceasta cu versiunea ES5:

www.todaysoftmag.ro | nr. 42/decembrie, 2015

19


programare ECMAScript 6 – de ce și cum să îl folosim în prezent? [1, 2, 3].map(function (item) { return item * 2; }).filter(function (item) { return item % 3 === 0; });

// my_module.js const helloWorld = () => { console.log(’Hello world’); }

Există o ameliorare evidentă nu numai în faptul că putem scrie același cod cu mai puține caractere, dar de asemenea în lizi- const MY_CONSTANT = 5; bilitatea codului. Dacă nu aveți argumente la funcția voastră, ar let loremIpsum = ’dolor’; trebui să utilizați următoarea sintaxă: export { const func = () => { // do something }

Există un singur impediment pe care ar trebui să îl luați în considerare: spre deosebire de funcțiile anonime normale care creează fiecare un context nou, funcțiile Arrow vor păstra contextul funcțiilor părinte. Dezvoltatorii au avut probleme adesea în identificarea contextului în care rula funcția lor; aceasta ar trebui să facă lucrurile puțin mai ușor de înțeles. Iată un exemplu: document.body.addEventListener(’click’, function (event) { console.log(this); // ’this’ va face referință la elementul body }); document.body.addEventListener(’click’, (event) => { console.log(this); // ’this’ va face referință la obiectul Window // (adică contextul părintelui) });

};

helloWorld, MY_CONSTANT, loremIpsum

În acest fel este puțin mai vizibil ce exportați de fapt dintr-un modul. Ca observație, probabil ați observat că am utilizat ”let” pentru a declara variabila ”loremIpsum”. ”let” este, de asemenea, parte a specificației ES6, și este o modalitate nouă de a declara variabile. Diferența dintre ”let” și ”var” este aceea că ”let” este limitat la bloc (block scoped) în loc să fie limitat la funcție (function scoped) (sau global, dacă nu se află într-o funcție), precum ”var”. Acestea fiind spuse, importul din module arată așa: // main.js import { helloWorld, MY_CONSTANT } from ’my_module’; helloWorld(); // va afișa ’Hello world’ // sau importă toate exporturile denumite import * as m from ’my_module’; m.helloWorld();

Deci, nu puteți face pur și simplu o căutare rapidă și să Exporturile default au o sintaxă scurtă: sum.js înlocuiți toate funcțiile anonime cu funcții Arrow, pentru că va // export default function (a, b) { strica ceva, cu siguranță. return a + b; };

Module O adăugire mult așteptată la JavaScript a fost abilitatea de a crea și încărca module. Cu complexitatea în creștere a aplicațiilor web, era evident că această caracteristică trebuia să existe; de aceea, comunitatea JavaScript și-a asumat sarcina de a crea câteva soluții pentru aceasta. Cele mai populare sunt standardul CommonJS, utilizat de Node JS și Browserify, și Asynchronous Module Definition (AMD), utilizat de RequireJS. Soluția ES6 pentru module încorporează caracteristici de la ambele sisteme de module populare, dar adaugă și mai multă funcționalitate utilă. O schimbare importantă care a fost făcută la modulele ES6 este că ele au o structură statică, adică importurile vor fi analizate static în timpul compilării. Aceasta are un avantaj major, deoarece instrumentele de linting vor putea analiza mult mai bine codul nostru. Sintaxa modulelor ES6 ne oferă multiple moduri de a exporta valori: exporturi denumite (putem avea mai multe într-un modul) și exporturi default (numai unul pe fișier). Partea frumoasă este că putem avea ambele în același modul. Exporturile denumite arată așa: // my_module.js export function helloWorld () { console.log(’Hello world’); } export const MY_CONSTANT = 5; export let loremIpsum = ’dolor’;

// main.js import sum from ’sum’; alert(sum(4, 5)); // va afișa ’9’

Este posibil să avem ambele, exporturi denumite și un export default în același modul, și aceasta ar arăta așa: // module.js const func1 = () => { ... }; const func2 = () => { ... }; // Exportă valoarea default export default function () { ... }; // Exportă valorile denumite export { func1, func2 }; // main.js import defaultFunction, { func1, func2 } from ’module’;

Există un dezavantaj al acestei sintaxe de importare: nu poate fi utilizată în interiorul unui element de tip script (deoarece este un element sincron) și nu puteți încărca un modul în mod condiționat. Există, totuși, o modalitate alternativă de a încărca module, utilizând un API. Sintaxa arată așa:

Aveți, de asemenea, opțiunea de a defini toate funcțiile/ vari=> { abilele pe care doriți să le exportați și apoi să le exportați separat, System.import(’my_module’).then(my_module my_module.helloWorld(); după cum urmează: }).catch(error => {

20

nr. 42/decembrie 2015 | www.todaysoftmag.ro


TODAY SOFTWARE MAGAZINE });

alert(’Cannot load module’);

Promises Datorită naturii asincrone a JavaScript, ne găsim adesea în ceea ce este cunoscut drept ”callback hell”, adică multe funcții callback în alte funcții callback care reduc mult lizibilitatea: doSomething(param1, param2, () => { doSomethingElse((param3) => { doMore((param4) => { andMore((param5) => { // Unde sunt? }); }); }); });

Cred că se poate vedea cum lucrurile pot deveni complicate destul de rapid și cei mai mulți din dezvoltatorii JavaScript au întâlnit situații ca și asta. Promises sunt o alternativă la funcțiile callbacks pentru a tatona codul asincron. Ca și modulele, există câteva implementări open source pentru promises, precum Q, RSVP sau Bluebird. Popularul jQuery are un obiect Deferred, care oferă același tip de funcționalitate, dar sintaxa sa este diferită și nu este conformă cu ES6. Promises sunt în fond obiecte care se pot afla într-una din următoarele trei etape: • în așteptare: așteptând ca operația să se finalizeze. Aceasta este etapa inițială atunci când creăm un obiect Promise. • îndeplinite: operația s-a finalizat cu succes. • respinse: operația a eșuat.

}

});

// Apelăm funcția asincronă myAsyncFunction().then((param1, param2) => { console.log(’async function finished’); }).catch((error) => { console.log(’Something bad happened: ’ + error); });

Cea mai bună parte a promises este că ele se pot înlănțui, ceea ce aplatizează codul: myAsyncFunction().then(() => { // funcția myAsyncFunction a rulat cu succes return anotherAsyncFunction(); }).then(() => { // funcția anotherAsyncFunction a rulat cu succes }).catch((error) => { // funcția myAsyncFunction sau funcția // anotherAsyncFunction a aruncat o eroare });

Clase Da, clasele au ajuns în sfârșit în JavaScript. Pe cât este de anticipată această caracteristică, pe atât este de controversată, deoarece există destul de mulți dezvoltatori care se opun introducerii claselor, deoarece javascript are deja o moștenire bazata pe prototip care poate de asemenea să ofere o moștenire clasică. Clasele în ES6 sunt în mare parte syntactic sugar, deoarece același tip de funcționalitate ar fi putut fi creată utilizând ES5, dar introducerea lor va permite viitoarelor ediții ale ECMAScript să le adauge mai multă funcționalitate. Există deja câteva intenții de a extinde clasele în ES7 prin adăugarea variabilelor private și a altor caracteristici.

Fiecare obiect Promise primește o funcție callback drept parametru. Această funcție callback primește doi parametri: o funcție Sintaxa pentru clase arată așa: fulfill (îndeplinire) pentru operația finalizată cu succes, iar o class Vehicle { funcție reject (respingere), pentru operația eșuată. constructor(type, color) { Utilizarea de bază a promisiunilor arată cam așa: // Definim o funcție asincronă (un apel de tip ajax, // de exemplu) care returnează un obiect Promise const myAsyncFunction = () => { return new Promise((fulfill, reject) => { // facem ceva cu datele if (...) { fulfill(param1, param2); } else { reject(error); }

}

}

this.type = type; this.color = color;

getColor() { return this.color; }

Aceasta va crea o clasă ”Vehicle” cu un constructor și o metodă ”getColor”. De asemenea, puteți extinde clasele:

Our core competencies include:

Product Strategy

Product Development

Product Support

3Pillar Global, a product development partner creating software that accelerates speed to market in a content rich world, increasingly connected world. Our offerings are business focused, they drive real, tangible value.

www.3pillarglobal.com

www.todaysoftmag.ro | nr. 42/decembrie, 2015

21


programare ECMAScript 6 – de ce și cum să îl folosim în prezent?

// Extindem clasa Vehicle class Car extends Vehicle { constructor(color, maxSpeed) { super(’car’, color); this.maxSpeed = maxSpeed; } getMaxSpeedFormatted() { return this.maxSpeed + ’km/h’; } } let car = new Car(’blue’, 200); console.log(’We have a ’ + car.getColor() + ’ car with a max speed of ’ + car.getMaxSpeedFormatted());

Veți observa că folosim ”super(…)” aici pentru a apela un constructor părinte. Cele mai multe dintre limbajele orientate pe obiect își dau această posibilitate drept o opțiune, dar în JavaScript, acest lucru este obligatoriu dacă suprascriem constructorul. Trebuie să apelăm super-constructorul înainte de a încerca să accesăm ”this”, altfel, veți obține o eroare ”Uncaught ReferenceError: this is not defined”: class Car extends Vehicle { constructor(color, maxSpeed) { maxSpeed *= 0.6214; // transform to miles. You can do this before calling // ’super’ this.maxSpeed = maxSpeed; // nu putem face referință la “this”. Aceasta va // arunca o eroare de tip ReferenceError super(’car’, color); } }

Puteți apela alte metode pe clasa de bază, nu numai constructorul, utilizând ”super.methodName()”.

Dar aceasta nu este totul ! Există multe caracteristici noi în ES6 despre care trebuie să știți, cum ar fi noua modalitate de a declara variabile utilizând ”let” sau valori default pentru argumentele funcțiilor, multe metode noi pentru prototipurile String și Array, și mult mai multe. Aceasta a fost doar o privire destul de generală, dar sper că am reușit să vă fac să doriți să aflați mai multe. Pentru o listă mai extinsă a noilor caracteristici din ES6, vedeți specificația de limbaj aici: http://www.ecma-international. org/ecma-262/6.0/ O altă resursă extraordinară dacă doriți să pătrundeți tainele ES6 este cartea Doctorului Axel Rauschmayer, ”Exploring ES6”, pe care o oferă gratis, cu generozitate, în versiunea online, aici: http://exploringjs.com/es6/ sau puteți cumpăra cartea pentru a-i sprijini munca, aici: https://leanpub.com/exploring-es6/

Cum să utilizăm ES6 în prezent Cum am putea utiliza și valorifica azi aceste caracteristici? ES6 a fost aprobat oficial din Iunie 2015, dar știm cu toții ca va dura ceva timp până când browser-ele vor implementa în întregime toate caracteristicile. Browser-ele evergreen recuperează din urmă destul de rapid, dar chiar dacă vor implementa ES6 complet, cei mai mulți dintre noi încă trebuie să oferim suport pentru versiunile mai vechi de browser- știm cu toții că mă refer aici la Internet Explorer. Deci, cum putem să le utilizăm pe toate sau cel puțin un set din aceste caracteristici astăzi? Soluția? Transpilers! Există câteva transpilers de la ES6 la

22

nr. 42/decembrie 2015 | www.todaysoftmag.ro

ES5 disponibile în acest moment, cu Babel JS și Traceur fiind cele mai populare. O listă actualizată cu cele mai utilizate compilatoare transpilers și suportul caracteristicilor lor (plus suport pentru browser) pot fi găsite în tabelul de compatibilitate al kangax: https://kangax.github.io/compat-table/es6/ . La momentul scrierii acestui articol, Babel JS (care a evoluat mult între timp și este mai mult o platformă decât un transpiler acum, vedeți http://babeljs.io/blog/2015/10/29/6.0.0/) are cel mai bun suport, cu peste 71% din caracteristici susținute, ceea ce e destul de bine pentru un transpiler! Babel și cele mai multe alte transpilers au de asemenea plugin-uri gulp (și Grunt) disponibile, deci este ușor și rapid să le instalați în sistemul vostru. Priviți acest exemplu scurt și minimal de utilizare a Babel cu gulp: var gulp = require(’gulp’); var babel = require(’gulp-babel’); gulp.task(build-js, function () { return gulp.src(’src/app.js’) .pipe(babel()) .pipe(gulp.dest(’dist’)); });

Concluzie ES6 ne-a adus cu siguranță multe îmbunătățiri, de la simple syntactic sugars (precum clasele) până la caracteristicile noi și complexe, cum sunt obiectele Promise și modulele. Unele dintre caracteristicile noi schimbă jocul (ex. module, obiectele Promise, etc.), unele ne vor face codul mai curat și mai lizibil (ex. funcțiile Arrow, template strings, etc.), altele sunt pur și simplu utile (ex. metode noi pentru mulțimi). Această nouă lansare a ECMAScript nu numai că va schimba modul în care scriem JavaScript, dar de asemenea va modifica modul în care gândim și ne organizăm codul JavaScript. Cu alte cuvinte, ne va face viața mai ușoară.

Referințe http://www.ecma-international.org/ecma-262/6.0/ http://exploringjs.com/es6/ https://github.com/lukehoban/es6features


programare

Quality Assurance 101

Î

ntr-un articol mai vechi publicat aici, în TSM, am încercat să clarific ce este „Quality Assurance” și cum se potrivește într-un proiect agile. În prezentul articol, voi continua cu descrierea primilor pași ce trebuie făcuți în definirea și implementarea unui proces de management al calității într-un proiect de dezvoltare software.

Vasile Selegean vasile.selegean@isdc.eu QA Officer @ISDC

La fel ca în orice activitate managerială, managementul calității ar trebui să înceapă cu stabilirea unui obiectiv și cu un plan în care să se detalieze: • Toate activitățile ce se vor executa în vederea atingerii obiectivului stabilit; • Resursele necesare pentru îndeplinirea activităților; • Frecvența și durata de timp alocat acestor activități; • Măsurătorile pentru monitorizarea activității – pentru a ne asigura că lucrurile merg în direcția corectă; • Programarea sesiunilor retrospective – pentru evaluarea și revizuirea rezultatelor obținute în urma aplicării planului. De asemenea, se recomandă includerea în plan a criteriilor de succes și a ROI (return of investment) adus de aceste activități.

Obiectivul Pe scurt, calitatea unui produs sau serviciu este ceea ce diferențiază produsul nostru în comparație cu produsele

similare ale competitorilor, acel ceva ce face ca rezultatul muncii noastre să fie remarcat în contextul actual al pieței produselor software. Calitatea ar trebui să fie obiectivul final al tuturor activităților noastre – orice altceva este doar o unealtă, o metodă, un mijloc prin care să ne atingem acest scop sau obiectiv. Calitatea este o sumă a mai multor obiective (sau criterii) de calitate ce trebuie stabilite clar încă din primele etape ale ciclului de viață al unui proiect. Criteriile de calitate trebuie definite și acceptate de toți cei implicați în proiect. Un rol important în acest demers îi revine în mod obligatoriu echipei cu întregul suport managerial al acesteia. Dar este recomandabil ca și doleanțele clientului să fie luate în considerare. Bineînțeles, obiectivele de calitate trebuie să fie definite și formulate inteligent (specific, measurable, achievable, relevant și time-bound) pentru a fi într-adevăr utile și ușor de monitorizat. Obiectivele de calitate ajută echipa de proiect în eficientizarea modului de lucru,

www.todaysoftmag.ro | nr. 42/decembrie, 2015

23


programare Quality Assurance 101 dar și în evaluarea rezultatelor muncii înainte de finalizare, prevenind ca eventuale defecte sau neconcordanțe să fie livrate clientului. Obiectivele de calitate nu trebuie confundate cu specificațiile nefuncționale (NFR – non-functional requirements), cunoscute și sub numele de atribute ale calității (quality attributes). Acestea din urmă se presupune că se referă explicit sau nu la o nevoie a utilizatorului, cum ar fi uptime sau numărul de conexiuni concurente ce ar trebui suportate de o aplicație web. Aceste NFR fac obiectul arhitecturii sau managementului infrastructurii proiectului. Câteva exemple de obiective de calitate ar fi: • ”Reducerea numărului de defecte cu 25% în următorul trimestru față de trimestrul anterior” – presupunând că numărul de defecte raportate în cursul trimestrului anterior este cunoscut; • ”Procentajul timpului alocat pentru re-work să fie menținut sub 25% din timpul total petrecut în development în fiecare sprint”; • ” Î m b u n ă t ă ț i r e a e f i c a c i t ă ț i i activităților interne de testare” – prin fixarea ratei de detectare a defectelor (defecte raportate înainte și după livrare) la un nivel de, să zicem, 90% la fiecare livrare sau per versiune. Un exemplu de obiectiv de calitate greșit este ”reducerea numărului de defecte cu 25% în fiecare sprint”. Nu este ceva ce poate fi atins (matematic) și nici delimitat clar în timp, spre deosebire de primul exemplu din lista de mai sus.

Activitățile Ce activități ar trebui executate pentru atingerea scopului definit prin obiectivele

24

de calitate? Acestea pot fi grupate în trei Activitățile de testare și revizuire sunt categorii: acțiuni de prevenție, activități de binecunoscute – nu trebuie detaliate aici. evaluare și activități de reparare/corect Auditurile, în schimb, necesită câteva clarificări: trebuie executate de către un auditor Acțiunile preventive includ activități independent și calificat, din afara echipei educative, astfel încât membrii echipei de proiect (de ex. un coleg arhitect, senior, de proiect să își poată îndeplini mai bine atunci când este vorba de arhitectura sarcinile, pentru a eficientiza folosirea software a proiectului sau un consultant cunoștințelor proprii sau ale utilitarelor extern dacă se dorește evaluarea produce le stau la dispoziție. Activitățile de cer- sului din perspectiva unui standard cum cetare-dezvoltare (R&D) care conectează ar fi ISO). Auditurile trebuie planificate membrii echipei la noutățile din domeniu, din timp, scopul și obiectivele trebuie planificările și activitățile de monitorizare cunoscute și asupra lor trebuie convenit și măsurare se înscriu și ele în această cate- cât mai devreme de la începerea proiectugorie a acțiunilor preventive. Acțiunile lui. Obiectivele pot fi definite în interiorul corective pot să fie astfel declanșate din proiectului sau organizației (chiar dacă timp, înainte ca eventualele inconsistențe după un model extern, cum este modesau inadecvări din produs sau metode de lul CMMI) sau pornind de la un set de lucru să devină adevărate probleme. standarde la nivelul industriei software. Constatările auditului trebuie incluse Evaluările trebuie în primul rând să într-un raport iar acestea trebuie aduse la fie obiective și să fie făcute ținînd cont de cunoștința tuturor celor interesați. un set de standarde, așteptări sau model. Activitățile de evaluare includ revizuirile, Constatările (fie neconcordanțe, fie testele și auditurile. bune practici, fie sugestii de îmbunătățire) vor fi transformate în action points cu un Orice rezultat al muncii unei echipe responsabil și cu termen clar de execuție. poate fi evaluat: cerințele formalizate ale Acestea vor face obiectul unei sesiuni clientului (requirements), produsul în sine, extraordinare de re-evaluare, ca parte a orice plan sau documentație create de-a sesiunii curente de audit. lungul perioadei de viață a proiectului, precum și activitățile zilnice executate de Acțiunile de fixare/reparare constau către echipă – al căror rezultat este produ- în tot efortul necesar pentru depanasul final. Pe lângă requirements, arhitectura rea sau corectarea defectelor descoperite sau configurația produsului software poate în produsul muncii echipei, fie înainte, constitui subiectul unei evaluări care să-i fie după livrare. În domeniul nostru de asigure pe membrii echipei că rezultatul activitate acestea sunt cunoscute ca bug muncii lor este corect și complet iar pe fixing, dar NU trebuie limitate doar la clienți, că nevoile de business îi sunt luate asta. Procesul de dezvoltare al produsului în considerare și implementate. Chiar poate fi ajustat la nevoie, structura echiși felul în care o echipă își desfășoară pei se poate schimba dacă este necesar, iar activitățile de zi cu zi poate fi ameliorat în lista rămâne deschisă. Bineînțeles, orice urma unei evaluări făcute corect și la timp. schimbare trebuie precedată de o analiză riguroasă – nu ne-am dori să descoperim

nr. 42/decembrie 2015 | www.todaysoftmag.ro


TODAY SOFTWARE MAGAZINE că, implementând o schimbare, costul aso- încât costul activităților de fixare să fie cât ciat va depăși bugetul alocat sau, mai rău, mai mic. să constatăm că rezultatul nu este conform Costul asociat activităților de asigurare așteptărilor ori necesar. a calității pot fi suportate intern, în cadrul organizației, sau pot fi partajate cu clientul Resursele – presupunând că, în timpul negocierilor, Sunt trei ”actori” ce contribuie și departamentul de vânzări are toate datele influențează dinamica unei echipe de necesare pentru a-l convinge că este în proiect: membrii echipei (disponibilitatea interesul său. Existența unor exemple de acestora, cunoștințele și calificările lor), succes a activităților de QA este un atu tehnologia (ce sprijină și dă posibilitatea în plus în mâna departamentului de vânmembrilor echipei să-și ducă munca la zări, colegii noștri putând dovedi unor bun sfârșit într-un mod eficient) și proce- potențiali clienți că, investind timp sau sele de lucru (felul în care membrii echipei bani în activități de evaluare, pot obține un își folosesc zilnic cunoștințele și tehnologia produs la un cost total mai mic, prin reduavută la îndemână). În orice moment, pe cerea numărului de defecte și, implicit, a durata de viață a proiectului toate aceste costurilor necesare fixării acestora. trei ”ingrediente” trebuie să fie în echilibru. Bineînțeles, fiecare dintre resursele amin- Frecvența și durata tite aici vin cu un cost asociat ce trebuie Unele dintre activitățile descrise mai avut de asemenea în vedere – cel puțin din sus se întâmplă o singură dată, altele treperspectiva rentabilității proiectului. buie efectuate periodic sau constant pe Din punctul de vedere al asigurării întreaga durată de viață a proiectului. calității, costul asociat acesteia (CoQ) se Activitățile singulare sunt cele de felul poate rezuma în următoarea formulă: negocierilor ce preced semnarea unui contract sau planificarea și estimările inițiale, CoQ = CoP + CoN + CoA high-level. Din perspectiva asigurării calității, stabilirea obiectivelor de calitate, Unde: definirea procedurii de măsurare și moni• CoP este costul activităților pre- torizare, frecvența cu care se colectează ventive: upgrade-urile hardware sau măsurătorile, identificarea competențelor software, costurile instructajelor sau ale tehnice necesare îndeplinirii sarcinilor cursurilor necesare, activitățile de plani- de proiect și evaluarea din acest punct de ficare și analiză etc. . vedere a persoanelor disponibile, crearea • CoN reprezintă costul reparațiilor: planurilor manageriale sunt exemple de efortul necesar pentru fixarea defectelor, astfel de activități singulare. Din momentul retestarea fixurilor, costul livrării modi- în care acest tip de activități sunt încheiate ficărilor, rescrierea unor componente iar rezultatul lor (planificări, documente) sau (în cazuri extreme) a întregului sunt aprobate de către cei responsabili, produs. Este probabilă și nevoia pentru este puțin probabil ca acestea să se mai asigurarea de suport constant, 24/7, cli- modifice pe întreaga durată de viață a entului atunci când este necesar nevoilor proiectului. Dar aceasta nu înseamnă că sale de business, iar lista rămâne, din nu trebuie să facă subiectul unei revizunou, deschisă. iri periodice! Periodicitatea procesului de • CoA reprezintă costul activităților revizuire și factorii ce pot declanșa aceasta de evaluare: timpul necesar pentru revi- trebuie descrise: un contract se poate zuiri (nu numai pentru codul livrat, dar revizui sau înnoi anual ori în caz de forță și planurile, documentația arhitecturii majoră. Arhitectura unui produs software sau procesele de muncă trebuie revizuite sau etapele (milestones) dezvoltării acestuia periodic), testarea – pentru prima dată!- pot de asemenea suferi modificări, care vor a produsului sau a ultimelor modificări; declanșa la rândul lor revizuiri sau chiar verificările și validările independente modificări ale tuturor planurilor manaprecum și costul sesiunilor de audit. geriale, asigurându-se astfel alinierea cu nevoile de business și obiectivele clientului Scopul unui plan de management al și ale organizației din care facem parte. calității corect, cu șanse reale de reușită, va fi menținerea costului total al calității Revizuirea, verificarea, validarea și (CoQ) la un procent acceptabil în cadrul monitorizarea tuturor aspectelor ce comcostului total al proiectului prin echi- pun un produs trebuie efectuate continuu, librarea constantă a costurilor asociate fie că este vorba de requirements, cod scris, activităților de prevenire și evaluare astfel manuale de utilizare sau procesele de

producție. Fie că se întâmpla zilnic, săptămânal sau per sprint, acestea trebuie să fie întotdeauna în vederea întregii echipe de proiect. Sesiunile de audit trebuie de asemenea planificate. Planificarea nu trebuie să conțină datele sau durata exactă a acestora, dar frecvența (anual, semestrial sau o dată la fiecare release major), setul de reguli sau standarde aplicate, precum și procedura de audit (intern, extern, bazat pe interviuri sau pe observație independentă) trebuie descrise în planificarea activităților de asigurare a calității.

Monitorizarea obiectivelor de calitate Din momentul în care obiectivele de calitate sunt definite și schița planului de asigurare a calității este disponibilă, membrii echipei de proiect împreună cu conducerea organizației (sau orice alte persoane interesate în bunul mers al proiectului) se angajează să urmeze acest plan. Obiectivele de calitate devin scopuri în sine pentru membrii echipei și este în responsabilitatea managerului de proiect, ori a altei persoane desemnate special pentru asta, ca aceste obiective să fie atinse în intervalul de timp și bugetul alocat. Pentru monitorizarea corectă a activităților legate de asigurarea calității și a fi siguri că echipa urmează calea planificată trebuie definit un set de măsurători specifice fiecărui obiectiv, împreună cu frecvența de colectare și analiză a acestor măsurători. Lista de tool-uri disponibile pentru monitorizarea, măsurarea și raportarea activităților din cadrul unui proiect este suficient de mare, începând cu Jira sau TFS pentru managementul timpului sau altor aspecte ce țin de activitățile zilnice într-un proiect (bugs, work items, user stories) și mergând până la tradiționalul Excel pentru consolidarea rezultatelor și prezentarea acestora într-o formă grafică atrăgătoare. Tipurile de issues sau stories precum și etapele dezvoltării (sau reparației) acestora, tranzițiile de la idee la produsul final, pot fi personalizate în Jira – de exemplu- astfel încât să reflecte cât mai bine obiectivele de calitate asupra cărora s-a convenit. Astfel se pot identifica, număra sau filtra foarte ușor activitățile legate de quality assurance precum și eventualele costuri asociate. Înregistrarea estimării inițiale pentru fiecare work item trebuie încurajată iar progresul în cazul fiecărui

www.todaysoftmag.ro | nr. 42/decembrie, 2015

25


programare Quality Assurance 101

Fig. 1 - Un exemplu de workflow extins în Jira

asemenea work item trebuie monitorizat proiectului, iar aceasta poate furniza multe constant de-a lungul întregii durate de informații despre calitatea produsului viață a proiectului. sau a activităților din proiect în general. Aceste informații pot fi prezentate întrÎn acest fel deviațiile, tendințele, pot o formă grafică sugestivă, astfel încât să fi identificate și folosite mai apoi pentru se poată observa clar tendințele pentru îmbunătățirea predictibilității tuturor perioada următoare. Mai departe, pe baza activităților din proiect. Înregistrarea acestor direcții observate, bunele practici oricăror neconformități trebuie făcută din rutina zilnică pot fi folosite ca o bază folosind un issue type corect, ceea ce va în definirea unor noi obiective de calitate permite mai târziu, în cadrul procesului sau promovate și în alte echipe de proiect. de analiză, identificarea corectă a sursei În mod similar, practicile al căror rezultat și a momentului raportării. Se stabilește este sub așteptări sau sunt cauza creșterii dacă problema a fost descoperită în faza numărului de issues, pot fi atacate din timp de review, la testare sau, în cel mai rău caz, și stopate înainte să devină incontrolabile. raportarea vine de la client?. O dată ce o acțiune, chiar document, din Numărul neconformităților sau al cele descrise mai sus își dovedește utilitatea problemelor legate de calitate precum și pe baza măsurătorilor, poate fi refolosită timpul petrecut pentru analiza și rezol- în alt proiect sau chiar să devină standard varea lor poate fi astfel monitorizat intern al organizației. Măsurătorile colecseparat de activitățile ”normale” din cadrul tate de-a lungul timpului pot constitui de

Fig. 2 – Reprezentare grafică a măsurătorilor colectate

26

nr. 42/decembrie 2015 | www.todaysoftmag.ro

asemenea argumente puternice în favoarea oricărei practici în momentul în care s-ar dori prezentarea acestora ca un studiu de caz unui potențial client. Și reciproca afirmației de mai sus este adevărată: măsurătorile colectate pot convinge mult mai ușor orice echipă sau persoană să renunțe la o rutină al cărei rezultat nu este conform așteptărilor.

Retrospectiva Reprezintă momentul de reflecție, de evaluare a activităților legate de asigurarea calității executate până la acel moment. Sesiunile retrospective trebuie planificate la intervale regulate sau după atingerea unui milestone. A întârzia această sesiune până la finalizarea produsului nu este recomandată deoarece puține lucruri mai pot fi îmbunătățite în acest moment. Lecțiile învățate în perioada scursă de la ultima sesiune retrospectivă trebuie notate și


TODAY SOFTWARE MAGAZINE folosite la îmbunătățirea managementului asigurării calității pentru următoarea perioadă, în toate aspectele sale: planificare, resurse, obiectivele de calitate, definirea și colectarea măsurătorilor sau activitățile ce vor fi executate.

În concluzie Calitatea oricărui produs sau activitate este de o importanță capitală în lumea de azi. Scopul final al unui proiect de dezvoltare software trebuie să fie realizarea unui produs de calitate, nu doar implementarea de noi funcționalități. Un nivel înalt de calitate – fie că este vorba de produsul final sau de felul în care o echipă își desfășoară activitățile zilnice - trebuie să rămână o preocupare constantă a fiecărui membru al echipei. Pentru atingerea acestui obiectiv, echipa trebuie să-și identifice obiectivele de calitate și, de asemenea, să își planifice toate activitățile legate de acest scop. Beneficiile investițiilor în asigurarea calității, făcute complet și corect, sunt

infinite în termeni de satisfacție a clientului și a echipei, prin diminuarea numărului de defecte posibile (și deci a efortului necesar reparării acestora) în produsul final, livrat clientului. De asemenea, investiția într-un plan stabilit încă de la începutul oricăror activități poate asigura economii importante mai târziu

www.todaysoftmag.ro | nr. 42/decembrie, 2015

27


programare

Meet Jenkins

D

acă citești această revistă cel mai probabil lucrezi în IT și dacă lucrezi în IT e și mai probabil să fi auzit sau chiar lucrat cu Jenkins sau cu fostul Hudson. De la QA la Dev, DevOps, BA, PM, DM și așa mai departe toți interactionează cu Jenkins sau cu un alt server de Continous Integration. Răzvan Ariciuc razvan.ariciuc@yonder.com QC engineer @ Yonder

28

nr. 42/2015, www.todaysoftmag.ro

Deoarece Jenkins poate efectua o listă după instalare). extensivă de task-uri prin multitudinea de plugin-uri disponibile, el poate fi folosit Odată instalat Jenkins poate fi acceîn dezvoltarea a aproape oricărui proiect sat printr-un browser la localhost: 8080, indiferent de limbaj sau de arhitectură. aceasta fiind adresa default. Adresa poate fi ușor reconfigurată prin intermediul Eu încă nu am găsit proiect în realiza- interfeței, aceasta fiind și principalul mod rea căruia Jenkins să nu mă poată ajuta cu de a interacționa cu Jenkins. automatizarea unui task. Tocmai din acest motiv Jenkins este unul din cele mai foloUrmătorul pas după instalare ar tresite soluții de CI și, de multe ori, primul bui să fie securizarea serverului deoarece server de CI întâlnit de un junior. implicit Jenkins se instalează nesecurizat, oricine cu acces la server are control total asupra task-urilor și configurărilor. Pentru Instalare și configurare a securiza Jenkins începem prin a naviga Jenkins poate fi instalat pe oricare din sis- la “Manage Jenkins” urmat de “Setup temele de operare populare, fie printr-un Security”. pachet nativ (Windows, Ubuntu/Debian, Red Hat/Fedora/CentOS, Mac OS X, openSUSE, FreeBSD, OpenBSD sau Gentoo) fie prin „java -jar jenkins.war.” (Pe Windows acesta poate fi setat și ca windows service


programare

TODAY SOFTWARE MAGAZINE

În această pagină avem mai multe opțiuni pentru securiDacă vă găsiți în această situație urmați pașii de la linkul zare (Legacy mode, Logged-in users can do anything, Matrix-based următor ( https://wiki.jenkins-ci.org/display/JENKINS/ security, Project-based Matrix Authorization Strategy). Cel mai Disable+security ) folosit mod fiind Matrix-based security în care se setează drepturi pentru fiecare utilizator și pentru fiecare tip de task pe care acesta îl poate efectua.

Dacă folosiți acest mod de securizare va trebui să fiți atenți la majuscule / minuscule deoarece “Admin”, “admin” sunt considerați utilizatori diferiți. Al doilea aspect la care trebuie să acordați atenție sunt drepturile atribuite user-ilor. Este foarte ușor să ajungeți în situația în care nu aveți un user cu drepturi depline (un admin).

Jenkins Job Jenkins oferă posibilitatea creării mai multor tipuri de job (proiecte) sau copierea unui job existent. Orice job se creează prin accesarea opțiunii „New Item” din Dashboard urmat de tipul de job dorit, acesta fiind posibil doar dacă utilizatorul are drepturile necesare. În caz contrar, opțiunea de „New Item” nu este afișată.

www.todaysoftmag.ro | nr. 42/decembrie, 2015

29


programare Meet Jenkins

Esența unui job (proiect) în Jenkins este de a automatiza acțiunile care altfel ar trebui executate manual. Numărul de pași, acțiunile executate de fiecare pas și rezultatul fiecărui pas depind de modul în care au fost configurați și diferă enorm de natura proiectului. Însă în general orice job în Jenkins va avea următoarea structur Indiferent de scopul unui job, o configurare este absolut necesară, cea de „Build”. În acest pas se setează acțiunea pe care trebuie să o execute acest job. Pe lângă setarea pasului de „Build” într-un job Jenkins, în funcție de plugin-urile instalat pe server, pot fi setați următorii pași și nu numai: • transmiterea de parametri către job. • pași premergători jobului, care pregătesc mașina pe care va fi executat jobul. • pas pentru a seta locația fișierelor sursă.De obicei ele sunt păstrate pe un VCS. • momentul în care jobul să se execute (în „Build Triggers”) • pași post „Build” pentru generarea rapoartelor, pentru a porni alte joburi, pentru a trimite notificări sau pentru clean-up.

30

nr. 42/decembrie 2015 | www.todaysoftmag.ro

Configurări adiționale Versatiliatea lui Jenkins constă în faptul că este susținut de o comunitate care adaugă constant noi functionalități prin intermediul plugin-urilor. Cum pentru smartphone există vorba „There’s an app for that”, pentru Jenkins echivalentul ar fi „There’s a plugin for that”. Dezavantajul este la fel ca și în cazul app-urilor, că multe pot fi out-dated, iar calitatea și performanța depind total de autorul plugin-ului. În Jenkins plugin-urile pot fi adăugate, șterse, actualizate prin „Manage Plugins” din „Manage Jenkins”. La instalare, Jenkins are un set minim de plugin-uri, însă pentru a te putea folosi eficient de Jenkins mai multe plugin-uri ar trebui instalate. Dintre plugin-urile pe care le-am folosit aș vrea să le menționez pe următoarele: • Subversion Plug-in, Ant Plugin, GitLab Plugin – pentru build management; • Cucumber Reports Plugin, JUnit Plugin, Checkstyle Plug-in – pentru rapoarte; • Email Extension Plugin – pentru configurarea email-urilor; • Configuration Slicing plugin – permite configurarea simultană a mai multor joburi.


TODAY SOFTWARE MAGAZINE

Pe lângă instalarea plugin-urilor, Jenkins mai are nevoie de configurarea unui server de E-mail, diferite configurări pentru Git, Maven, Ant , Java în funcție de nevoi. În general orice plugin nou adaugă setări ce se pot configura la nivel global pentru acel plugin. Toate aceste configurari se fac în „Configure System”.

Concluzie Am parcurs în linii mari tot ce trebuie să știți pentru a putea instala, configura și crea un proiect în Jenkins, însă ca multe tool-uri open-source ce au o comunitate mare în spate, modul de configurare și scopul în care poate fi folosit variază de la un proiect la altul. Principalele aspecte de care ar trebui să țineți cont când decideți să folosiți Jenkins ca server de CI sunt cerințele de CPU, memorie și spațiu de stocare. Jenkins nu este un tool finisat și optimizat din punct de vedere al performanței și a resurselor, iar plugin-urile „3rd party” vin cu riscuri în această privință.

www.todaysoftmag.ro | nr. 42/decembrie, 2015

31


programare

De la Zero la RESTful în 4 pași. Fundația.

D

e z v o l t a re a d e ap l i c aț i i î n m o d pro f e s i o n i s t f o l o s i n d L A M P i mp u n e u n f ram e w o r k m o d e r n . Acesta standardizează modul în care muncim: în primul rând, prin folosirea unei organizări predictibile a codului și a fișierelor și în al doilea rând, pentru că vine la pachet cu utilități și librării de bază. Mai mult decât atât, un framework abordează noțiuni de securitate la baza software-ului, este un factor cheie în îmbunătățirea muncii de echipă prin impunerea standardelor de codare și integrarea mai ușoară în echipă a noilor colegi. Mai mult, în spatele său stă o comunitate, și ne face mai eficienți pentru că ne ajută să ne concentrăm în primul rând pe funcționalitatea proiectului nostru. Cu toate acestea, există anumite proiecte unde folosirea unui framework complet este percepută drept o povară pentru dezvoltatori. Microservicii individuale, mici prototipuri, site-uri web de complexitate redusă, API-uri simple, funcționalitate mock. Iată câteva cazuri în care programatorul ar prefera să beneficieze doar de amprenta redusă a unor librării. Acesta este momentul în care micro-framework-urile intră în scenă, închegând aceste librării cu costuri minimale. Împreună vom construi o aplicație pentru managementul datelor despre vehicule, pentru a putea fi informați atunci când anumite operații trebuie efectuate. Acest lucru se va desfășura pe parcursul câtorva articole. Iată un roadmap succint: 1. pregătirea proiectului și a dependințelor, suport TDD și capabilități de logare 2. design al API-urilor RESTful; BDD folosind Behat 3. implementarea API-uri definite la pasul anterior 4. mediu de dezvoltare cu Vagrant și Ansible; automatizarea proceselor de build; integrare continuă.

Pregătirea proiectului Să începem prin crearea unui nou proiect: pregătim un director nou de lucru și îl accesăm. Mai jos folosesc o cale absolută pe mașina mea de lucru: $ mkdir -p /Users/g/Sites/learn/silex-tutorial $ cd /Users/g/Sites/learn/silex-tutorial

Instalare Composer Pentru managementul dependințelor vom utiliza Composer. Vine împachetat sub forma unei arhive Phar, deci trebuie să fim atenți să avem extensia phar activată în php.ini: extension=phar.so # să nu fie comentată această linie

Personal prefer să am Composer instalat global, deoarece îl folosesc la aproape toate proiectele mele. Mai jos este o linie de comandă care efectuează această instalare (avem nevoie de sudo). $ curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer

Declararea Silex drept dependință

În lumea PHP micro-framework-urile au devenit cetățeni de Următorul pas este crearea fișierului composer.json cu ajutoprim rang în urmă cu mult timp. Slim, Flight, Limonade, GluePHP, rul căruia vom face managementul dependințelor. Phlyty sunt doar câteva exemple cunoscute. Noi vom întrebuința Silex, care are la bază componente ale mai popularului Symfony. { ”require” : { Pentru a ne forma o idee despre cât de suplu e Silex, să aruncăm ”silex/silex” : ”1.*” } o privire asupra container-ului său de injectare a dependințelor (Pimple) și să vedem cum se compară cu cel de la Symfony } (imaginea este preluată dintr-o prezentare a lui Igor Wiedler): În directorul de lucru, vom executa următoarea comandă: $ composer install

Aceasta nu doar că ne va instala Silex și toate dependințele declarate ale acestuia, dar va crea de asemenea un fișier numit composer.lock care va conține o stare cunoscută a tuturor dependințelor deja instalate.

Primul request A venit momentul să pregătim o mică strategie pentru aranjarea fișierelor proiectului nostru. Este considerată o bună practică păstrarea fișierelor accesibile public într-un director separat, așadar noi vom folosi web/ în acest scop.Încărcarea resurselor și alte chestiuni de bucătărie internă le vom avea în app/bootstrap. php. Iată cum plănuim să aranjăm fișierele și directoarele:

32

nr. 42/decembrie, 2015 | www.todaysoftmag.ro


security

TODAY SOFTWARE MAGAZINE

Fișierul de bootstrap defineste obiectul aplicației Silex și îl returnează. Conținutul fișierului accesibil public e foarte simplu, instanțiază acest obiect și îl rulează prin apelarea metodei run() Dacă ne dorim ca această funcție closure să fie executată pena acestuia. tru mai multe metode HTTP, putem folosi abordarea de mai jos: Iată cât de ușor ne folosim de caracteristica autoload a $app Composer: ->match(’/’, function () {return ’Up and runrequire_once(__DIR__ . ’/../vendor/autoload.php’);

ning’; }) ->method(’GET|POST’);

Această linie simplă ne salvează de multă muncă, deoarece va ști să încarce orice clasă din directorul vendor/ fără să fie necesar Să interpretăm puțin acest cod: prima dată căutăm potrivirea să facem asta manual de fiecare dată. cu șablonul, apoi atașăm funcția de tip closure, după care specifiHaideți să vedem ce se întâmplă dacă accesăm direct fișierul căm lista metodelor la care poate fi accesat acesta. web/index.php:

Adăugarea suportului TDD Este important să avem o metodă de a scrie teste pentru aplicația noastră. Standardul de-facto în lumea PHP este PHPUnit, chiar și Drupal8 a migrat la acesta de la SimpleTest pe care în folosea anterior. Să ne întoarcem puțin la proiectul nostru, pentru a vedea cum putem adăuga în mod simplu suportul pentru dezvoltarea test-driven.

Iată cum Silex răspunde cererii noastre. Ne indică faptul că nu are idee ce ar trebui să facă în cazul cererii noastre, deoarece nu am definit niciun comportament al aplicației până în acest moment. E timpul să adăugăm unul! Să definim așadar un comportament simplu, care servește cereri de tip GET și răspunde cu un text simplu. Vom face asta definind un șablon de rutare, care este compus din: șablonul în sine (’/’ in exemplul de mai jos) metoda HTTP la care poate fi accesat șablonul (verbul get() apelat pe obiectul aplicație) funcția După cum se poate observa, avem nevoie de un fișier de de tip closure care va fi executată. configurare pentru PHPUnit și de un director unde să păstrăm testele. Totul funcționează atunci cănd rulăm testele: $app->get(’/’, function () { return ’Up and running.’; });

www.todaysoftmag.ro | nr. 42/decembrie, 2015

33


programare De la Zero la RESTful în 4 pași. Fundația. Să rulăm din nou testele:

Haideți să adaugăm o clasă ce va verifica ruta principală pe care am definit-o anterior; ne vom referi la ea în continuare ca “ruta de status”, deoarece accesarea ei ne spune rapid dacă aplicația funcționează sau nu. În fișierul tests/BasicTest.php vom defini /** * Clasa de test simpla pentru a verifica ruta de status */ class BasicTest extends WebTestCase

Este important să notăm că testul nostru funcțional extinde Silex\WebTestCase, așadar va fi nevoie să implementăm metoda createApplication() pentru a spune testului cum să primească obiectul de aplicație Silex. Este destul de ușor, tot ce trebuie să facem este să includem fișierul bootstrap și să returnăm obiectul $app. Obiectul WebTestCase este definit într-un pachet extern. Așadar, trebuie să adăugăm o nouă secțiune în composer.json: ”require-dev” : { ”symfony/browser-kit”: ”>=2.3,<2.4-dev” }

Metoda de test în sine este extrem de simplă: inițiem o cerere de tip GET pe ruta de status, verificăm faptul că răspunsul are codul de status corect (200) și conținutul efectiv este “Up and running”. /** * Verificarea rutei de status */ public function testStatusRoute() { $client = $this->createClient(); $client->request(’GET’, ’/’); $this->assertTrue($client->getResponse()->isOk()); $this->assertEquals( ’Up and running’, $client->getResponse()->getContent() ); }

Ca preferință personală, îmi place să am un namespace separat pentru teste. Așadar namespace TutorialTest are nevoie de puțină configurare în composer.json pentru a se putea încărca automat. Am adăugat următoarea secțiune: ”autoload” : { ”psr-0” : { ”TutorialTest” : ”tests” } }

După efectuarea acestei modificări este important să nu uităm să rulăm: $ composer update

Aceasta va rezolva toate dependințele proiectului nostru, și va scrie noile versiuni ale acestora în composer.lock.

Aceasta a fost doar o mică introducere în testarea funcțională, puteți investiga mai multe în documentația Symfony a acestei componente.

Capabilități de logare Integrarea librăriilor externe se face în Silex prin intermediul furnizorilor. Dacă dorim să folosim puternica librărie Monolog în scopuri de logare, o vom privi ca pe un serviciu și să o integrăm în aplicația noastră prin folosirea unuia din furnizorii de servicii. Din fericire, există deja la îndemână MonologServiceProvider, haideți să îl folosim. Vom adăuga mai întâi o nouă cerință în composer.json: ”monolog/monolog”: ”>=1.6.0”

și apoi vom rula composer update pentru a o instala. În continuare, vom crea directorul de log-uri și îi vom atribui permisiile de rigoare: $ mkdir logs $ touch logs/dev.log $ chmod -R 766 logs/

În plus, vom evita versionarea fișierelor de log prin adăugarea directorului logs/ în lista .gitignore. Să vedem o utilizare simplă a noii noastre funcționalități de logare. Modificăm puțin codul rutei de status, după cum urmează: $app ->match(’/’, function () use ($app) { $app[’monolog’]->addInfo(’Logging example in the status route’); return ’Up and running’; }) ->method(’GET|POST’);

Dacă verificăm fișierul de log vom observa că apare fiecare request pe care îl facem. Până acum am creat o aplicație pornind de la un Silex vanilla, care răspunde unei cereri GET simple, am adăugat suport pentru TDD, precum și capabilități de logare. În partea următoare vom trece la designul API-ului nostru RESTful.

Referințe 1. 2. 3. 4. 5.

http://silex.sensiolabs.org/ http://www.slideshare.net/IgorWiedler/silex-liip https://drupal.org/node/2012184 http://symfony.com/doc/current/book/testing.html#functional-tests https://github.com/Seldaek/monolog

Georgiana Gligor gb@tekkie.ro Owner @Tekkie Consulting

34

nr. 42/decembrie 2015 | www.todaysoftmag.ro


contabilitate

Impozitele pe clădiri - la ce să ne așteptăm în 2016?

C

onform Codului Fiscal, din 2016, cu anumite excepții, orice persoană care are în proprietate o clădire situată în România datorează anual impozit pentru acea clădire. Sistemul de impozitare a proprietăților imobiliare se va schimba radical, odată cu aprobarea Noului Cod Fiscal. Cele mai afectate vor fi persoanele fizice care dețin clădiri nerezidențiale, folosite în scop economic, adică spații comerciale sau de birouri.

Ioana Costea ioana.costea@aiconsulting.ro Expert contabil Managing Partner @ A&I Consulting

Destinația clădirii - rezidențială sau nerezidențială - este principalul criteriu în funcție de care se vor stabili taxele locale de anul viitor. În prezent, Codul fiscal nu face această distincție și instituie formulele de calcul (cota de impozit, valoarea impozabilă) în funcție de statutul proprietarului: persoană fizică sau juridică. Prin urmare, persoanele fizice care acum plătesc aceleași impozite, indiferent de scopul în care este utilizat imobilul, vor datora mai mult, din 2016. Pentru spațiile comerciale sau de birouri, vor plăti exact ca firmele. Taxa va fi cel puțin dublă și va putea ajunge chiar de 20 de ori mai mare. Nivelul va depinde de decizia consiliilor locale care vor putea alege o cotă din intervalul 0,2%-1,3%. Alinierea cotelor de impozit în funcție de destinația clădirii va reașeza piața imobiliară unde, până acum, persoanele fizice aveau avantajul impozitelor mai mici. Din 2016, proprietarii persoane fizice de clădiri nerezidențiale vor avea același tratament ca firmele. Până acum, tendința, în special în marile orașe, a fost ca administrațiile locale să aleagă limita maximă a cotei de impozit, prevăzută de Codul fiscal. Prin urmare este de așteptat ca majorarea, pentru persoanele fizice, să fie semnificativă. Pe de altă parte, noul Cod fiscal elimină taxele majorate pentru deținerea mai multor proprietăți, precum și cele pentru

proprietățile care au suprafețe mai mari de 150 mp. În prezent, persoanele fizice care au în proprietate două sau mai multe clădiri datorează un impozit majorat: cu 65% pentru prima clădire în afara celei de la adresa de domiciliu, cu 150% pentru a doua clădire și cu 300% pentru a treia și următoarele, prevedere eliminate in noul Cod Fiscal.

Clădiri rezidențiale Impozitul se va calcula, din 2016, prin aplicarea unei cote cuprinse între 0,08% 0,2% asupra valorii impozabile a clădirii. Valoarea impozabilă a clădirii se va determina prin înmulțirea suprafeței construite desfășurate a acesteia, exprimată în metri pătrați, cu valoarea impozabilă corespunzătoare, exprimată în lei/mp din tabelul prevăzut de Codul fiscal. De exemplu, valoarea impozabilă pentru o clădire cu cadre din beton armat sau cu pereți exteriori din cărămidă arsă sau din orice alte materiale rezultate în urma unui tratament termic și/sau chimic care are instalații de apă, canalizare, electrice și încălzire va fi de 1.000 lei/mp (pentru alte tipuri de clădiri scade până la 75lei/mp). În prezent, cea mai ridicată valoare impozabilă este de 935 lei/ mp, iar cea mai mică 63 lei/mp. Valoarea impozabilă se va ajusta în funcție de rangul localității și zona în care este amplasată clădirea, prin înmulțirea cu un coeficient de corecție. De exemplu,

www.todaysoftmag.ro | nr. 42/decembrie, 2015

35


contabilitate Impozitele pe clădiri - la ce să ne așteptăm în 2016? pentru o clădire amplasată într-o localitate de rang 0, în zona A, coeficientul va fi de 2,6 (și va scădea, în funcție de rang și zonă, până la 0,9). Coeficientul de corecție se reduce cu 0,10 pentru apartamentele din blocuri cu mai mult de 3 niveluri și 8 apartamente. Totodată, valoarea impozabilă a clădirii se reduce în funcție de anul terminării (cu 50% dacă are o vechime de peste 100 de ani și scade până la 10% dacă are o vechime între 30 de ani și 50 de ani inclusiv.)

Clădiri nerezidențiale

Impozitul se va calcula, din 2016, prin aplicarea unei cote cuprinse între 0,2% - 1,3%, inclusiv, asupra valorii impozabile rezultată: • rezultată dintr-un raport de evaluare întocmit de un evaluator autorizat în ultimii 5 ani anteriori anului de referință; • lucrărilor de construcții, în cazul clădirilor noi, construite în ultimii 5 ani anteriori anului de referință; • clădirilor care rezultă din actul prin care se transferă dreptul de proprietate, în cazul clădirilor dobândite în ultimii 5 ani. Dacă valoarea clădirii nu poate fi calculată asupra uneia dintre aceste trei valori, cota de impozit va fi de 2% și se va aplica asupra valorii impozabile calculate ca pentru clădiri rezidențiale.

Clădiri cu destinație mixtă Impozitul se va determina prin însumarea impozitului calculat pentru suprafața folosită în scop rezidențial cu cel pentru suprafața folosită în scop nerezidențial. Dacă cele două tipuri de suprafețe nu pot fi evidențiate distinct, impozitul se va datora ca pentru clădiri: • rezidențiale, dacă este înregistrat un domiciliu fiscal și nu se desfășoară nici o activitate economică; • nerezidențiale dacă este înregistrat un domiciliu fiscal la care se desfășoară activitatea economică, iar cheltuielile cu utilitățile sunt înregistrate în sarcina persoanei care desfășoară activitatea economică. Valoarea impozabilă a clădirilor deținute de persoane juridice va fi valoarea de la 31 decembrie a anului anterior celui pentru care se va datora impozitul și poate fi:

36

nr. 42/decembrie 2015 | www.todaysoftmag.ro

• ultima valoare impozabilă înregistrată în evidențele organului fiscal; • valoarea rezultată dintr-un raport de evaluare întocmit de un evaluator autorizat; • valoarea finală a lucrărilor de construcții, în cazul clădirilor noi, construite în cursul anului fiscal anterior; • valoarea clădirilor care rezultă din actul prin care se transferă dreptul de proprietate, în cazul clădirilor dobândite în cursul anului fiscal anterior; • valoarea înscrisă în contabilitatea proprietarului clădirii și comunicată concesionarului, locatarului, titularului dreptului de administrare sau de folosință, după caz. Valoarea impozabilă se va actualiza o dată la 3 ani pe baza unui raport de evaluare. În caz contrar, cota impozitului va fi 5%. În prezent, dacă evaluarea nu este efectuată timp de 3 ani, cota de impozit este între 10% si 20%, iar pentru clădirile nereevaluate în ultimii 5 ani cota este între 30% și 40%. În prezent, potrivit hotărârilor consiliilor locale, marile orașe au cote de impozit apropiate de limita maximă prevăzută de Codul fiscal în cazul persoanelor juridice care au făcut reevaluarea clădirii în ultimii trei ani anteriori anului fiscal de referință. Conform Codului fiscal, consiliile pot alege o cotă din intervalul 0,25% -1,50%. În Cluj Napoca cotele propuse în proiectul de HCL pentru 2016 sunt următoarele: • clădiri rezidențiale - cota de 0.1%/an asupra valorii impozabile • clădiri nerezidențiale – cota de 1%/an asupra valorii impozabile Deci, dacă o persoană fizică are un apartament, evaluat la 100.000 euro, închiriat unei firme, care desfășoară activitate economică în el, impozitul pe clădire începând cu 2016 va fi de 1.000 euro/an.


educație

7 mituri despre muncă care sunt nocive pentru creierul tău

D

istragerile constante au devenit normă în spaţiile de lucru din întreaga lume. Angajaţii se străduiesc să realizeze cât mai multe și să se concentreze mai eficient pe sarcini, fără a înţelege însă cum funcţionează starea de atenţie, cum pot să o atingă şi să o folosească inteligent. Cercetările Steelcase, lider mondial în industria mobilierului pentru birouri, dezvăluie şapte mituri și adevărurile lor despre cum poţi să-ţi gestionezi atenția în spaţiul de lucru. Echipa Steelcase

1. „Pot să fiu atent şi din spatele încăperii.” Atenţia depinde de cât de aproape suntem de stimulii senzoriali. Pentru a crea idei noi, e nevoie să lucrăm în spaţii unde colegii ne pot auzi bine, să avem contact vizual unii cu ceilalţi şi să putem vizualiza uşor materialele şi documentele comune de lucru.

2. „Dacă stau pe scaun toată ziua, mă voi concentra mai bine pe ce am de făcut.” Atunci când rămânem aşezaţi pentru o perioadă foarte lungă de timp, ne sabotăm abilitatea de concentrare. Mişcarea stimulează producţia unei proteine numită BDNF (brain-derived neuro-prophic factor), ce ajută zonele creierului vitale pentru învăţare, memorie şi gândire abstractă. Un sfat de la specialiştii Steelcase: Ridică-te de pe scaun, fă o plimbare sau încurajează-ţi angajatorul să cumpere un birou cu bandă de alergat încorporată.

3. „Desenul este doar pentru persoanele creative.” Oamenii gândesc în forme, imagini şi modele – nu în numere şi litere. Folosind instrumente digitale şi analogice pentru a vizualiza informaţii, putem gândi mai bine şi creşte concentrarea. Ajută-ţi creierul să organizeze informaţiile prin a-ţi schiţa pe o foaie de hârtie ideile şi proiectele la care lucrezi.

4. „O să fiu mai productiv dacă răspund la emailuri în timpul acestei discuţii telefonice.” Nu ne putem gândi conştient la mai mult de două lucruri în acelaşi timp. Când avem impresia că suntem multitasking, de fapt ne comutăm foarte rapid atenţia de la un lucru la altul. Cu cât o facem mai mult, cu atât devenim mai slabi la a acorda importanță și a rezolva eficient una dintre sarcini. Sfatul specialiştilor Steelcase este să creăm spaţii de lucru care să ne ferească de distrageri şi să ne sprijine în a ne concentra la o singură activitate o dată.

www.todaysoftmag.ro | nr. 42/decembrie, 2015

37


educație 7 mituri despre muncă care sunt nocive pentru creierul tău

5. „Creierul meu este uşor de distras şi nu se poate schimba” Tehnicile de sporire a stării de Mindfulness – trăirea în momentul prezent, meditaţia, exerciţiile de respiraţie - te pot ajuta să îţi antrenezi creierul. Practicile s-au dovedit eficiente în creşterea activităţilor undelor gamma în creier, indicând gândirea concentrată intens. Identifică un loc în birou pentru momente de mindfulness şi pace mentală.

6. „Dacă lucrez mai multe ore, o să realizez mai multe.” Creierul oboseşte. Capacitatea lui este limitată şi concentrarea totală nu este posibilă pentru mai mult de 45 de minute. Fă-i creierului tău o favoare şi ia pauze pe parcursul zilei. Mută-te într-o zonă de relaxare sau una dedicată socializării pentru a te regenera după o perioadă extinsă de lucru concentrat.

7. „O să dorm destul după ce mor.” Somnul joacă un rol esenţial în abilitatea noastră de a ne concentra şi de a rămâne concentraţi. Când ne privăm de somn, puterea de a învăţa şi de a ne controla stările scade. Convinge-ţi angajatorul să creeze spaţii de odihnă în cadrul biroului şi fă scurte pauze de la lucru, ce îţi vor regenera creierului.

38

nr. 42/decembrie 2015 | www.todaysoftmag.ro

Așadar aceste mituri sunt false și debarasarea de ele ne poate ajuta să ne schimbăm obiceiurile existente şi să câştigăm mai mult control asupra creierului şi a vieţii noastre. Spaţiul de lucru poate ajuta, de asemenea. Într-un birou de companie conceput ca un ecosistem ce include diferite zone şi tipuri de amenajare, angajaţii pot alege spaţiul care


marketing

Provocări pentru companii în 2016

Î

nceputul de an pare mereu o oportunitate bună de a face lucrurile ,,mai bine ca anul trecut’’ și de a ne dezvolta. Și anul 2016 poate fi cadru ideal de creștere a companiei noastre, dacă vom ști și cum să abordăm provocările pe care noul an ni le pregătește.

Ana-Maria Trifan anamaria.trifan@ happy-employees.eu PR & Custumer Care Specialist @ Azimut Happy Employees

Înainte însă de a vedea ce ne aduce noul an, caracterizăm sumar contextul în care acestea vin : • Ne pândește o nouă criză a talentelor cauzată de îmbătrânirea populației și a standardelor educaționale insuficiente. • Până în 2020 vor fi mai mulți oameni care părăsesc piața muncii decât cei care intră. • Europa va avea nevoie de încă 45 milioane de lucrători în 2030, față de 2010 pentru susținerea creșterii economice, iar America, de încă 25 milioane. • 70% dintre anagajatorii germani consideră că sunt presați să găsească oameni potriviți. Chiar dacă la prima vedere suntem tentați să gândim că mai este mult până atunci sau că situația nu e chiar atât neagră, primele semne ale acestei probleme încep să se vadă deja, chiar și pe piața din România unde, în anumite sectoare, munca responsabililor de recrutare devine din ce în ce mai provocatoare în a găsi personal calificat pentru posturile disponibile.

Ce putem face? În primul rând să ne informăm și în al doilea rând, să începem să acționăm cât de repede. Primii pași trebuie făcuți acum! Drept urmare, haideți să vedem ce semne de exclamație ne va trasa anul 2016 și cum am putea să le facem față.

2016- o nouă generatie pe piața muncii Până acum, piața muncii a fost formată din: Tradiționaliști (cei născuți înainte de 1945), Baby Boomers (19451964), Generația X (1964-1980), Millenials - generația Y (1980-1994). Anul 2016 însă, ne-a pregătit mai multe surprize. Prima este că o nouă generație – generația Z- va intra pe piața muncii la anul. Generația Z este alcătuită din persoanele născute în perioada 1995-2010 și prezintă câteva caracteristici generale : au un spirit antreprenorial mai dezvoltat, sunt mai loiali, mai flexibili și realiști în ceea ce privește cariera lor decât generația Y. Aproape o treime dintre ei spun că își doresc să devină manageri în următorii 5 ani, iar 45% din ei afirmă că va fi o provocare să lucreze alături de colegii din generația Baby Boomers.

www.todaysoftmag.ro | nr. 42/decembrie, 2015

39


marketing Provocări pentru companii în 2016

Ce putem face în acest context? În primul rând, trebuie să ținem cont de o informație prețioasă despre această nouă generație: sunt mai dispuși să aleagă oportunitățile de dezvoltare și echilibrul dintre job și viața personală, în detrimentul salariului. Luând aceste lucruri în considerare, vom ști cum să ne poziționăm pe piață și cum să atragem potențialii angajați din această categorie sau vom ști cum să ne raportăm la ei în calitate de manageri sau colegi.

datorită bonusurilor oferite, oportunităților sau contextelor familiale. Tocmai datorită crizei talentelor, companiile încep să se gândească tot mai mult la această soluție pentru a acoperi nevoile firmei. Beneficiile unui astfel de compromis includ: angajatul nu mai necesită atât de multă pregatire (training), este familiarizat cu procedurile și cultura organizației și, de asemenea, vine cu o perspectivă nouă.

Provocarea aici constă în a găsi strategiile necesare de reintegrare a acestor angajați atât în rândul echipelor de lucru cât, de ce Se estimează că 3.6 milioane de baby boomers se vor pensi- nu și în fața stakeholder-ilor (clienților). ona anul următor, lăsând în urmă un deficit destul de mare de leadership. În acest context, se așteaptă ca un sfert din angajații Trăim într-o eră dinamică. La fel va fi și anul 2016, care va millenials să devină manageri. Punctele slabe ale acestui nou val aduce însă și ceva provocări. Suntem pregătiți pentru ele? Acum, de lideri sunt: expertiza tehnică și influența. când avem măcar privirea de ansamblu asupra ceea ce ne paște, Ce putem face în acest caz? Să ne îndreptăm atenția spre vom lua atitudine, atât ca angajat cât și ca angajator, pentru a angajații noștri, să fim mai atenți în a le oferi feedback constructiv beneficia (nu a suferi) de pe urma acestor provocări? Dacă da, cât mai des, în locul evaluării anuale; să investim atenție într-un ce vom face concret în acest sens? Totul depinde de noi! Succes! plan de succesiune; nu în ultimul rând, să investim în dezvoltarea expertizei angajaților noștri, în cursuri online. Referințe:

Nevoie acută de lideri

Tot mai mulți angajați boomerang Ce este un angajat boomerang? Un angajat care pleacă din companie, urmând să revină ulterior în aceeași companie,

Young spirit Mature organization A shared vision Join our journey! www.fortech.ro

40

nr. 42/decembrie 2015 | www.todaysoftmag.ro

Sursa: Oxford Economics, Workforce 2020: The Looming Talent Crisis Sursa: http://www.hrnext.com/blog/5-hr-trends-to-watch-for-in-2016/ Sursa: http://www.forbes.com/ sites/danschawbel/2015/11/01/10-workplace-trends-for-2016/



sponsori

powered by


Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.