Monday, May 25, 2015

2015-05-13 Krótka relacja z GeeCON 2015

Kraków, wiosenny poranek i kino, które na chwilę zapomniało o swojej głównej roli.
W takich warunkach, 13 maja, rozpoczęła się kolejna edycja konferencji GeeCON (http://2015.geecon.org/).  Około 1200 głodnych wiedzy uczestników związanych z najrozmaitszymi technologiami oraz 75 prelegentów, którzy przez 3 dni dzielili się swoimi doświadczeniami i przemyśleniami. Całość okraszona sporą dawką pozytywnego nastroju, odrobiną marketingu rekrutacyjnego, geekowymi gadgetami, konkursami i smacznymi przekąskami.



W każdym bloku czasowym uczestnicy mogli wziąć udział w jednej z czterech prowadzonych równolegle prezentacji. Duża liczba świetnych prelegentów i tematów niejednokrotnie skutkowała problemem przy wyborze sali. Otuchy dodawała myśl, że wszystkie prezentacje są rejestrowane i wkrótce będą dostępne.

Wśród tematów brylowały te o Reactive Manifesto (http://www.reactivemanifesto.org),
bazach NoSQL (http://cassandra.apache.org, https://hadoop.apache.org,
https://www.mongodb.org, http://orientdb.com ...) oraz mikroserwisach.
W moich oczach wszystkie prezentacje byly na dobrym lub bardzo dobrym poziomie.

Poniżej kilka tematów, które pojawiły się w ciągu tych 3 dni.

How to run technological revolution in semi-stagnant environment?

Wojciech Burkot, CTO w Groupie Allegro: 80% pracy jest wykonywana przez 20% pracowników. Tylko kolejne wyzwania pozwolą zatrzymać tych najefektywniejszych w firmie.

Life Beyond the Illusion of Present

Jonas Bonér (co-founder and CTO of Typesafe, http://jonasboner.com) wyjaśnił, iż
w dzisiejszych czasach zasoby takie jak moc obliczeniowa oraz pamięć są relatywnie tanie, dlatego można zrezygnować z aktualizowania danych historycznych (w tym z funkcji update i delete) na rzecz operacji insert, czyli wprowadzania wyłącznie nowych danych w postaci faktów. Ma to pomóc w budowaniu silnie rozproszonych i skalowalnych systemów rozproszonych. Jonas radził również aby budowane przez nas aplikacje „nie przepraszały“, ale aby były gotowe na awarie, które mogą pojawić się w trakcie ich użytkowania.

From Java to Scala in Two Months

Daniel Nowak (Head of Logistics Software at Zalando) opowiedział o projekcie, w którym 3 miesiące wystarczyły aby odpowiednio zmotywowany zespół programistów Javy przygotował i wdrożył mały produkt w Scali. Ciekawa historia o grupce ludzi, których zapał i ciekawość pozwoliły przełamać trudności związane z przygotowaniem całkowicie nowego produktu. Wykorzystali do tego nieznane im wcześniej narzędzia bazujące na Scali (m. in. Akka i Play Framework).



Implementing the Reactive Manifesto with Akka

Adam Warski (co-founder of SoftwareMill) w wyśmienity sposób pokazał jak zaimplementować aplikację zgodną z Reactive Manifesto. Nagranie z prezentacji zarejestrowanej podczas Lambda Days 2015 https://vimeo.com/121229692. Slajdy w IntelliJ IDEA były rozbrajające! :)



Building fault tolerant apps with Cassandra

Christopher Batey opowiedział o Apache Cassandra, jej podstawach, strategiach replikacji i partycjonowania danych przy pomocy algorytmu consisten hashing.

Lambda Core – HardCore

Jarosław Ratajski (człowiek w tajemniczej, czarnej pelerynie) pokazał jak przy pomocy
rachunku Lambda zdefiniować liczby naturalne oraz wartości logiczne true/false. Zaprezentował również swoje Javowe narzędzie do analizy wyrażeń Lambda (https://github.com/jarekratajski/badlam).


WordPress.com & The Future of Work

Scott Berkun z WordPress (http://scottberkun.com) stanowczo stwierdził, że praca zdalna może być efektywna. Bazował na doświadczeniach zespołów tworzących WordPress.com.

W czwartkowy wieczór (14-go) na uczestników czekało after party w klimatycznym lokalu Stara Zajezdnia. Szum technologicznego dialogu a gdzieś w tle turniej walczących robotów, sporo przefajnych ludzi! Było całkiem zabawnie:)



Tak! Imprezę zaliczam do bardzo udanych i z pewnością rozważę uczestnictwo w przyszłym roku:)
Na koniec bardzo gorąco dziękuję JUG Łódź oraz organizatorom GeeCON, bo to właśnie dzięki synergii tych 2 zespołów miałem okazję do wzięcia udziału w konferencji całkowicie bezpłatnie - yeah!!:)

Sunday, April 26, 2015

Scala Day Workshop - zdjęcia,opis, wspomnienia i zasłużone podziękowania!

Głównym zadaniem tego tekstu jest ociekanie zajebistością gdyż w trakcie wczorajszego Iventu "Scala Day Workshop" wysiłkiem wielu osób (dedykowane podziękowania za chwilę) udało się zorganizować doskonały całodniowy warsztat Scali:

A zajebistość bierze się m.in. z :

RAZ : Przez cały dzień obok warsztatu działało profesjonalne przedszkole. Dzięki czemu w końcu ludzie, którym zawsze obowiązki rodzinne uniemożliwiały udział w tego typu wydarzeniach mogli dołączyć do nauki Scali! Tutaj szczególne podziekowania dla Marka Defecińskiego z JUGa i Lidii Wierzbickiej z GFT, którzy wspólnie zajęli się tematem

DWA : Warsztaty były poprowadzone przez polskiego Java Championa Jacka Laskowskiego. Było tam wszystko czego mogłyby oczekiwać osoby zaczynające swoją przygodę ze Scalą.

  • Jak dokładnie krok po kroku stworzyć nowe projekty czy to w czystej Scali, czy też z podkładką do Akki,Playa czy czegokolwiek co jest w Activatorze
  • No własnie Activator - uczestnicy zobaczyli jak nie tylko łatwo tworzyć nowe projekty ale także jak wykorzystać dowiązany do nich tutorial
  • REPL - temat rzeka, wygoda niesamowita a zupełna nowość dla klasycznych programistów Javy
  • SBT - to też jest nowość dla większości ludzi w Łodzi, którzy siedzą nadal w Mavenie (ale jak to nowego taska można stworzyć w dwóch liniach?). Nie było AndrzejaJ dlatego na pytanie Jacka czy ktoś jeszcze używa Anta nikt nie podniósł ręki (na szczęście)
  • Jak najwygodniej z punktu widzenia praktyka używać IDE
  • No i w końcu nauka programowania funkcyjnego i oduczanie się myślenia imperatywnego - tutaj Jacek robił takie piki ponad poziom podstawowy co powinno stanowić świetną zajawkę dla uczestników do zgłębiania bardziej zaawansowanych tematów

TRZY : Bardzo ważna rzecz! Przyszli chyba wszyscy zapisani! I to w słoneczną sobotę! Bardzo często zapomina się docenić ten element - ludzie, którzy chcą się uczyć!!! Jest nadzieja w ludzkości!!! A przecież mogli po prostu miło i bezproduktywnie spędzać czas, wrzucać fotki z tego procesu i prosić o lajki na fejsie, bez sensu, prosić o lajki, kto robi takie rzeczy... A właśnie! Pamiętajcie aby zalajkować i szerować ten artykuł i inne z JUGa!

CZTERY : Doskonała pogoda, przestronny balkon i pizza.
To było świetne smalltaki, netłorking i smaczne jedzenie w otoczeniu wiosennej bryzy. Gdy zamknęło się oczy i wyobraziło, że dźwięki samochodów gdzieś tam w oddali to szum fal - było prawie jak na plaży we Władysławowie...

Sponsor

Miejsca użyczyła oraz za sponsorowała przedszkole firma GFT

Sunday, March 15, 2015

26.02.2015 - Obsługa sytuacji wyjątkowych bez użycia wyjątków (poza pewnymi wyjątkami) - Pawel Wlodarski - autorelacja

To jest moja własna recenzja z mojej prezentacji wiec oczywiście, że będzie obiektywna.

Opinie

Co do konkretów to :

Mam dobrą wiadomość - będzie jeszcze więcej Scali,ooooooooojjjj będzie jej dużo dużo dużo więcej. Ale powinno być ciekawie i mam nadzieję opinie będę spójnie szły na tak.

Lesson learned

Dobre komentarze są miłe, przyjemne i stanowią opium dla ego ale czasem nie są zbytnio rozwijające. Jak na razie najlepszy komentarz jaki miałem w życiu to był ten o tym, że pisanie długich kawałków kodu jest nudne dla publiki i teraz na prezentację przygotowuję sobie szablony.

W opiniach pojawiło się kilka ciekawych komentarzy z interesującymi obserwacjami :

  • trochę nerwowa atmosfera, aczkolwiek łagodzona żartami ;) - (Tego nie rozumiem - raz, że tym razem przed prezentacją nie wziąłem Napalmu a dwa to zacząłem regularnie pijać Melisę)
  • Mikrofon :3 - To jest umiejętność, którą dopiero muszę posiąść - korzystanie z mikrofonu. Do tej pory - gdy nie było mikrofonu - starałem się mówić donośnie i teraz zajmie chwilę kalibrowanie tego nawyku pod mikrofon. Na tej prezentacji nie chciałem kombinować pod to pierwsza pod nowym logiem ale kiedyś może zrobię taką bez kodowania z chodzeniem po scenie i gestykulacja. Wtedy z mikrofonem będę wyglądał jak prawdziwy wodzirej! A tak ogólnie mikrofon to chyba dobry pomysł
I najważniejsze !
  • Początek prezentacji mógłby być lepszy. Co to za puszczanie jakichś słabych kawałków z ligi mistrzów. Kiedyś Paweł zaczynał cyckami i było ok. - Od razu chcę wszystkich uspokoić - nigdy nie zaczynałem swoimi! Cycków nie będę pokazywał bo podobno dziewczyny się wtedy wstydzą i nie chcą przychodzić :(

A patent z puszczaniem ligi mistrzów podpatrzyłem u Michała Śliwonia na http://www.meetup.com/dev-LDZ/. Opłaca się chodzić na inne grupy bo u nas zawsze była białą ściana przed prezentacją.

Kod

Nie chcę mi się pisać wszystkiego linia po linii dlatego też skupię się na najważniejszych fragmentach koderskiego wywodu.

Do teog na tym blogu nie mamy chyba jeszcze żadnego formatera kodu także wrzucę linijki w zwykłe "pre"

Uświadom potrzebę

Zauważyłem, że większość dyskusji o wyjątkach w świecie Javowym zakłada checked albo unchecked bez dopuszczenia trzeciej drogi (chyba, że ktoś walnie suchara z kodami błędu). Większość ludzi bardziej przychyla się do unchecked exceptions bo mniej jest z nimi prądu.

Ciekawszym wyzwaniem jest pokazanie wad wyjątków unchecked poprzez nawiązanie do pierwszego flejm WARa GOTO considered harmful considered harmful considered harmful

 public static void main(String[] args) {  
           try {  
                System.out.println("linia1");  
                System.out.println("linia2");  
                System.out.println("linia3");  
                gotoLine6();  
                System.out.println("linia4");  
                System.out.println("linia5");  
           } catch (GoTo e) {  
                System.out.println("linia6");  
           }  
      }  
      private static void gotoLine6() {  
           System.out.println("goooooto line6");  
           throw new GoTo();  
      }  
i wynik
linia1
linia2
linia3
goooooto line6
linia6

Podważ dogmaty

Do dalszych wywodów zainspirowała mnie jedna z prezentacji Erika Meijera gdzie przedstawił on setter i getter - teoretycznie mechanizmy znane i poniżane od wielu lat - z zupełnie innej perspektywy

  • get[A] to nic innego jak funkcja Unit=>A
  • set[A] to nic innego jak funkcja A=>Unit

i podobnie możemy sobie zanalizować błahą wydawało by się metodę

int metoda(int a,int b)

zaczęliśmy od Javy8 bo to bardzo dobry pomost pomiędzy Javą i Scalą.

W każdym razie mamy tę metodkę i co możemy o niej powiedzieć - no patrząc na typy przyjmuje dwa inty i też zwraca inta.

int metoda(int a,int b){
  return a+b;
 }
Na razie jest spoko :
int metoda(int a,int b){
  return a-b;
 }
Budujemy napięcie - na razie nie widać problemów
int metoda(int a,int b){
  return a*b;
}
I teraz zaczynają się schody
int metoda(int a,int b){
  return a/b;
 }
Wsio się kompiluje a sam kompilator nic nie podkreśla
newWay.metoda(4, 2);  // spoko
newWay.metoda2(4, 0);  //Exception in thread "main" java.lang.ArithmeticException: / by zero

No i dlaczego?!?! Przecież kompilator pokazuje wyraźnie, że zwraca inta. Czy ArithmeticException jest intem? Jeśli będziecie grali w pokera i powiecie, że wchodzicie za "ArithmeticException" to raczej nikt was nie zrozumie... Jeśli pani w sklepie alkoholowym zapyta ile macie lat - również zdanie "mam ArithmeticException lat" nie będzie miało sensu...

Wskaż rozwiazanie

Jak odzyskać kontrolę nad typami i zaufanie kompilatora? Nie chce mi się wkleiać całego wywodu krok po kroku także ten tego :

 Optional<Integer> metoda(int a,int b){  
           if(b!=0)  
                return Optional.of(a/b);  
           else  
                return Optional.empty();  
      }  

Był też przykład domenowy

 Repository r=new Repository();  
                     //dane  
           Optional<Double> data = r.findUser("Roman")  
           //domain 1  
           .filter(DomainPolicy::isAllowed)  
           //domain 2  
           .map(u->u.getSalary())  
           .flatMap(FinancialService::calculateTax);  
           //ui  
           Optional<String> ui = data.map(t->"<h1>"+t+"</h1>");  
           System.out.println(ui.orElse("404 not found"));  
 (...)  
 static class FinancialService{  
           static Optional<Double> calculateTax(Integer amount){  
                if(amount!=0)  
                     return Optional.of(amount*1.23/amount);  
                else   
                     return Optional.empty();  
           }  
      }  
      static class DomainPolicy{  
           static boolean isAllowed(User u){  
                return u.getSalary() > 15;  
           }  
      }  

Idea jest następująca :

  • Mamy kilka domen/poddomen/paczek/zakresów/płaszczyzn tematycznych - nieważne jak się to zwie
  • W każdej domenie mamy zestaw dedykowanych funkcji,które operują na typach z tej domeny. Małe, krótkie i łatwe do testowania
  • Optional udostępnia maszynerię, która może wywoływać te funkcje domenowe w kontekście obiektu, którego może nie być.
  • Funkcje same w sobie nic o tym nie wiedzą co sprawia, że są mniej zależne od kontekstu, łatwiejsze w użyciu i dużo dużo łatwiejsze do testowania niż sprawdzanie jakichś wyjątków

Pokaż, że w scali da się napisać szybciej i przyjemniej

tutaj przynajmniej można wkleić cały program :
 case class User(name:String,salary:Int)  
      object Repository{  
           private val data=Map[String,User]("Roman"->User("Roman",20))  
           def findUSer(n:String)=data.get(n)  
      }  
      def calculateTax(amount:Int)=if(amount!=0) Some(amount+1.23/amount) else None  
                          //> calculateTax: (amount: Int)Option[Double]  
      def domainPolicy(u:User)=u.salary>15   //> domainPolicy: (u: jug.wyjatki.NewWayWork.User)Boolean  
      Repository  
      .findUSer("Roman")  
      .filter(domainPolicy)  
      .map(_.salary)  
      .flatMap(calculateTax)  
      .map(t=>s"<h1>$t</h1>")  
      .getOrElse("404 not found")        //> res3: String = <h1>20.0615</h1>  

Trochę magii

Ale czy Option podobnie jak checked exception nie brudzi nam API? Czy można jakoś ładnie dostosować dostosować "czysta metodę" do użycia Option tak poprostu - z automatu?

Przykład do własnego sprawdzenia :
 def lift[A,B](f:A=>B):Option[A]=>Option[B]=a=> a.map(f)  
 def metoda1(a: Int) = a + 1   
 val lifted1=lift(metoda1)  
 lifted1(Some(5))  
Plus wersja z wzorcem "Job Security"
 def lift[A,B](f:A=>B):Option[A]=>Option[B]=_ map f  
A to dopiero początek - więcej ciekawych przykładów w książce :

Co jeszcze Było?

  • Jak for w Scali umożliwia wywołanie metody przyjmującej dwa Optiony
  • Try - czyli konstrukcja w Scali, któ©a poza info o sukcesie niesie też informacje o błędzie
  • No i dałem też przykład jak Akka obsługą wyjątków naprawia system z aktorami. To miała być druga część ale to koniec końców za dużo zamieszania wprowadziło ze względu na limit czasu

No i na koniec fajnie by było gdyby więcej osób zaczęło coś przygotowywać. No i była jeszcze jedna opinia, że takie prezentacje około godziny są w sam raz. Ludzie przychodzą zmęczeni po pracy i w sumie trudno im wysiedzieć więcej.