Konferencję Warsjava uważam za udaną. Ponowne spotkanie ludzi których pamiętam z java4people i pierwszej edycji COOLuarów. Dające do myślenia prelekcje i dyskusje po nich.
Niestety spóźniłem się. Trafiłem dopiero na 2 wystąpienie Pawła Lipińskiego. Gdy spytałem sąsiadów o temat, zyskałem beztroskie wzruszenie ramionami. Fakt, student ma inne rzeczy na głowie, gdy dostaje test za rozwiązanie którego można wygrać koszulkę czy też PlayStation :)
Jedna z koncepcji przedstawiona przez prelegenta nie daje mi spokoju: robienie jednej rzeczy jest lepsze niż wielu jednocześnie. Sam podczas rozwiązywania problemów staram się robić 2 rzeczy. Gdy zatnę się na jednej, ruszam z drugą. Pozwalam przetwarzać moim neuronom pierwszy problem w tle.
Czasami po prostu wiem, że kolejne zadanie spowoduje długie czekanie (na pobranie połowy netu przez Maven'a lub kolejny krok instalacji Oracle) więc staram się zrobić kilka drobnych rzeczy po drodze.
Zasada równoległej realizacji niezależnych zadań świetnie sprawdza się w zarządzaniu projektem i przetwarzaniu danych przez automaty. Tylko czy działa to na poziomie indywidualnej organizacji zadań?
Ileż to razy robiłem podwójny update bo spodziewając się że chwilkę zajmie - przełączałem się na struganie skryptu w oknie obok. Po powrocie do pierwotnego kodu nie pamiętałem czy zrobiłem ten update czy tylko chciałem go zrobić - więc dla pewności ... :)
Ileż razy musiałem ponownie zainstalować Oracle bo zapomniałem zaznaczyć jakieś ważnej opcji lub usunąć któregoś wpisu w rejestrze przy poprzednim odinstalowaniu Oracle :)
Więc może jednak warto spróbować z jedną rzeczą na raz.
Dariusz Łuksza swoją prezentacja o narzędziach do Git: egit (plugin do Eclipse), gitosis (serwer do utrzymywania repozytorium) gitweb (udostępnianie zawartości przez www), gerrit (system wspierający rewizje kodu) przypomniał mi, że miałem rozpoznać ten system kontroli wersji i jeszcze się za to nie zabrałem ... od 1,5 roku :)
Obserwowanie dobrego specjalisty, który potrafi wycisnąć ze swoich narzędzi 100% jest naprawdę rewelacyjnym doświadczeniem. Porównywalnym z czytaniem eleganckiego rozwiązania w kodzie.
Marcin Rzewucki oraz Jan Rychter przedstawili Clojure. Skoro są ludzie, którzy używają tego języka komercyjnie i istnieją narzędzia wspierające budowanie Leiningen może nadszedł czas odświeżenie i pogłębienie swojej wiedzy na ten temat.
Prezentacja Adama Michalika na temat czytania i pisania bytecode była zaskakująca. Sceptycznie do niej podszedłem ale zostałem mile zaskoczony. Jeśli ktoś potrudzi się, by za pomocą javap przeanalizować przykłady bytecode dla:
- klas implementujących covariant return types,
- konkatanacji String'ów
- traktowania wartości boolean, byte, short i int
- klas wewnętrznych
wówczas nie spojrzy już tak samo na kod źródłowy. Zastanawia mnie tylko, czy powszechna znajomość Jasmin wśród fanów przedwczesnej optymalizacji nie przyniesie nam chaosu i zniszczenia :)
Rafał Rusin przedstawił implementację standardu WS HumanTask przez projekty Apache HISE i Apache Camel. Ciekaw jestem w jakim zakresie te narzędzia znajdą zastosowanie.
Organizacja przebiegła sprawnie. Brakuje mi tylko eventu na LinkedIn :)
poniedziałek, 25 października 2010
Konferencja Warsjava 2010
czwartek, 19 sierpnia 2010
APM boost
Better OS
------------
Till last weak I was using Windows XP as the base for my development effort (Try Vista, try Windows 7 - user friendly means too difficult to find tools under the annoying effects). But after a few experiences with different Linux distros (Ubuntu, Centos, Fedora) I've finally chosen most suitable for me.
Basic knowledge
It take some time to run computer with Linux instead of walking it ;) but it's worth the effort. I remember pushing to the limits regexp in Notepad++ and Eclipse diff to be close to desired result on Win. In the Linux world it's just standard option in grep, find, sed or awk (and it's not close to result - it's simple and accurate solution).
Keyboard
Microsoft Comfort Curve Keyboard 2000 is my current choice. It is slim and more ergonomic than classic keyboard. And big enough to use on armchair :D
Short cuts
A little learning about short cuts in Terminal, multiple workspaces, Firefox and some customization.
Finally great boost in APM's is finally mine. It's probably not the greatest idea to use keyboard to do precise pointing (play cRPG without mouse if you don't believe). Using mouse to do things that can be done by shortcut is even more painful (try playing cRPG without keyboard).
The reason is not because the time saving by using immediate short cut vs mouse point, choose and click but the time spend to distract you from whats on your mind currently. That's why I don't agree that mousefeed isn't decent plugin (well I would not agree if it didn't crash old Eclipse versions).
Brave new world
Why in english?
---------------
I wanna learn as many different things as possible. I have heard that it's one of the key things to achieve 100+ lifespan :) So I'm writing in my sloppy english. Hopefully some French, German, Spanish or Japanese posts will occur ;)
Why new world?
--------------
The time when a was working for the current company very soon will end. And a new challenging events will follow (I hope).
Why brave?
----------
It only took me 1 day off work and suddenly plethora of crazy, impossible, revolutionary, amazing, a little scary, innovative and eventually profitable ideas come to my mind.
First Step
----------
The most crazy, impossible and terrifying one was to clean up my living space. After 5+ years of cleanup-by-putting-unnecessary-stuff-to-rarely-accessed-place introducing order take some time. Sorting notes from university, high school, and random notes gave me opportunity to watch some videos on InfoQ and YoutTube. Here are the ones I find interesting:
On TDD
Test Driven Development: Ten Years Later
Manager's Introduction to Test-Driven Development
On TDD by Misko Hevery
The Clean Code Talks - Don't Look For Things!
The Clean Code Talks -- Inheritance, Polymorphism, & Testing
On Agile Metrics
Agile Project Metrics
On iterative development and testing
Interview: Ron Jeffries on Running Tested Features
On Architecture
Learning from Five Years as a Skype Architect
By Joshua Kerievsky
all presentations and interviews are very interesting
And looking at the great pile of papers - I'll probably watch quiet a few more :)
środa, 12 maja 2010
break;
Jakiś etap mojego funkcjonowania się zakończył. Powoli wycofuję się z bycia leaderem Lublin JUG - są ludzie o lepszych kwalifikacjach organizacyjnych i programistycznych. Od jakiegoś czasu nie piszę postów. Z wieloma zaprezentowanymi tu opiniami się nie zgadzam. Niektóre były niepotrzebnym rozrywaniem sobie koszulki lub wymądrzaniem się. Droga do bycia dobrym programistą nie jest prosta i bezstresowa a że głośno myślałem na blogu ... :) Niemniej z niektórych postów jestem po prostu dumny. Słyszałem, że niektóre przydały się innym jeszcze inne przydały się mi :P Jak przychodzę do domu, to już nie odpalam kompa, żeby sprawdzić co nowego w 20+ grupach dyskusyjnych IT, albo poeksperymentować z jakimś dziwnym feature'm na który natknąłem się gdzieś przypadkiem. Pędziłem szybko, biorąc na siebie obowiązki, angażując się w różne aspekty funkcjonowania - wszystko po to, by zostawić coś daleko za sobą. Praktyka pokazuje, iż nie wychodzi mi to. Trudno niech sobie tak będzie. Ja się zasapałem, więc teraz sobie odpocznę.
czwartek, 15 kwietnia 2010
Czyżby zmiana kierunku (z Lisp'em w tle)
Wysłuchałem dziś wywiadu w SE Radio na temat języka Lisp. Jestem pod silnym wrażeniem. Opowieść o historii powstania pierwszego kompilatora Lisp'a rzuciła mnie na kolana. Na tyle, że po powrocie do domu nie siadłem do 5 sezonu Stargate Atlantis. Opowieść o tym, jak kilka osób ze świata Lisp'a próbowało zrozumieć o co chodzi w programowaniu obiektowym pogłębiła efekt. Niektóre fragmenty są naprawdę zabawne. Niemniej, podczas słuchania, nie mogłem oprzeć się od myśli, iż programowanie obiektowe jest tylko trywialnym przypadkiem programowania funkcyjnego. Takim dla małych dzieci. Żeby sobie kuku nie zrobiły :) ... Dziedziczenie wielo-bazowe jawi się, jako przykład tego, jak te małe dzieci próbując rozbudowywać swoje zabawki poszły w jakimś dziwnym kierunku. Wypaczając ciekawą i dosyć naturalną ideę rozszerzania mixin'ów. ... Mam wrażenie, iż w dziedzinie tworzenia oprogramowania rozwój nie polega na wpadaniu na nowe koncepcje, przełomowe idee. Polega on na wygrzebywaniu starych, dużo lepiej rozwiniętych koncepcji w bardziej łopatologiczny i uproszczony sposób. Ubrany w lepsze marketingowo słowa. ... Od jakiegoś czasu noszę się z zamiarem zmiany kierunku moich riserczów. Może trochę trzeba odpocząć? A może zamiast podniecać się nowymi cieszącymi oko łeb-frejmłorkami i prze-ficzerami z bibliotek FOSS, lepiej dogłębnie poznać i zrozumieć podstawowe narzędzie każdego programisty - języki programowania (Scheme, Forth). Sprawdzić co, już dawno temu, zostało odkryte. ... A może zmienić kierunek zainteresowań jeszcze bardziej?
wtorek, 9 marca 2010
Wyrażenia lambda na Lublin JUG
Dziś Wojciech Gomoła na spotkaniu Lublin JUG wywołał niezłą dyskusję :) Widać wyraźnie, iż Java jest głęboko za .NET jeśli chodzi o wprowadzanie rozszerzeń języka. Spora część dzisiejszych uczestników LJUG'a widziała w prezentowanych wyrażeniach lambda, nową metodę na pisanie marnego kodu. Z oficjalnej informacji na temat nowości w Java 7 wynika, iż wprowadzenie czegoś podobnego do wyrażeń lambda, jest konsekwencją ułatwienia implementacji języków dynamicznie typowanych. Warto się chyba przyjrzeć nowym feature'om z pakietu java.dyn. Skoro będą w standardzie napewno będą używane i nadużywane. Na spotkaniu pokazana była biblioteka Google Collection. Na mnie zrobiła spore wrażenie. Wydaje mi się, że dało by się ją sensownie wykorzystać. Trzeba będzie dorzucić ją do skrzynki z narzędziami.
niedziela, 7 marca 2010
hamcrest - matchery
W podstawowej bibliotece hamcrest hamcrest-core.jar dostępne są różne matchery, które można podzielić na kilka grup.
Dopasowanie napisów
| startsWith(substr) | testItem.startsWith(substr) |
| endsWith(substr) | testItem.endsWith(substr) |
| containsString(substr) | testItem.indexOf(substr) >= 0 |
import static org.hamcrest.core.StringContains.containsString;
import org.hamcrest.Matcher;
// ...
Matcher<String> matcher = containsString("ma");
boolean match = matcher.matches("ala ma kota"); // true
Sprawdzenie równości obiektów, null, typu
| sameInstance(object) | testItem == object |
| equalTo(operand) | testItem.equals(operand) |
| notNullValue() | testItem != null |
| nullValue() | testItem == null |
| instanceOf(type) | testItem instanceOf type |
import static org.hamcrest.core.IsEqual.equalTo;
import static org.hamcrest.core.IsInstanceOf.instanceOf;
import static org.hamcrest.core.IsNull.notNullValue;
import static org.hamcrest.core.IsNull.nullValue;
import static org.hamcrest.core.IsSame.sameInstance;
import org.hamcrest.Matcher;
//...
Matcher<Integer> mSameObject = sameInstance( new Integer(0) );
boolean isSameObject = mSameObject.matches( new Integer(0) ); // false
Matcher<? super Integer> mEquals = equalTo( new Integer(0) );
boolean isEquals = mEquals.matches( new Integer(0) ); // true
Matcher<Bar> mNull = nullValue();
boolean isNull = mNull.matches( new Bar() ); // false
Matcher<Integer> mNotNull = notNullValue();
boolean isNotNull = mNotNull.matches( new Integer(0) ); // true
// ...
interface Foo {}
class Bar implements Foo {}
Matcher<Foo> mInstanceOf = instanceOf( Foo.class );
boolean isInstanceOf = mInstanceOf.matches( new Bar() ); // true
Łączenie warunków, itp
| anything() | true |
| anyOf(Matcher... matchers) | matcher1 || matcher2 || ... |
| allOf(Matcher... matchers) | mathcer1 && matcher2 && ... |
| not(matcher) | ! matcher1 |
| is(matcher) | matcher |
| both(matcher1).and(matcher2) | matcher1 && matcher2 |
| either(matcher1).or(matcher2) | matcher1 || matcher2 |
Przeglądanie kolekcji
Najlepsze na koniec:- everyItem(elementMatcher)
- hasItem(elementMatcher)
- hasItems(Matcher super T>... elementMatchers)
import static org.hamcrest.core.Every.everyItem;
import static org.hamcrest.core.IsCollectionContaining.hasItem;
import static org.hamcrest.core.IsCollectionContaining.hasItems;
import static org.hamcrest.core.IsEqual.equalTo;
import org.hamcrest.Matcher;
// ...
List<String> stringList = Arrays.asList("eggs", "spam");
Matcher<?> mEveryItem = everyItem(equalTo("eggs"));
boolean isEveryItem = mEveryItem.matches(stringList); // false
Matcher<Iterable<? super String>> mHasItem1 = hasItem(equalTo("eggs"));
boolean hasItem1 = mHasItem1.matches(stringList); // true
@SuppressWarnings("unchecked")
Matcher<Iterable<String>> mHasItems1 = hasItems(
equalTo("eggs"), equalTo("spam") );
boolean hasItems1 = mHasItems1.matches(stringList); // true
Dodatkowo jeśli sprawdzamy czy obiekt w kolekcji jest równy dnemu, możemy pominąć equalTo()
- hasItem(T element)
- hasItem(elementMatcher)
- hasItems(T... elements)
import static org.hamcrest.core.IsCollectionContaining.hasItem;
import static org.hamcrest.core.IsCollectionContaining.hasItems;
import static org.hamcrest.core.IsEqual.equalTo;
import org.hamcrest.Matcher;
// ...
List<String> stringList = Arrays.asList("eggs", "spam");
Matcher<Iterable<? super String>> mHasItem2 = hasItem("eggs");
boolean hasItem2 = mHasItem2.matches(stringList); // true
System.out.println(hasItem2);
Matcher<Iterable<String>> mHasItems2 = hasItems("eggs", "spam");
boolean hasItems2 = mHasItems2.matches(stringList); // true
System.out.println(hasItems2);
Dodatkowe matchery
W archiwumhamcrest-library.jar znajdują się matchery realizujące: - porównywanie liczb (w tym z daną dokładnością),
- porównywanie napisów bez uwzględniania wielkości liter lub białych znaków,
- czy napis jest pusty,
- czy tablica lub kolekcja ma określony rozmiar lub czy mapa zawiera określony klucz lub wartość
- testowanie występowania określonej ścieżki XPath
