niedziela, 24 lutego 2013

Jasmine i testy jednostkowe w Javascript

Do tej pory testy jednostkowe dla javascriptu były dla mnie trochę jak YETI - niby tu i tam się o nich mówi ale trudno mi było znaleźć dowód na ich istnienie. Można oczywiście użyć Selenium i tak też zrobiliśmy ale musiało, poprostu musiało istnieć "lżejsze" rozwiązanie...

Jasmine

No i znalazło się. Jasmine to Javascript napisany do testowania Javascriptu i wio :

1. Pliki źródłowe oraz przykłady zastosowań biblioteki Jasmine można znaleźć tutaj --> http://pivotal.github.com/jasmine/.

2. Generalnie jedyny sposób jaki znalazłem na testowanie zmian w drzewie DOM to odpalenie testów w ramach samej strony. Poniższy kod odpala testy tylko jeśli dołączony jest określony parametr, którego nazwę określimy wcześniej. Czy powinniśmy z tym kodem iść na produkcję? - a dlaczego nie!

 <html>  
   <head>  
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
     <title>Home</title>  
          <link rel="stylesheet" type="text/css" href="/resources/jasmine/jasmine.css" />  
          <script type="text/javascript" src="/resources/jquery.js"></script>  
          <script type="text/javascript" src="/resources/example.js"></script>  
           <c:if test="${not empty param.tests}">  
                <script type="text/javascript" src="/resources/jasmine/jasmine.js"></script>  
                <script type="text/javascript" src="/resources/jasmine/jasmine-html.js"></script>  
                <script type="text/javascript" src="/resources/tests.js"></script>  
                <script type="text/javascript" src="/resources/runJasmine.js"></script>  
            </c:if>  
   </head>  
   <body>  
        <div id="result"></div>  
        <div id="clickMe">Click me</div>  
   </body>  
 </html>  

3. Możemy się nawet pobawić w TDD - tworzymy pierwszy test :

 describe("A suite", function() {  
  it("has a blue background after click", function() {  
   //given  
       var clickMe=$($("#clickMe"));  
      //when  
      clickMe.click();  
      //then  
      expect(clickMe.css("background-color")).toBe("rgb(0, 0, 255)");  
  });  
 });  
Który oczywiście nie przechodzi :

4. Implementujemy funkcję :

 $(document).ready(function() {  
      $("#clickMe").click(function() {  
           $(this).css("background-color", "blue");  
      });  
 });  
I działa :



Możemy sobie teraz zmieniać, ciąć i modyfikować javascript bez bólu, że znowu ni z ch.. ni z owego wszystko przestanie działać. (i tak przestanie ale teraz przynajmniej dokładnie kontrolujemy co psujemy)

Da się? Da się!.

A co z Ajaxem

A co jeśli chcemy przetestować wywołanie asynchroniczne? Też nie ma z tym problemu.
1. Kod na serwerze :

 @RequestMapping(value = "/add", produces = "application/json", method = GET)  
      public @ResponseBody  
      Integer add(@RequestParam Integer firstNumber,  
                @RequestParam Integer secondNumber) throws IOException {  
           return firstNumber + secondNumber;  
      }  

2. W teście trzeba dodać trochę rzeźby aby upewnić się, że wywołanie asynchroniczne się zakończyło. Funkcje runs oraz waitsFor są z Jasmine :

  it("adding two positive numbers uusing ajax", function() {  
        //given  
            var firstNumber=1;  
            var secondNumber=2;  
           //when  
             runs(function() {  
                 add(firstNumber,secondNumber);  
            });  
            waitsFor(function() {  
                 var result=$("#result").text();  
              return result.length>0;  
            }, "Async call to long", 1000);  
           //then  
             runs(function() {  
                 expect($("#result").text()).toBe('3');  
            });  
       });  

3. Implementacja :

 $.get("add", {firstNumber : first,secondNumber : second},  
           function(data) {  
           $("#result").text(data);  
      });  

Ogólna ocena

Moja produktywność pracy z Javascriptem skoczyła o jakieś 69% gdyż już nie trzeba się przeklikiwać przez wszystkie przypadki użycia interfejsu po każdej zmianie w skrypcie. Biblioteka godna polecenia.

niedziela, 17 lutego 2013

Efekt Krugera-Dunninga

"Nieszczęśćie tego świata polega na tym, że głupcy są pewni siebie a mędrcy pełni wątpliwości."

Zjawisko jest dosyć proste do opisania : Czy debil ma odpowiednie kompetencje aby stwierdzić, że jest debilem. Jeśli tak to wydaje się logiczne, że nie będzie chciał pozostać w tym stanie i zrobi wiele aby debilem być przestać. Idąc dalej tym tokiem rozumowania debilami powinni pozostać tylko ci, którzy nie są w stanie rozpoznać, że są debilami.

Niestety badania pokazują, że powyższy akapit nie stanowi tylko nadinterpretacji logicznej...

Co pokazują badania

O dziwo badaczami, którzy opisali efekt Krugera-Dunninga byli Kruger i Dunning. Dokładny opis można sobie poszukać w necie a tutaj tylko zacytuję ich obserwacje :

  1. Osoby niekompetentne zwykły przeceniać swój własny poziom zdolności.
  2. Osoby niekompetentne nie potrafią ocenić prawdziwego poziomu zdolności u innych.
  3. Osoby niekompetentne nie potrafią ocenić prawdziwego poziomu swoich zdolności.
  4. Jeśli mogą być przeszkolone, aby znacznie poprawić swoje osiągnięcia, osoby te potrafią zauważyć i przyjąć do świadomości swoją wcześniejszą niekompetencję.
  5. Osoby kompetentne niedocenianą poziomu swoich zdolności

Jak to wygląda w IT

O ile dobrze pamiętam na samym początku swojej tzw. kariery wydawało mi się, że problemy z jakimi musiałem się mierzyć w trakcie ćwiczeń na uczelni czy realizacji pseudo zleceń będą się skalować liniowo w korpo świecie. Kiedy dostałem do wyceny jedna rozbudowę to po chwili namysłu i analizy mój umysł podpowiedział :

"pół godziny powiedz im, że to zajmie półgodziny - robiłeś już kiedyś podobne rzeczy to zajmie pół godziny".

Gdy postawiłem podzielić się wynikiem mojej profesjonalnej fazy szacowania zdało się zauważyć, że niektórzy wrzucili maski mówiące :

"chyba cię ku**a synek popie**oliło"

-ponieważ jednak korporacja nie pozwala dzielić się uczuciami, więc usłyszałem tylko :

"twoje estymaty mogą okazać się nieprawidłowe".

Cóż, same półgodziny to mi może zajęło namierzenie plików, które muszę zmienić a na koniec dodatkowo zostało poprawienie rzeczy, które w trakcie rozbudowy popsułem (niestety testów wtedy nikt nie pisał).

Zauważyłem, że najniebezpieczniejszy moment nadchodzi po około dwóch latach pracy w pierwszym projekcie. Wtedy wpada się w pewną rutynę pracy, która skutkuje osiągnięciem maksimum lokalnego swoich możliwości. Pojawia się efekt iluzorycznej wyższości -----> : http://en.wikipedia.org/wiki/Illusory_superiority i zaczynamy być przekonani o swojej wiedzy i potędze. I tutaj sytuacja może się rozwinąć w dwie strony : albo mamy inne miejsca niż projekt do pomiaru naszych umiejętności, życie nas zweryfikuje i sięgniemy do filozofii "wiem, że nie wiem" albo zaczniemy się bunkrować na swojej pozycji ostrzeliwując każdego kto próbuje naruszyć naszą iluzję.

Ja miałem to szczęście, że rzeczywistość mnie zweryfikowałą. Później następuje czas pogodzenia się z realiami i powolne wypełnianie luk niewiedzy, a ponieważ ten proces przypomina grę w sapera, gdzie odsłonięcie jednego pola ujawnia nowe "miny" więc obecnie proces zaczyna przypominać powtarzające się oscylacje. Przebieg mojej subiektywnej oceny moich umiejętności na przestrzeni lat wyglądałby mniej więcej tak :

Wady i zalety tego całego efektu

Staram się to juz kiedyś opisać tu a także tu. Generalnie jeśli mamy grupę ludzi niezdecydowanych i dwóch osobników, którzy starają się grupę do czegoś przekonać to zakładając tylko, że dana grupa nie posiada odpowiedniej wiedzy merytorycznej - wygra ten, który jest pewniejszy swoich racji - co nie zawsze jest dobre bo z badań wynika, że często będzie to ten głupszy. Z drugiej strony powiedzonka w stylu "nie wiedział, że tego nie da się zrobić i to zrobił" czy "fake it till you make it" trochę chyba prawdy w sobie mają. Problem nie jest czarno biały a najwięcej korzyści osiągnie się jak zwykle gdy wspomniany proces psychiczny sobie uświadomimy i nad nim zapanujemy. Każdy znajdzie najlepsze zastosowanie. A tutaj jeszcze coś na poprawę pewności siebie -

I na koniec nie sposób wspomnieć o hipokryzji płynącej z tego i podobnych artykułów opisujących "ludzi". Ponieważ prawa, które opisałem również dotyczą mnie samego więc to chyba dobry moment aby wspomnieć, że całe życie byłem debilem i postanowiłem w końcu coś z tym zrobić. Debil to generalnie stan domyślny dla każdego kto nie szuka jakiejkolwiek formy oświecenia. No dobra Ja już się przyznałem teraz Ty...

Przerwa na reklamę

Dzisiaj dowiedziałem się, że potas jest głównym transporterem glukozy do mózgu. A ponieważ ludzie mają w dupie swoje organizmy (powszechne zjawisko kolapsu analnego) toteż mało kto wie, że jest coś takiego jak równowaga potas-sód a sód to nasza piękna białą sól. Sód jest w większości artykułów kupowanych w sklepie a jeśli ktoś jeszcze wpieprza frytki z solą to pewnie dzienną normę sodu przekracza kilka razy. Aby przywrócić równowagę potas-sód poza warzywami i bananami warto zarzucić jakieś suple - można dać Aspargin za 5zł. (Nie mylić z Aspartamem! Aspratam to to gówno, które jest dodawane do produktów "light" i "zero"). Ewentualnie jakieś inne tableteczki np. z Olimpu. Generalnie jak glukoza nie będzie transportowana do mózgu to organ zacznie obumierać i z wiekiem poziom "bycia debilem" się zwiększy.


obrazek z http://mineral.pl/

niedziela, 10 lutego 2013

Tworzenie nowej instancji na Amazonie - pseudowizualizacja

Główną siłą sprawczą tego postu są targi na których tydzień temu opowiadaliśmy o tym jak łatwo wdraża się aplikacje na Amazonie. Do tego od jakiegoś roku zabierałem się do zbadania tematu canvas w HTML5 i tak oto powstałą upośledzona wizualizacja, którą można podziwiać poniżej (Wyszła troche za szeroka - być może to podświadoma projekcja okresu masowego). Nie wiem nawet jakie przeglądarki to teraz wspierają - najnowszy chrome i firefox powinny dać radę :

  1. Zaloguj się do konsoli Amazona
  2. Wybierz tworzenie nowej instancji
  3. Wybierz system operacyjny - są windowsy i linuxy
  4. Wybierz moc maszyny - najsłabsza jest za darmo przez pierwszy rok, najmocniejsza na dzień dzisiejszy ma 120GB Ramu, 16 rdzeni i kosztuje około 4$ za godzinę
  5. Wybierz strefę geograficzną - najtańsza i chyba najstarsza to wschód Stanów zjednoczonych
  6. Skonfiguruj SSH - podgraj klucz itd
  7. Wio - w sensie trzeba odpalić na instacji jakiś serwer, skopiować url z konsoli i powinno śmigać
Oczywiście cała siłą EC2 ujawnia się gdy włączymy Load Balancery i skonfigurujemy autoscaling ale do tego nie chciało mi się już robić wizualizacji. Następna prezentacja o Amazonie będzie 23 Lutego w Łodzi tym hotelu koło Manufaktury (Andels czy jakoś tak). Nie wiem jeszcze, o której godzinie będziemy mieli slot ale razem z kolegą W. będziemy chcieli pokazać trochę więcej akcji w konsoli Amazona. W trakcie prezentacji, która odbyła się 2 lutego skupiliśmy się bardziej na tym jak Amazon uprościł nasze procesy korporacyjne.

Coś z zupełnie innej beczki - Closure w javascript

Ludzie dzielą się na dwie grupy - na tych którzy już wiedzą, ze trzeba ogarnąć javascript i na undefined. Poniżej konstrukcja z zastosowanego dema :

 
 function setTextOnLayer(text,waitTime,layer){
       setTimeout(function() {
                  layer.add(text);
                  },1000*waitTime);
      }

// Jeśli dobrze zrozumiałem czym jest closure to to chyba jest właśnie closure
function addOnLayer(layer){
       return function(text,waitTime){
        setTextOnLayer(text,waitTime,layer);
       }
      };


 var layer = new Kinetic.Layer("textLayer");
      var tipLayer = new Kinetic.Layer("tipLayer");


//Tworzymy dwa domknięcia      
      var addOnTextLayer=addOnLayer(layer);
      var addOnTipLayer=addOnLayer(tipLayer);

//I teraz można po prostu
addOnTextLayer(textControl,waitTime);

niedziela, 3 lutego 2013

Klątwa wyuczonej bezradności

Jest przepiękny poniedziałkowy poranek. Przychodzisz do pracy pełen planów i nadziei. Masz plan, masz plan co robić i czujesz, że masz wpływ na to co robisz. Rozpakujesz się, siadasz do kompa i otwierasz skrzynkę pocztową a tam niespodziewanie ktoś z poziomu n+1 twojej korporacji zmienia reguły gry i prezentuje kolejne swoje procesowe dzieło które ma zbawić twoją firmę i jego ego. Twoje plany wzięły w łeb, poczucie kontroli maleje i według wyników eksperymentów - na około 70% jesteś na prostej drodze do zabójczej apatii. Ale od początku...

Psy,szczury i ludzie

Eksperyment pierwszy : Po raz pierwszy to ciekawe zjawisko zaobserwował psycholog Martin Seligman. Podobno badał powstawanie odruchów warunkowych ale to co znalazł jest równie ciekawe. Przedmiotem eksperymentu były psy (tak tak biedne zwierzątka), które podzielono na trzy grupy.

  • Pierwsza grupa została zamknięta w klatce na pewien okres czasu a następnie wypuszczona
  • Druga grupa została również zamknięta w klatce i rażona prądem chwilę po tym jak z głośnika został puszczony sygnał. Psy z tej grupy mogły wyłączyć mechanizm rażenia prądem dociskając pyskiem przycisk na ścianie.
  • I trzecia grupa, która podobnie jak druga została zamknięta w klatce, również dostawała impulsami z prądem jednakże te psy nie miały możliwości wyłączenia prądu. Zastosowano jednak inny mechanizm. Psy z grupy 3 były połączone w pary z psami z grupy 2. I to psy z grupy 2 mogły wyłączać prąd. Czyli dla takiego pieska z grupy trzeciej prąd wyłączał się losowo.
Niespodzianka pojawiła się w drugiej części eksperymentu. Seligman przeniósł psy do nowej klatki widocznej na rysunku gdzie tylko jedna część podłogi była podłączona do źródła prądu. I tutaj następuje mindfuck! Chociaż wystarczyło aby pies przeskoczył przez niewielką barierkę aby uwolnić się od nieprzyjemnego uczucia to jednak psy z grupy 3 zatopiły się w apatii i nie podejmowały żadnych działań.
To zupełnie tak jakby ich mózg stwierdził "pie**le to! I tak cokolwiek bym nie robił to to nie ma znaczenia".

  • Eksperyment drugi : Szczur po wrzuceniu do kadzi z wodą pływał około godziny zanim utonął. Gdy po wrzuceniu podano mu kij, po którym mógł się wydostać to za drugim razem po wrzuceniu do kadzi pływał nawet do 48 godzin. Widocznie szczury też odczuwają "nadzieję"
  • Eksperyment trzeci : W końcu coś z ludźmi. Małe dzieci podzielono na dwie grupy : jednaj dane zabawki, które mogły kontrolować a drugiej grupie zabawki nad którymi nie miały kontroli. Gdy później druga grupa dostałą zabawki pierwszego typu to nie podejmowała żadnych prób kontroli.
  • Eksperyment czwarty : Studenci dostawali listę zadań - jeśli pierwsze zadania były trudne i nie mogli sobie z nimi poradzić to zlewali resztę zadań chociaż w dalszej kolejności były proste zadania

A no i dosyć ważna rzecz - powyższe zachowania nauki bezradności tyczą się 70% uczestników - nieważne czy to psy,szczury czy ludzie. Gdzie tkwi różnica?

Jest choroba jest i lekarstwo

Tutaj nie bedę udawał, że rozumiem wszystkie elementy układanki. Trudno mi zrozumieć co dzieje się w głowach psów i kotów ale mogę napisać jak zrozumiałem opis tego co dzieje się w głowach ludzi. Zachowanie 30% osób, które obroniło się przed brzemieniem bezradności tłumaczy tzw. teoria atrybucji co chyba w skrócie można wytłumaczyć jako możliwość wyboru wkręcania sobie, że mamy na coś wpływ. Jeśli sukcesy przypisujemy sobie a porażki otoczeniu to jak debilnie początek tego zdania nie zabrzmiał - czujemy siłę! ". Takie podejscie jednak wydaje się posiadać pewną wadę - brak nauki na własnych błędach i oczekiwanie szybkich rezultatów ( w końcu jestem zajebisty to nie muszę ciężko pracować).

Na dole artykułu wkleję linki z podanymi opisami jak sobie radzić z tym efektem bezradności a tutaj kilka hintów, które przyszło mi do głowy.

  • Najważniejsze - jeśli nie chcesz wywołać tego zjawiska u kolegów z pracy to pozwól im do cholery wyłączyć prąd! Czyli jeśli masz jasny odzew od zespołu, że nowa praktyka jest zjebana to ch*j - nawet jeśli to tylko ich strefa komfortu to już za późno - dałeś ciała a teraz daj im wybór. Wyciągnij wnioski i następnym razem naucz się reklamować a nie narzucać pomysł jeśli naprawdę szczerze wierzysz, że zmieni on rzeczywistość na lepszą
  • Zaś co do własnej kuracji to musisz się nauczyć, że cokolwiek by się nie działo masz wpływ na swoja rzeczywistość. Najlepiej ludzie zapiszcie się na siłkę i zacznijcie analizować co wrzucacie w swój organizm. Nie dość, że poczujecie że macie wpływ na kondycję swojego organizmu to jeszcze poczujecie tę wspaniałą czystość umysłu.
  • Jeśli faktycznie nie masz na nic wpływu w swojej obecnej firmie to ej weź stamtąd szybko spie**alaj!!
  • No i na koniec taki hardkorek. Jak już jest zupełnie źle możemy wspomóc się ezoteryka i filozofią "twoje myśli kształtują twoją rzeczywistość". Brzmi jak brzmi ale mi to kiedyś pomogło. Tutaj jest opisana jedna taka filozofia. Do tego medytacje, afirmacje itd

Linki