niedziela, 23 grudnia 2012

Les Menuires - 14-12-2012 do 23-12-2012

Tygodniowy wyjazd ze SnowShow dobiegł końca. Przetrwałem bez kontuzji i załamań. Minusem zdecydowanie była podróż autokarem, która w jedną stronę zajmowała 20-kilka godzin. Nieco w zabiciu czasu pomagał alkohol. Podróży do Francji praktycznie nie odczułem czasowo, za to odcisk na czole od plastykowego uchwytu poprzedzającego fotela towarzyszyl mi przez pierwsze 2 dni.

Z 6 dni na stoku trafiły sie 2 pogodne, pozostałe były raczej pochmurne a czasem przynosiły dodatkowe atrakcje w postaci zamieci i mgieł, jak to w górach - pogoda jak kobieta, zmienna jest.

W Les Menuires ceny charakterystyczne dla kurortów Europy zachodniej: piwo 6-8 euro, obiad w postaci frytek ze stekiem ok 14 euro, w podobnej cenie pizza.
Za to miejsca do pojezdzenia pod dostatkiem, zarowno trasy wytyczone jak i offroad, piekna sceneria a i turystow o tej porze nie było zbyt wielu. Reszte niech oddadzą załączone zdjęcia i filmy.

https://plus.google.com/u/0/108701036453403152884/posts/FFLnX4cnxkR

Ubuntu - oszczędzanie energii

Znalazlem ciekawy opis narzędzi przydatnych do ustawienia wydajności/oszczędzania energii pod Ubuntu:
http://notatnik.mekk.waw.pl/archives/276-Chodniejszy_laptop_pod_Ubuntu_1110.html


poniedziałek, 26 listopada 2012

Niewidzialna Wystawa

Czy mieliscie okację na chwile 'zobaczyc' swiat oczami niewidomego? Jesli nie to osobiscie polecam - niezwykle doznanie. Pomoze Wam w tym Niewidzialna Wystawa.
Wizyte rozpoczyna poznanie alfabetu Breila i Braile'owskiej maszyny do pisania. Nastepnie obejrzymy inne przedmioty jakimi posługują się osoby niewidome: kalkulator, który czyta liczby pojawiające się na wyświetlaczu, wieszak na skarpety, dzięki któremu nie będziemy nigdy więcej musieli szukać skarpety pasującej do pary (jakże praktyczne narzędzie, które powinno znaleść się również w każdym domu osoby widzących), krajarka do jabłek, która oddzieli ogryzek od reszty kawałków, czytający termometr, układanki (można nawet założyć zaślepki na oczy i samemu spróbować je ułożyć - nie jest to banalne zadanie), mapy z różną teksturą w zależności czy to morze, rzeka czy ląd, komputer ze zwykłą klawiaturą ale czytający tekst  z ekranu. Swoją droga dowiedziałem się, że wiele wynalazków na stronach internetowych, które jakoby miały pomóc niewidomym, w praktyce się nie sprawdza bo wymaga od nich kliknięcia na nich myszką (np przyciski do odczytu tekstu) a z wiadomych względów komputery niewidomych pozbawione sa tego urzadzenia.

Po zapoznaniu się z przedmiotami ruszamy na wycieczkę w ciemnościach. Niewidomy przewodnik oprowadzi nas po pokoju, który możemy przemacać wzdłuż i wszerz, ale uwierzcie mi, robiąc niepewne i krótkie kroczki po omacku trudno będzie zbudować wyobrażenie o wystroju jego wnętrza.
Następnie udajemy sie na ulicę, gdzie co krok napotykamy różne uliczne przeszkody. Nie zdradze Wam jakie, żeby nie psuć zabawy.
Z ulicy wchodzimy do leśnej chatki a następnie do lasu. Słychać potok i śpiew ptaków, poza tym ciemno jak w .... Super !! Można legalnie podotykać (niby przypadkiem) współzwiedzająch lub współzwiedzające, w zależności od osobistych preferencji :) i nikt nikomu nie bedzie mial tego za złe (chyba, w moim przypadku nie miały ;) ).
Gdy już przejdziemy las, wchodzimy do baru. Możemy nawet coś kupić do picia czy zjedzenia ale uwaga - przy wydawaniu reszty :) cięzko stwierdzić, czy barman był uczciwy zanim nie wyjdziemy z ciemności, tym cięzej jeśli płacimy w bilonie.

Podsumowując, przeżycie nietuzinkowe i poszerzające horyzonty, godne polecenia każdemu kto ma wzrok.
Warto wspomnieć, że przed wybraniem się na wystawe należy uprzednio się umówić na konkretna godzine i zjawić na miejscu 15 min. przed czasem. Dobrze tez wziasc płaskie wygodne buty bo patrzenie pod nogi może nam już w niczym nie pomóc, a przeszkód pod nogami czai sie wiele.



sobota, 1 września 2012

II Bieg Fabrykanta, Łódź

II Bieg Fabrykanta już za nami. Nie było lekko, inaczej niż się spodziewałem. Już na początku złapała mnie kolka która trzymała przez całe pierwsze okrążenie. Możliwe że dlatego, że nie ruszałem sie cały tydzien, tylko praca i praca.. biurko i komputer i takie tego efekty.
Nagrałem zmagania na Endmondo:



jaki by nie był wynik i tak każdy kto dobiegł do końca otrzymał pamiątkowy medal. To już bedzie trzeci w mojej skromnej kolekcji medali za samo uczestnictwo (bo innego to bym w życiu nie dostał :) )



Wg. nieoficjalnych wyników byłem 273 na 340 mężczyzn i 310 na 419 wszystkich uczesników - 10km w 55 min.

poniedziałek, 30 lipca 2012

Parkrun Łódź

Opornie ale powoli do celu biegną moje próby odzyskania kondycji...
Tym razem w sobote pierwszy raz miałem okazje sprawdzić jak wygląda łódzki Parkrun - bieg organizowany w każdą sobote o 9.00. Udział jest darmowy, wystarczy zarejestrować się na stronie i wziąć ze sobą na start wydrukowany kod paskowy dla swojego konta.
Po biegu dostałem maila z taką oto treścią:


Witaj Marcin!
Ten darmowy bieg w ramach parkrun zorganizowany został dzięki naszym wolontariuszom oraz sponsorom:
adidas
Rezultaty uzyskane podczas parkrun Lódz nr# 5. Uzyskany przez Ciebie czas to {26:02}.

 
Gratulacje z okazji ukończenia 1ego biegu parkrun oraz 1szym biegu w ramach parkrun Lódz w dniu dzisiejszym.

Bieg ukończyłe(a)ś na 37ty miejscu i byłe(a)ś 33ty 0 wśród z 63 uczestników Twojej płci .

Przybiegłe(a)ś na 8ym miejscu w swojej kategorii wiekowej SM30-34.

Pełne rezultaty możesz zobaczyć tutaj. 0     
Osiągnąłe(a)ś 49.68%. najlepszego wyniku na świecie na tym dystansie osiągniętego dla Twojej płci oraz kategorii wiekowej. Więcej informacji na temat tej statystyki dostępnych jest tutaj.
Za dzisiejszy bieg otrzymałe(a)ś 66 punktów, co po uwzględnieniu dotychczas zgromadzonych punktów, daje łącznie 66 punktów w tegorocznej klasyfikacji punktowej w ramach biegu Lódz.


Nagrałem trasę w Endomondo, można ją obejrzeć tutaj:

http://www.endomondo.com/workouts/tFMZ2lYtay0 

środa, 13 czerwca 2012

NodeJs, szybki start na Windows

JavaScript staje sie coraz bardziej popularnym i coraz bardziej dojrzalym językiem programowania wiec pora sprawdzić jaka siła dżemie w NodeJs.
NodeJs to JavaScript uruchamiany na maszynie wirtualnej Chrome. Taki serwer JavaScript mozna postawic samodzielnie lub wykorzystac juz istniejace, np. wsparcie od CloudFoundry.

W tym celu rejestrujemy się i ściagamy obraz Micro CloudFoundry. Opisywałem to już w jednym ze swoich postów, dlatego pominę szczegóły.

Żeby komunikować się z CloudFoundry potrzebujemy narzędzie vmc instalowane jako RubyGem.

1. Instalujemy Ruby pod Windowsem
http://docs.cloudfoundry.com/frameworks/ruby/installing-ruby.html#windows


2. Z Ruby shell updatujemy RubyGem

gem update --system


3. Instalujemy VMC


gem install vmc

4. Rejestrujemy docelowe srodowisko CloudFoundry,  w przypadku Micro CloudFroundry np:


vmc target http://api.piczkowski.cloudfoundry.me
gdzie piczkowski to nazwa mojego konta na CloudFoundry.

5. Logujemy sie do CloudFoundry swoim loginem i haslem podanymi przy konfiguracji obrazu Micro CloudFoundry

vmc login
Attempting login to [http://api.piczkowski.cloudfoundry.me]
Email: piczmar@wp.pl
Password: *********


 Aby wyswietlic liste dostepnych polecen:


vmc help


Teraz mozemy stworzyc prosta aplikacje NodeJs i zainstalowac na serwerze:
1. Sprawdzamy wersje zainstalowanego na serwerze NodeJs



vmc runtimes

2. Sciagamy taka sama wersje NodeJs z http://nodejs.org/dist/ gdzie wybieramy odpowiednia wersje i szukamy instalatora pod Windows *.msi
Po instalacji bedziemy mieli w zmiennych srodowiskowych program node.exe oraz npm.exe

node.exe
> process.versions
{ node: '0.6.5',
  v8: '3.6.6.11',
  ares: '1.7.5-DEV',
  uv: '0.6',
  openssl: '0.9.8r' }
>
3. Tworzymy folder projektu


mkdir hello-nodejs
cd hello-nodejs

4. Instalujemy modul 'express' przy użyciu Node Package Manager'a

npm install express

5. Tworzymy plik aplikacji app.js


var app = require('express').createServer();
app.get('/', function(req, res) {
    res.send('Hello from Cloud Foundry');
});
app.listen(process.env.VCAP_APP_PORT || 3000);
CloudFoundry udostepnia port nasluchujacy pod zmienna srodowiskowa process.env.VCAP_APP_PORT


6. Tworzymy plik z zaleznosciami package.json



{
 "name":"hello-node",
  "version":"0.0.1",
  "dependencies":{
      "express":""
  }
}

7. Instalujemy na CloudFoundry

vmc login
vmc push
E:\git\try-it-out\com.tryitout.nodejs\src\main\hello-nodejs>vmc push
Would you like to deploy from the current directory? [Yn]: y
Application Name: hello-nodejs
Detected a Node.js Application, is this correct? [Yn]: Y
Application Deployed URL [hello-nodejs.piczkowski.cloudfoundry.me]:
Memory reservation (128M, 256M, 512M, 1G, 2G) [64M]:
How many instances? [1]:
Create services to bind to 'hello-nodejs'? [yN]: N
Would you like to save this configuration? [yN]: y
Manifest written to manifest.yml.
Creating Application: OK
Uploading Application:
  Checking for available resources: OK
  Processing resources: OK
  Packing application: OK
  Uploading (271K): OK
Push Status: OK
Staging Application 'hello-nodejs': OK
Starting Application 'hello-nodejs': OK

8. Dzialajaca aplikacje mozemy teraz obejrzec pod adresem

 http://hello-nodejs.piczkowski.cloudfoundry.me


i wynik.. (niezbyt okazały...)


Wiecej tutoriali do sprawdzenia pod linkami:
http://blog.cloudfoundry.com/2012/05/24/cloud-foundry-supports-node-js-modules-with-npm/
http://howtonode.org/hello-node
http://blog.springsource.org/2011/05/03/using-mongodb-redis-node-js-and-spring-mvc-in-a-single-cloud-foundry-application/
http://attilamiklosi.net/blog/tag/nodejs/ http://docs.cloudfoundry.com/services/mongodb/nodejs-mongodb.html
http://docs.cloudfoundry.com/services/rabbitmq/nodejs-rabbitmq.html
http://blog.cloudfoundry.com/2012/05/17/node-activity-streams-app-1/
http://blog.cloudfoundry.com/2012/06/05/node-activity-streams-app-2/
http://coreh.github.com/nide/






wtorek, 29 maja 2012

Accreo Ekiden Warszawa 2012

Ostatnio duże zmiany..
Nowa praca, nowe miasto i nowe przygody biegowe :)
W ostatnią niedziele odbyła się w Warszawie sztafeta Accreo Ekiden w której wystartowałem w teamie z pracy. Ja przebiegłem odcinek 7km, pozostali 10, 10, 5, 5 i 5, razem dystans maratoński.
Niestety długa przerwa bez regularnych treningów zrobiła swoje. Zakończyłem z czasem 36 min.
To dało naszej drużynie 192 miejsce na 402 drużyny - całkiem nieźle.
Każdy uczestnik dostawał pamiątkowy medal - to będzie już drugi w mojej karierze amatorskiej biegacza.


Pierwsze zdjęcia już do obejrzenia na stronie http://www.accreoekiden.pl/pierwsza-galeria-zdjec

Wyniki i mapka trasy








sobota, 5 maja 2012

JSON editor w Eclipse

Prosty i przydatny edytor z  http://sourceforge.net/projects/eclipsejsonedit/ , jednak instalacja nie byla tak oczywista. 'Instaluj z pliku zip' nie działało. Wystarczyło natomiast skopiować zawartości folderów 'plugins' i 'features' do  'plugins' i 'features' w katalogu domowym Eclipse. U mnie działa :) Sprawdzałem w Eclipse Inigo i Spring Source Tools Suite.

poniedziałek, 26 marca 2012

Grails + CloudFoundry z linii komend



Wykonujemy kolejne kroki:


grails create-app cloudfoundry_example
cd cloudfoundry_example
 edit: grails-app/conf/Config.groovy 
grails.plugin.cloudfoundry.username = "<your_username>"
grails.plugin.cloudfoundry.password = "<pass>"

Alternatywnie mozna te ustawienia zapisac w
USER_HOME\.grails\settings.groovy gdzie USER_HOME to katalog domowy uzytkownika.Wtedy jednak ustawienie wpisow na poziomie aplikacji (Config.groovy) jest ignorowane.


grails install-plugin cloud-support

grails install-plugin cloud-foundry
grails prod cf-push
grails prod cf-update



wiecej komend: 

grails cf-help



Odnośniki:
http://blog.swierczynski.net/2012/01/cloud-foundry-grails-lightning-fast-deployment/ 


33rd Degree Kraków 2012

Druga już konferencja 33rd Degree w Krakowie rozpoczęła się 19 marca 2012
Plan trzech dni wyglądał następująco ( wyróżnione opcjonalne sesje, w których uczestniczyłem):

Day 1

19 March, Monday

TimeLuxoftLuxoftLuxoftRoom DRoom E
08:00 – 09:00Registration
09:00 – 09:30Opening
09:30 – 10:30Raffi Krikorian

Twitter: From Ruby on Rails to the JVM

10:30 – 10:50Coffee break
10:50 – 11:50Ken Sipe

Complexity of Complexity

11:50 – 12:00Coffee break
12:00 – 13:00Venkat Subramaniam

Pointy haired bosses and pragmatic programmers: Facts and Fallacies of Software Development

13:00 – 14:00Lunch break
14:00 – 15:00Josh Long

A Walking Tour of Spring 3.1

Frederic Simon

Build Trust in Your Build to Deployment Flow!

Mike West

Dart

Mariusz Sieraczkiewicz

Ewolucyjna architektura (Polish)

Matthew McCullough

Workshop: Git

15:00 – 15:10Coffee break
15:10 – 16:10Sylvain Lebresne

The Apache Cassandra storage engine

Andrey Breslav

Kotlin: A cool way to program for JVM

Sadek Drobi

Non blocking, composable reactive web programming with Iteratees

Tomasz Cejner

Node.js: The Good, The Bad and The Ugly

16:10 – 16:40Coffee break
16:40 – 17:40Toomas Römer

import continuous.delivery.*;

Josh Long

Cloud Foundry and Spring, a marriage made in heaven

Simon Ritter

The Future of the Java Platform: Java SE 8 & Beyond

Wojciech Seliga

"Every Rose Has Its Thorn": Taming automated tests beast.

17:40 – 20:00

Join the Rebellion Party

hosted by ZeroTurnaround
17:50 – 18:50Stephen Chin

BOF: Cleaner APIs, Cleaner UIs with Visage

Josh Long

BOF: Spring and CloudFoundry

Michał Bartyzel

BOF: O kliencie, który wie, czego chce – czyli codzienne sprawy między biznesem a IT (Polish)

Multiple Speakers

BOF: RFID systems security. A contactless use case.

Rafał Wasielewski

BOF: TypeSafe stack 2.0 and Scala Community Talk

Day 2

20 March, Tuesday

TimeLuxoftLuxoftLuxoftRoom DRoom E
08:30 – 09:00Registration
09:00 – 10:00Joonas Lehtinen

Vaadin, Rich Web Apps in Server-Side Java without Plug-ins or JavaScript

Michael Heinrichs

JavaFX for Business Application Developers

Barry O'Reilly

Agile, Lean and Startups practice & principles to create the ultimate value creation machine

Luke Daley

GEB - Very Groovy browser automation

Arun Gupta

Workshop: Java EE 6 = Less Code + More Power

10:00 – 10:10Coffee break
10:10 – 11:10Matthew McCullough

Economic Games in Software Projects

Lars Vogel

What is so cool about Android. 4.x

James Lewis

Micro services - Java, the Unix Way

Patrycja Węgrzynowicz

Hibernate puzzlers

11:10 – 11:30Coffee break
11:30 – 12:30Venkat Subramaniam

Concurrency without Pain in Pure Java

Sadek Drobi

Play 2.0, a Web framework for a new era

Paweł Lipiński

Agile Design

Sławomir Sobótka

Ścisły przewodnik po aspektach miękkich dla ekspertów IT (Polish)

12:30 – 13:30Lunch break
13:30 – 14:30Ken Sipe

Continuous Delivery Best Practices

Luke Daley

Smarter Testing with Spock

Simon Ritter

Java, Kinect and Gestural Interfaces

Sławomir Sobótka

8 klasycznych technik programistycznych leżących u podstaw nowoczesnej inżynierii oprogramowania (Polish)

Wolf Schlegel

Workshop: Exploring parallel programming in Java

14:30 – 14:40Coffee break
14:40 – 15:40Guillaume Laforge

What's new in Groovy 2.0?

Anton Arhipov

Mastering Java bytecode with ASM

Martin Burlinski

Building hybrid mobile apps for iOS and Android with PhoneGap and JQueryMobile

Ken Sipe

Web Security

15:40 – 16:10Coffee break
16:10 – 17:10Venkat Subramaniam

Scala for the Intrigued

Manik Surtani

Infinispan in 60 minutes

Nathaniel Schutta

Designing for Mobile

Szymon Brandys

Developing for Web, In Web - Eclipse Orion

17:10 – 17:20Coffee break
17:20 – 18:20Multiple Speakers

BOF: Groovy and Grails Meetup

Manik Surtani

BOF: NoSQL and Data Grid

Michael Heinrichs

BOF: Game Development with JavaFX

Jakub Nabrdalik

BOF: Beautiful failures

Day 3

21 March, Wednesday

TimeLuxoftLuxoftLuxoftRoom DRoom E
08:30 – 09:00Registration
09:00 – 10:00Venkat Subramaniam

Integrating JVM Languages

Hamlet D'Arcy

Static Code Analysis and AST Transformations

Nathaniel Schutta

The Mobile App Smackdown: Native Apps vs. The Mobile Web

Jacek Laskowski

(map Clojure everyday-tasks) - Clojure for real-world, day-to-day programming

Andreas Krogh

Lift from a JEE perspective

10:00 – 10:10Coffee break
10:10 – 11:10Ken Sipe

MongoDB: Scaling Web Application

Luca Milanesio

Gerrit

Stephen Chin

JavaFX 2.0 and Scala, Like Milk and Cookies

Bartosz Majsak

Acceptance Test Driven Development with Arquillian

Tomasz de Jastrzebiec Wykowski

Leading Individuals

11:10 – 11:30Coffee break
11:30 – 12:30Robert C. Martin

The Three Laws of Test Driven Development

Simon Willnauer

Challenges in maintaining a high performance search engine written in Java

Nathaniel Schutta

HTML5 For Developers

Szczepan Faber

Gradle plugins - build automation evolved

Arun Gupta

The Java EE 7 Platform: Developing for the Cloud

12:30 – 13:30Lunch break
13:30 – 14:30Nathaniel Schutta

Code Craft

14:30 - 14:40Coffee break
14:40 - 15:40Jurgen Appelo

How to Change the World

15:40 - 16:00Coffee break
16:00 - 17:00Robert C. Martin

Demanding Professionalism

Na konferencji pojawiło się wiele znakomitości, takich jak Uncle Bob, czy Venkat Subramaniam.
Czasem trudno było wybrać ścieżkę spośród tak wielu interesujących pokrywających się wykładów. Poniżej przedstawiam sprawozdanie z wykładów, w kórych miałem okazję uczestniczyć.



Raffi Krikorian Twitter: From Ruby on Rails to the JVM



Raffi pracuje jako Platform Services Director w Twitter. Opowiedział o migracji z Ruby na JVM w Twitterze. Dlaczego była potrzebna, jakie były ograniczenia istniejącej platformy i co nowego zyskała w połączeniu z Java?

Twitter codziennie odbiera od 100 miliona użytkowników ok. 250 milionów tweetów.
Każdy tweet jest duplikowany do followerów co daje średnio 2.5 E9 doręczeń na dobe.
Ruby on Rails charakteryzuje sie tym, że używa interpreterów opartych na jęz. C, jest jęz. dynamicznym, nie jest tak szybki jak jęz. kompilowane (np Java). Zaletą jego jest to, że jest ekspresywny, pisze się w nim łatwo i przyjemnie.
80% serwisów Twittera jest napisanych w Ruby, komunikują się one na końcu z Javą. Do komunikacji uzywany jest szybki protokół SPDY (czyt. Speedy).

Jednym ze sposobów usprawnienia Ruby było napisanie szybszego garbage collector'a - Kiji.
Chociaż obecnie istnieje implementacja Ruby na platformie JVM (JRuby) to w roku 2008, kiedy w Twiterze zaczęto migrować Ruby na platformę JVM, JRuby było jeszcze zbyt mało rozwinięte, dlatego zdecydowano sie na własne rozwiązania.
Java nie jest jęz. zbyt ekspresywnym, więc na celowniku znalazła sie Scala. Jest szybka, statycznie typowana, jest ekspresyjnym jęz. funkcyjnym, ma wsparcie dla współbieżności (w przeciwieństwie do Ruby 1.8).
Zalety JVM:
- zdolność radzenia sobie z obciążeniem serwera
- elastyczność językowa, dobre wsparcie dla innych języków
- prawdziwy model wielowątkowy

Developerzy Tweetera opracowali Finagle - asynchroniczny RPC (Remote Procedure Call), opracowali wlasny JVM, stuningowali JVM garbage collector ściśle zintegrowany z Finagle.
Konkluzja z prezentacji brzmi: przerzucenie się na JVM nie oznacza, że Ruby to pomyłka.
Przy projektowaniu systemów nie należy od razu tworzyc systemu, kóry poradzi sobie ze wszystkim, bedzie skalowalny, wydajny i szybki. Należy raczej projektować system tak, by łatwo było go zmienić, ale nie wprowadzać od początku nieuzasadnionego skomplikowania. Historia Twittera obrazuje, że gdy zachodzi potrzeba, wtedy należy przebudować system, tak jak gdy zintegrowano Ruby ze Scala.


Ken Sipe - Complexity of Complexity


Ken opowiedział o przyczynach skomplikowania. Rozróżnił skomplikowanie systemów na tzw. konieczne, wynikające z tego, że czegoś nie da sie juz zrobić prościej i przypadkowe, wynikające, czy to z niewiedzy, czy z niedbalstwa, czy z przesadnego dbania np. o skalowalność systemu już na samym początku jego istnienia, gdy jeszcze nie wystąpiły takie problemy.

Co oznacza, że coś jest nieskomplikowane? To znaczy, że coś jest:
- proste
- wygodne
- znajome
- przyjazne dla nowicjusza

To nie pojedyncze elementy systemu sa skomplikowane, tylko te same elementy współgrające z innymi elementami. Czynniki sprzyjające skomplikowaniu to:
- zespół: jego rozmiar, doświadczenie, często mówi sie tu o modelu Dreyfusa, w którym wyróznia się następujące poziomy doświadczenia: nowicjusz, zaawansowany nowicjusz, kompetentny, profesjonalista, ekspert
- przesadna troska o wydajność, skalowalność zanim te problemy jeszcze wystąpiły
Tuningować powinniśmy system dopiero, gry wystąpią problemy z wydajnością a nie na zapas.
- użycie technologii przerasających potrzeby, jak gdyby użyć rakiety do wypadu na zakupy
- utknięcie w tzw. 'dobrych praktykach' z pominięciem zdrowego rozsądku i aplikowaniem tych dobrych praktyk wszędzie niezależnie od kontekstu. Dobrze zostało to opisane w książce Hackers & Painters
Dobre praktyki sa dobre dla zaawansowanych nowicjuszy, ale odstraszają ekspertów.
- niejasne wymagania, prowadzą do przypadkowego skomplikowania systemu.

Venkat Subramaniam - Pointy haired bosses and pragmatic programmers: Facts and Fallacies of Software Development

Venkat był moim zdaniem najbardziej energetyzującym mówcą. Na jego prezentacji nie sposób było się nudzić. Imponowała prędkośc z jaką poruszał się po omawianych tematach, odpowiadał na pytania, żąglował narzędziami. Cały czas podtrzymywał zainteresowanie swoją ekspresją i żartobliwymi wstawkami. Tytułowy boss to ten drzemiący w nas samych. Kompetentni pasjonaci prowadzą firmę ku zwycięstwu. Problem w tym, aby takiego indywidualiste w sobie obudzić i utrzymać zamiast ulegania konformizmom.

Doświadczenia wskazują, że w grupie ludzie starają się być zgodni z ogółem, dostosowują do większości i za nią podążają. Rzadko kiedy trafia się indywidualista, kóry podąża swoją drogą. Jeśli już dostosowujemy się do większości, dlaczego nie wybrać tych najinteligentniejszych, najbystrzejszych.
Możnaby powiedzieć, że Venkat rozprawiał o rzeczach oczywistych, ale robił to w taki sposób, że niesposób było się nudzić. Przy okazji tez pojawiło się pare wzmianek literatury godnej uwagi:

Venkat mowił o tym, że systemy stają się skomplikowane, dlatego, że zmieniamy je nieustannie, nawet jeśli nie potrzeba - standaryzacja przed innowacją. Powinno być natomiast odwrotnie, najpierw robimy coś innowacyjnie, dopiero standaryzujemy takie rozwiązanie, czyli znajdujemy dla niego wiele zastosowań.

Wspomniał też, że "mniej znaczy więcej" - tak jest np. z nowymi językami programowania. Porównał je pod kątem dyanamiczności i mocnego typowania. Powstała macierz:




Niektóre z nich dają swobodę pisania, są bardziej ekspresyjne od innych. Są tylko narzędziami do osiągnięcia celu. W zależności od danej potrzeby użyjemy jednego bądź innego.
Nie bójmy się eksperymentować i podejmować nowych rozwiązań w myśl:
"A professional who doesn't learn to fail, fails to learn"


Frederic Simon - Build Trust in Your Build to Deployment Flow!

Frederic mówił o Continuous Delivery. Podkreślił jego zalety takie jak:
- zawsze ostatnia wersja na produkcji, nie trzeba wspierać wielu wersji, legacy kodu.
- szybki feedback użytkowników
- użytkownicy są najlepszymi beta testerami

Pokazał przy tym narzędzie od jfrog: Artifactory
Zapewnia ono śledzenie binarnych wersji komponentów i ich źródeł. Dzięki pluginowi dla Jenkinsa, Bamboo i TeamCity możliwa jest integracja Artifactory z narzędziami do Continuous Integration.
Pojawiło się tez pojęcie Agile Lifecycle Managment (ALM), opisane w książce Agile ALM autorstwa Michael'a Hüttermann'a.
Artifactory dobrze wpisuje sie w ten cykl życia.


Sylvain Lebresne The Apache Cassandra storage engine


Sylvain pracuje w Datastax, gdzie zajmuje się Cassandrą.
Cassandra to baza danych:
- rozproszona, brak struktury master-slave
- replikowalna
- skalowalna
- odporna na błędy, brak jednego słabego punktu (SPOF - single point of failure)

Model danych:
- no SQL
- klucz-wartość
- zainspirowana przez Google BigTable
- oparta na rodzinach kolumn (rodzina kolumn jest analogiczna z tabelą w bazie SQL)

Kluczem jest UUID (universally unique identifier), analogicznie do numeryczych kluczy w SQL, natomiast w rozproszonych bazach trudno jest inkrementowac klucz, stąd takie rozwiązanie.
Każdy wiersz (rodzina kolumn) może mieć różną liczbę kolumn. Kolumny są posortowane na podstawie nazwy klucza. Limitem jest 2 miliardy kolumn w jednej rodzinie kolumn.

Mechanizm zapisu/odczytu danych:
Zapis jest trudniejszy do skalowania niż odczyt. Odczytywane dane mogą być cachowane.
Zapis powoduje losowe operacje wejścia/wyjścia na dysku, dlatego zapis jest wolny.
Zapis:
Przy zapisie wiersza najpierw trafia on do pamieci, tzw. Memtable, jednoczesnie na dysku zapisuje sie commit log, na wypadek gdyby nagle node bazy padł, wtedy przy restarcie z commit loga mozna odtworzyc ostatnio wykonywane operacje. Periodycznie dane z Memtable sa zapisywane na dysku jako SSTable. Zapis jest sekwencyjny. Casandra nie rozróżnia zapisu od updatu. Przy updacie jest zapisywany nowy wiersz z nowymi polami. Periodycznie robione jest tzw. kompaktowanie, które zbiera wszystkie wiersze z tym samym UUID i merguje w jeden wiersz. Kompaktowanie ma na celu zmniejszenie liczny SSSTable, w ten sposób search jest szybszy.
Kazdy wiesz ma swoj czas zycia. Jesli czas ten minął to przy kompaktowaniu wiersz taki jest usuwany z bazy.

Odczyt:
Przy odczycie nieskompaktowanych wierszy robiony jest merge i brane najaktualniejesze pola.

Optymalizacje Cassandry otrzymuje się przez:
- cache wierszy
- cache kluczy
- bloom filter (eliminowanie SSTables)
- indexy na kolumnach i wierszach

Spójność danych reguluje się przez określenie przy zapisie ile nodów musi zwrócić acknowledge.
Cassandra nie ma wsparcia dla tranzakcji, ale można je dodać dodatkowym narzędziem takim jak Zookeeper.


Wojciech Seliga - "Every Rose Has Its Thorn": Taming automated tests beast.
Trzymanie wszystkich testów w jednym module i ich odpalanie przy każdym komicie nie jest dobrym rozwiązaniem i konsumującym dużo czasu.

Rozwiązania pozwalające skrócić czas testowania:
- nieużywanie testów UI (np. Selenium), zamiast tego Page Object Pattern
- setup testów z wykorzystaniem serwisów REST zmiast XMLi, np. użycie własnej annotacji @Category zamiast @Ignore pozwala pamiętać o testach pominiętych, dzięki czemu nie są one zapomniane zaśmiecając kod i powodując niepotrzebny nakład czasu przy kompilacji.
- testowanie tylko zależnych testów, np. jeśli wprowdzaliśmy zmiany w module A testowanym przez TA a TB i TC zaleza od A, to testujemy tylko te moduly a nie uruchamiamy wszystkie testy.
- pojedynczy setup dla kilku testów
- podzielenie codebase na mniejsze unity.

Josh Long BOF: Spring and CloudFoundry

Panel dyskusyjny na temat Spring Cloud Foundry, planów co do jego przyszłości. Uczestnicy zastanawiali się czy SpringSource przyjmie politykę jak Google App Engine i będzie zmuszać użytkowników do periodycznych upgradów software'u do nowych wersji technologii, czy może bedzie też wspierać kilka wersji (MongoDB, Cassandra). Być może SpringSource powinien wystawić deweloperską chmure CloudFoundry na której będą do wyboru wszystkie technologie ze stosu Spring (aktualnienie nie wszystkie  są wspierane w chmurze produkcyjnej). SpringSource w połowie roku 2012 zacznie pobierać za CloudFoundry opłaty.


Barry O'Reilly - Agile, Lean and Startups practice & principles to create the ultimate value creation machine

Barry podzielił sie swoim doświadczeniem i narzędziami związanymi z agile, lean i startup.


Jednym z takich narzędzi jest Business Model Canvas, diagram pozwalający na jednej stronie umieścić do kogo skierowany jest nasz business, jak zamierzamy z niego zarabiać, jakimi kanałami dostępu do odbiorców będziemy sie posługiwać itd. Formularz taki można też łatwo pokazać drugiej osobie (klientowi, inwestorowi?) i szybko wyjaśnić o co nam chodzi.
Następnie Barry wyjaśnił jak się tworzy biznes model a potem waliduje z grupą docelową.
Pierwszym etapem jest burza mózgow i ustalenie:
- kim są ludzie związani z businessem (żeby lepiej ich sobie zwizualizować rysujemy te osoby, jak wyglądają, czym się zajmują, gdzie mieszkają itd..)
- uliczne ankiety z potencjalnymi użytkownikami, jakie są ich oczekiwania, jak używaliby naszego systemu?
- ankiety online





Trudno jest stworzyć system który będzie kierowany do wszystkich, dlatego trzeba się ograniczyć do pewnej grupy odbiorców.
W tym temacie można polecić książkę Agile Experience Design.

Kolejnym etapem jest walidacja produktu. Śledzimy statystyki z użyciem Google Analytics i analizowanie gdzie użytkownicy spędzają najwięcej czasu, gdzie spotykają utrudnienia, jak nawiguja po naszej stronie. Informacje te posłuża do usprawnienia systemu.
Przydatną technika jest Value Stream Mapping - rysujemy proces w formie sekwencyjnego diagramu i analizujemy punkty które zajmują najwięcej czasu, aby je wyeliminować/usprawnić. Patrzymy też na intersekcje z innymi systemami, jesli np. nasz serwis ma odsyłacze gdzieś na zewnątrz, przykład: używamy zewnetrznego serwisu do obsługi płatności online.




Im szybciej dostaniemy feedback tym lepiej.

James Lewis - Micro services - Java, the Unix Way

James pracuje w ThoughtWorks. ThoughtWorks wydaje regularnie darmowy magazyn online - Technology Radar w którym podsumowuje zmiany trendów i technologii.
W ostatnim marcowym numerze pojawił się artykuł o Micro Services, który był przedmiotem tego wykładu.
Micro services są alternatywą dla tradycyjnych serwisów, sa to proste, samodzielne aplikacje instalowane poza kontenerem aplikacji. Każdy serwis posiada wbudowany lekki serwer, np Jetty i komunikuje sie z pozostałymi serwisami po HTTP na różnych portach.
Serwisy są odpowiedzią na skomplikowanie aplikacji i szybko zmieniające sie wymagania. Dekompozycja na małe moduły, które można szybko napisać od nowa zamiast zmieniać istrniejący, silnie zależny od siebie kod to interesujące podejście wpisujace sie dobrze w techniki Continuous Deployment.
Organizacja drużyny projektowej wokół niezależnych modułów (Conway's Law) pozwala też lepiej nimi zarządzać i szacować nakład pracy.

James podkreślił w jaki sposób czasami uproszczona architektura ukrywa w sobie skomlikowanie, np. zmiana architektury pear-to-pear w architekture z użyciem ESB (Enterprise Serial Bus) czyli szyny danych. W rzeczywistości diagram systemu jest prostszy ale skomplikowanie nadal istnieje, tym razem wewnątrz szyny.

W książce REST in Practice opisano jak efektywnie zaimplementować coś w REST, co zwykle byłoby robione z ESB.
Przydatny standard to RFC 5023, czyli The Atom Publishing Protocol.
Charakterystyka mikroserwisów:
- małe, wystarczajaco małe by można je było w każdej chwili wyrzucic i napisać od nowa
- samodzielne
- nie działaja w kontenerze, są instalowane jako serwisy unixowe/linuxowe, np zawierają wbudowany serwer Jetty - ma to zalety w testowaniu (inproctester) i ułatwia deployment
- spakowane jako pojedynczy wykonywalny jar zawierajacy konfigurację, standardowe skrypty unixowe rc.d
- umieszczone w różnych repozytoriach VCS (version control systems) dla zapewnienia separacji
- Domain Driven Design
- tworzone wg. Unix Philosophy
- wykorzystanie Puppet do przygotowania serwisów do użycia


Venkat Subramaniam - Concurrency without Pain in Pure Java


Venkat rekomendował doskonałą książkę o programowaniu współbieżnym w Javie: "Java Concurrency in Practice", Brian Goetz.
95% kodu Java jest popsute dla współbieżności i nawet o tym nie wiemy. Programowanie współbieżne jest jak spacer z teściową - ona wie kiedy się wygłupiliśmy ale nie powie nam o tym, będzie się po cichu naśmiewać. Zamiast cierpieć przy wielowątkowości w Javie z całym nadmiarowym kodem dla synchronizacji Venkat pokazał jak wykorzystać biblitekę clojure.jar wprowadzając tranzakcje.
Użył przykłądu ze swojej książki  Programming Concurrency on the JVM: Mastering Synchronization, STM, and Actors, do której kod można za darmo ściągnąć ze strony.
Tutaj przedstawiam ten wyekstraktowany przykład uruchamiany na JDK 7 jako projekt Maven.
W przykłądzie wykorzystany jest prosty model biznesowy wyciągu z konta bankowego wykonywanego jednocześnie przez 2 metody - 'deposit' i 'withdraw', każda otoczona tranzakcją. Następnie metoda 'transfer' otacza te 2 metody jeszcze jedną zewnętrzną tranzakcją. Zasada jest taka, że jeśli jakakolwiek z tych metod zwróci wyjątek, zewnętrzna tranzakcja nie powinna się powieść. Np:
 z konta = $2000, przelewamy $5000 na inne konto, tranzakcja powinna być anulowana.

Wolf Schlegel - Workshop: Exploring parallel programming in Java

To były praktyczne warsztaty poprowadzone przez pracownika z ThoughtWorks z Hamburga. przy okazji - ThoughtWorks rekrutuje.
Java 7 wprowadza nowe API do wielowątkowości. W czasie tej sesji staraliśmy się porównać szybkość działania sekwencyjnego i współbieżnego dla prostego algorytmu sortowania.
Kody do testów dostarczone przez Wolfa wrzuciłem na githuba razem z prezentacją z warsztatu. Większość czasu zajęło nam napisanie algorytmu sortowania, tak że na zabawę API do współbieżności zostało już niewiele czasu.

Venkat Subramaniam - Integrating JVM Languages

Aktualnie istnieje ok. 2000 jęz. programowania na platformę JVM. Java integruje w pewien sposób je wszystkie.
Wśród punktów integracji języków można wyróżnić:
- bazę danych
- serwisy (przez JSON, XML)
- język, czyli w kodzie jednego języka używamy konstrukcji wywołujących kod z innego języka.


Podział jęz. ze względu na liczbe. DSL - doman-specific languages


Poniżej podaje przykładowe api użyte na prezentacji przy integracji języków. W wolnej chwili spróbuje umieścic jakieś przykłady użycia w kodzie.
Java code:
class JavaClass{
public void people(Collection people){
// do sth
}
public void yield(){
// do sth
}
}


Scala -> Java:
val inst = new JavaClass
val names = List("Jack", "Jill")
inst.people(names)

inst.'yield'() // escape keywords

Groovy -> Java

def inst = new JavaClass()
def names = ["Jack","Jill"]
inst.people(names) // Groovy uzywa kolekcji Java, bez problemu konwertuje

inst.def() // Groovy rozpoznaje kontekst wiec wie ze to nie slowo kluczowe


JRuby -> Java

require 'java'
java_import 'JavaClass'
inst = JavaClass.new
names = %w{Jack Jill}
inst.people(names) // JRuby konwertuje bez problemu bo uzywa kolekcji Java



Ken Sipe - MongoDB: Scaling Web Application

Na youtube jest dość śmieszny filmik przedstawiający dyskusje za i przeciw tradycyjnym bazom SQL vs. NO SQL.



MongoDB to baza dokumentowa, struktura dokumentów w postaci JSON, umożliwia auto-sharding i map/reduce. Analogią do kolumny w tradycyjnych bazach SQL jest kolekcja, a analogią wiersza - dokument.

CRUD:

C: db.user.insert({"username":"ken"})

jeśli kolekcja 'user' nie istniała wcześniej, zostanie teraz stworzona

R: user = db.user.findOne({"username":"ken"})
U: user.city = "St. Louis"

jeśli 'city' nie istniało wcześniej zostanie stworzone w kolekcji 'user'

   db.user.save(user)

D: db.user.remove({"username":"ken"})

dodanie indexu i sprawdzenie czy istnieje:

   db.user.ensureIndex("username":1)
   db.user.hasIndexKeys()

Użyteczne polecenia MongoDB:

show dbs
use <database name>
db.user.save(user)
db.user.findOne(...)
printjson(user)
db.user.find(...).explain
db.user.ensureIndex({"username" : 1})
db.shapes.ensureIndex({radius:1},{sparse:true})

Robert C. Martin - The Three Laws of Test Driven Development


Uncle Bob zaprezentował oczywiste rzeczy. Przytocze killka:
- produktywnośc obniża sie z czasem jak kod staje się bardziej chaotyczny
- powinniśmy postawić sobie zadanie, że za każdym razem gdy czeckoutujemy kod z repo będziemy checkinować kod lepszej jakości niż wycheckoutowany.
- zalety TDD w pisaniu czystego kodu: mamy formalną dokumentację, kod jest niezależny od siebie (decoupling), refaktorujemy kod, prawie nie musimy debugować.
- dlaczego nie porzadkujemy swojego kodu? Bo się obawiamy że zepsujemy coś działającego. Dlaczego sie boimy? Bo nie mamy testów, żeby szybko zweryfikować, czy coś popsuliśmy.
- panuje mit,  że piszac testy piszemy wszystko 2 razy. Kontrargument? Księgowi rachunki wg. zasady dwustronnego zapisu prowadzą 2 rachunki aby na koniec porównać sumę z obydwu, dlaczego programiści nie mieliby tak samo robić z testami?
Strona do zapoznania się http://cleancodeproject.com

Nathaniel Schutta Code Craft


Praktyki jak pisać lepszy kod:
1. Mniej znaczy więcej (mniejszy codebase, mniej templatów, reużywalny kod)
2. Krótkie metody
3. Kompozycja zamiast dziedziczenia
4. Decoupling (TDD pomaga przy tym)
5. Ciągła integracja (CI)
6. Ciągły deployment (CD), nie czekaj na perfekcyjny kod, dostarczaj małymi partiami
7. Review kodu (narzędzia jak Crucible)
8. Metryki kodu (Cobertura, Emma, PMD, FindBugs), pokazuj ludziom diagramy z tych metryk, nie liczby, ludzie lubią obrazki
9. Minimalisuj przypadkowe skomplikowanie
10. Potrzeba zamiast ceremoniału i dobrych praktyk, np użycie bardziej eksppresyjnych języków kosztem statycznego typowania.
11. Nie pracujemy sami, ale z ludzmi - jak przekazujemy więdzę i wartości w zespole? Np. opracowanie podręcznika developera, w którym specyfikujemy ja postawić środowisko developerskie, jak szybko zacząć z kodem.




Jurgen jest autorem książki "Management 3.0" oraz blogu noop.nl
Przedstawił kilka inspirujących pomysłów i linków jak tworzyć innowacyjne rzeczy, mogące zmienić świat.
Książki:

Techniki pomagające w zmianie:
1. Metoda Mojito - użyj dostępnych ale nudnch składników, które razem stworzą interesujący system
2. Model zmian ADKAR
3. Teoria Dyfuzji Innowacji wyjaśniająca w jaki sposób nowe idee i technologie rozprzestrzeniają sie w społeczności.
4. Zastanów sie nad środowiskiem jakie chcesz zmienić, pokoje, biuro, np zacznij umieszać ciekawe plakaty, wlepki stymulujące myślenie.

Tą i inne prezentacje Jurgena można oglądąć na stonie http://www.slideshare.net/jurgenappelo



Ostania już prezentacja, która właściwie nie wniosła nic nowego a jedynie udowodniła po raz kolejny, że Uncle Bob jest doskonałym showmanem. Po raz kolejny rozprawiał nad tym, jak tworzyć czysty kod stosując TDD (gdyby to było takie proste w realnych projektach) i jak być profesjonalistą, który potrafi sprzeciwić się nieosiągalnym terminom w myśl dostarczania rozwiązań wysokiej jakości. Jeśli nie potrafimy zmienić mentalności ludzi w naszej pracy powinniśmy albo zmienić organizację (w sensie organizaje pracy), albo zmienić organizację ( w sensie iść do innej firmy :)).
Z dyskusji z Wujkiem po prezentacji dowiedziałem się, że aby zacząć realnie stosować TDD ponoć wystarczy popracować w ten sposób ok. tygodnia (hm.. czyżby?).

Tym sposobem dobiegł końca 3-dniowy cykl wykładów i warsztatów. Kolejny raz Grzesiek Duda wraz koorganizatorami dowiódł, że warto było wybrać się na 33rd Degree, chociaż może niektóre wykłady były bardziej popisówką aktorską prowadzących, ale nawet to pozwoliło zobaczyć jak można prowadzić prezentację trzymającą w napięciu i bawiącą publikę zamiast niejednokrotnie usypiających wykładów (przeciętne wykłady na studiach).

Duży plus i podziękowania za ogarnięcie logistyczne całości. Można było skorzystać z płatnych co prawda, ale za to niedaleko zlokalizowanych obiadów, a przez całe dni dostępne były darmowe przegryzaki przed salami konferencyjnymi. Tym razem, w porównaniu z ubiegłoroczną konferencją, zdaje się że nawet kolejki przed toaletami były krótsze.

Jak w ubiegłym roku zagościł również kiosk z ksiązkami O'Reilly, które można było kupic za 60% ceny.
Ogólnie na duży plus.

Inne relacje z tego wydarzenia:
http://art-of-software.blogspot.com/2012/03/prezentacje-na-33rd-degree.html
http://jlaskowski.blogspot.com/2012/03/po-33rd-degree-2012-w-krakowie-nie.html