Aug 17 2009

GIT Stash

Na codzień pracuję z IntelliJ IDEA. W tym IDE bardzo podoba mi się funkcja “szufladkowania zmian” podczas pracy z kontrolą wersji. Na codzień korzystam z Subversion i zdarza mi się z tej funkcji skorzystać. Na czym ona polega? Otóż, zdaża się, że pracujemy nad sporym kawałkiem kodu i już dość dużo zmian poczyniliśmy, gdy nagle dostrzeżemy błąd w aplikacji, który chcielibyśmy zmienić, zanim skommitujemy resztę zmian. Powyższa funkcja IntelliJ IDEA pozwala nam na odłożenie dotychczasowej pracy (czyli zmian od ostatniego commita) do szufladki – po czym, możemy poprawić błąd, scommitować zmiany i następnie z szufladki “wyjąć” kod, który napisaliśmy aby kontynuować pracę.

Wielce mnie ucieszyło, gdy zobaczyłem podczas pracy z GIT, że ma on taką funkcję wbudowaną out-of-the-box. Nazywa się ona ‘Stash’.
Wykonuje ona operację dokładnie tak jak opisałem powyżej, czyli…
1. Pracując z dłuższym kawałkiem kodu, mamy już sporo zmian, gdy dostrzegamy błąd aplikacji, który natychmiastowo powinniśmy poprawić.
2. Wykonujemy komendę

 > git stash save "nazwa stasha"

Wykonanie tej operacji zachowa nasze dotychczasowe zmiany gdzieś na boku, a master tree przywróci do stanu HEAD.
3. Możemy poprawić nasz błąd i wykonać commit

 > git commit -a -m "bugfix #2382

4. Przywracamy stan poprzedni, aby kontynuować pracę:

 > git pop

co jednocześnie usunie naszą “szufladkę”, jeżeli nie chcemy usuwać aby móc do tego stanu jeszcze wrócić wykonujemy komendę :

 > git apply

5. Kontynuujemy pracę.

Git Stash ma więcej możliwości, bo takich wirtualnych szufladek możemy tworzyć dowolną ilość i przywracać stan z każdej z nich. Możemy zatem poprogramować w stylu “co by było gdyby…” i wybrać najbardziej odpowiednią wersję napisanego kodu (dotyczy to zwłaszcza młodych programistów, którzy niejednokrotnie nie są pewni podejmowanych decyzji w programowaniu).

Młody czy stary programista – polecam GIT i funkcję stash.

Więcej o tej komendzie znajdziecie tutaj.


Jul 27 2009

Hate Driven Development

Znam kilka metodologii powstawania programów, jak na przykład na bazie testów (Test Driven Development). Jednak przy ostatnim projekcie, poznałem nowy: Hate Driven Development – jak tylko siadam przed komputerem w pracy to przechodzą mi dreszcze po plecach. Tak nienawidzę obecnego projektu, że aż dostaję niezłego kopa w produktywności. Chcę jak najszybciej go skończyć i o nim zapomnieć :) … Chyba wcisnę tą definicję na wikipedię :)


Jul 2 2009

Projekt Euler

Ostatnio szperając po sieci, natrafiłem na ciekawy aczkolwiek nie nowy projekt. Aż dziwne, że nie znalazłem go do tej pory. Projekt Euler bo o nim mowa przedstawia problemy, z którymi musimy się zmierzyć jako programiści. Problemy ułożone na granicy matematyki, kombinatoryki czy tam innej “yki” nie są w możliwe do rozwiązania bez komputera (no chyba, że przez jakiegoś geniusza) Jako programiści mamy zadanie napisać program, który nam to zadanie rozwiąże. Sam projekt nie ocenia jakości naszego kodu bo podajemy tylko wynik i ten jest sprawdzany. Wiadomo jednak, że najlepiej jest się uczyć od innych albo na gotowych zadaniach, więc dla mnie projekt to jest strzał w 10-tkę. Zwłaszcza, że każdy problem (obecnie jest ich ponad 250) ma oddzielny topic na forum i można z innymi programistami podzielić się uwagami i wspólnie zoptymalizować kod, do najkrótszego/najlepszego. Co prawda w javie programuję, już prawie 10 lat, ale akurat zacząłem pisać kod w Ruby’m więc projekt będzie jak znalazł do potrenowania nowych technik.


Jun 27 2009

Raczkowanie z GIT

W związku z tym, że ostatnio coraz częściej korzystam z systemu kontroli wersji GIT (zamiast używanego przez kilka ostatnich lat Subversion) postanowiłem napisać kilka słów na jego temat. › Continue reading


May 4 2009

Matura

Żwawy żuczek z żółtym brzuchem żwawo z życiem
żuł rzeżuchę. Wtem żółw, drobiąc nóżką,
bieży po żywności zapas świeży. Żuczku, żaczku,
żwawe dziecię, zmykaj chyżo, bo żółw zje cię.
Żuk już żagle chciał rozpostrzeć, gdy marudę żółwia
spostrzegł, co wysiłek czyniąc duży, żmudnie
grzebał się w kałuży. Zżarł rzeżuchę żuk niecnota,
a żółw grzebie się wśród błota.

Dziś matury – tradycyjnie rozpoczynają się od języka polskiego. Jak sobie przypomnę, że od mojej minęło już 13 lat…. ;) .

Wszystkim maturzystom, życzę połamania piór.


Apr 22 2009

JIRA i Confluence za 5$

Od 19 do 24 kwietnia jest niebywała okazja aby zakupić licencje startowe na narzędzia JIRA i Confluence za 5$ każdy. Licencja jest dożywotnia wraz z 12 miesięcznym supportem i upgradeami. Dodatkowo będziemy mogli przedłużyć tą licencję na następne lata za kolejne 5$/rok. Jedny limit to 5 użytkowników, którzy mogą korzystać z systemu. Dla małych firm, albo teamów w dużych firmach jest to niebywała okazja aby rozpocząć pracę z tak niebywałymi narzędziami.

Więcej szczegółów pod tym adresem


Apr 1 2009

Prima Aprilis w IntelliJ IDEA

Dzisiaj podczas pisania kodu w JSF, po użyciu często używanego skrótu podpowiadającego składnię zauważyłem coś dziwnego. Poza standardową listą atrybutów możliwych do użycia zobaczyłem na końcu listy napis: “Don’t be lazy, type it yourself”.

screen2Nieźle się uśmiałem. Zacząłem ostro klikać Ctrl+Space i poczytałem sobie więcej takich perełek, np.

“Just relax”

“Not so fast”

“Are you sure?”

“Don’t panic”

“And why did you do that?”

“Code completition might be insuitable for children under 7″

“Please type slower, I can’t keep up with you”

i wiele wiele innych :)


Mar 27 2009

IntelliJ IDEA w pracy

Kurczaki…. ja też mam IntelliJ IDEA w pracy :)

dilbert_intellij


Mar 25 2009

Masz 30 minut? Zbuduj Cytadelę

Z Citadels spotkałem się jakieś 5 lat temu. Czekając na pociąg do Gdańska przesiadywałem na dworcu PKP w Bydgoszczy spotkałem grupkę ludzi, którzy otaczając poczekalnianą ławeczkę grali w kolorowe karty. W pierwszej chwli myślałem, że to któraś z kolekcjonerskich karcianek, ale dobieranie kart nie przypominało żadnej znanej. Sam w kieszeni miałem swoją ‘niepokonaną’ talię  DoomTroopera i miałem cichą nadzieję na krótką partyjkę. Podszedłem zagadać. Niestety, a może i na szczeście – nie był to Doom Trooper, ani nawet MtG (co było moim drugim tropem) – ludziska grali z Citadels. Nowinkę na rynku gra karciana NIE KOLEKCJONERSKA. Bardzo mnie to zaintrygowało, bo wkurzało mnie już ta mnogość kart i ciągłe dokupowywanie nowych – co bardzo się odczuwa gdy mieszka się w małym miasteczku. Gdy pociąg podjechał całą paczką zajęliśmy przedział bo okazało się razem zmierzamy do 3City.

Te kilkadziesiąt minut podróży było wypełnione kilkunastoma rozgrywkami. Po drugiej partii miałem zasady z małym palcu – grało się na prawdę zajedwabiście. Ciągle wygrywał ktoś inny (co czasami bywa trudne przy karciankach kolekcjonerskich gdy gra się z tymi samymi osobami tą samą talią kilka rund pod rząd).

Od tego czasu nie miałem z grą do czynienia. Ostatnio jednak,  ni z tąd ni z owąd przypomniała mi się. Będąc przypadkiem w Gdańsku wpadłem na chwilkę do Rebela zobaczyć jak wygląda po prawie 10-ciu latach. Niektóre gry po takim okresie tylko dojrzewają, niektóre przemijają. Cytadela w Polsce ma złoty okres. Pierwszy nakład wyprzedany w 100%. Obecnie wyprzedaje się drugi nakład. Pięknie wydana – Veni, Vidi – zagrałem, kupiłem. Wciąga jak 9 lat temu. Proste zasady, dobra grywalność. Masakryczna rozgrywka – najlepiej przy 4-5 graczach, no i … mieści się w kieszeni :D (bez żetonów, ale zawsze :) ). Kupiłem i jestem bardzo zadowolony. Czasami potrzeba czegoś szybkiego – gdy nie ma się za dużo czasu, czeka na pociąg, albo czeka na swoją rundę w Turnieju Warhammera 40k :) W takich przypadkach polecam Citadels – na prawdę warto.

Cytadela

W tym miejscu chciałem jeszcze pogratulować obsługi sklepu Rebel. Polazłem tam aby zobaczyć z ciekawości co po latach z tą Cytadelą się stało i chwilkę pogadać co na rynku i tak dalej. Sprzedawca wyciągnął z zaplecza talię i zaprosił mnie do stolika. Dosiadło się do nas jeszcze dwóch chłopaków, którzy akurat byli w sklepie. Na oczy zobaczyłem co się z grą stało :D i ją kupiłem. Taka obsługa klienta powinna być w kazdym sklepie :D


Mar 9 2009

Confused with Ranges

Fajną nowością w języku Groovy, w porównianiu do języka Java są Ranges. Jest to kolekcja ( a dokładnie wyjasniając implementuje interfejs java.util.List ), która definiuje zasięg kolekcji – początek i koniec. Oznacza się go oddzielajac dwoma kropkami pierwszy element od ostatniego, np. 1..3 zawiera kolekcję liczb od 1 do 3 (włącznie), a 1..<3 zawiera kolekcję liczb od 1 do 3 (nie wliczając 3). Problem jest właśnie ze zrozumieniem jak działa ten znak miejszości.

Mamy na przykład w kodzie tablicę:

 1 def a = ['a', 'b', 'c', 'd', 'e']

Elementy posiadają indeksy od 0 do 4, jednak w groovym dodatkowo posiadają indeksy od -5 do -1 .

   a  b  c  d  e
   0  1  2  3  4
  -5 -4 -3 -2 -1

Dodatkowe indexy służą m.in. do pobierania elementów tablicy od końca.

 1 assert a[0] == 'a'
 2 assert a[-5] == 'a'

Możemy pobierać elementy tablicy za pomocą Range:

 1 assert a[0..3] == ['a', 'b', 'c', 'd']

lub w odwrotnej kolejności:

 1 assert a[-1..-5] == ['e', 'd', 'c', 'b', 'a']

Teraz porównywanie ‘do’:

 1 assert a[0..<3] == ['a', 'b', 'c']

nie wlicza 3 do zasięgu, więc są wypisane elementy o indeksach 0, 1 i 2.
Jak to się ma przy indeksach ujemnych? Sprawdźmy:

 1 assert a[-5..<-3] == ['a', 'b']

zasięg bierze indeksy DO 3 więc zaczynając od pierwszego -5 na -4 kończy. Czyli wszystko tak jak powinno.

Teraz zagadka:

biorąc pod uwagę, że elementy tablicy posiadają indeksy tak jak wyżej podano:

   a  b  c  d  e
   0  1  2  3  4
  -5 -4 -3 -2 -1

Które elementy posiada subtablica a[0..<-3] ?

Logicznie rzecz biorąc index mniejszy od -3 = -4 . więc subtablica powinna zwierać elementy ‘a’ (index początkowy 0) i ‘b’ (indeks -4). Jednak wynik jest inny:

 1 assert a[0..<-3] == ['a', 'b', 'c', 'd']

Jak to interpretować? Otóż we wszystkich podanych wyżej (oprócz ostatniego) przykładach początek zasięgu był mniejszy od końca ( a < b ). W ostatnim, początek jest większy od końca ( 0 > -3). Groovy zatem interpretuje taki zasięg jako odwrotny i znak mniejszości faktycznie również odwraca i traktuje jako znak większości. Czyli w powyższym przykładzie podaje jako koniec zasięgu index większy od -3 czyli -2. Z tego powodu mamy taki wynik.

Tak samo będzie w przypadku:

 1 assert a[4..<1]  == ['e', 'd', 'c']