Wspomagacze dla Javy 8

Posted 2 CommentsPosted in java

W dzisiejszym wpisie omówię kilka bibliotek, dzięki którym pisanie w Javie staje się przyjemniejsze :) Jeśli czujesz, że barokowy kod Javy, jest… barokowy, ale nie możesz (lub nie wolno Ci) pisać w Scali – to ten wpis jest dla Ciebie. Biblioteki o których mowa to: javaslang, AssertJ oraz Lombok.

Co prawda od momentu wydania pierwszej wersji Javy 8 minęło już sporo czasu, ale nadal nie wszyscy mają ten komfort, aby móc wykorzystywać ją komercyjnie. Ja na szczęście mam taką możliwość, więc postanowiłem opisać kilka wspomagaczy, za sprawą których pisanie w Javie jest przyjemniejsze 😉 A odnośnie przyjemności pisania kodu, to Scala jest dla mnie nadal niedoścignionym wzorcem. Ale jeśli tak dalej pójdzie, to może nawet w czystej Javie w okolicach JDK10..11 będzie już całkiem znośnie.

Javaslang wprowadza do Javy 8 dodatkowe możliwości w programowaniu funkcyjnym. Osoby zaznajomione ze Scalą od razu odnajdą się w API, które udostępnia javaslang. Co prawda nie będzie tak fluent jak w Scali, ale jeśli mamy projekt w JDK8, a nie możemy sobie pozwolić na Scalę, to javaslang sprawdzi się idealnie.

Poniżej przedstawię przykłady i porównania różnych wersji kodu, który robi to samo. Jako założenie przyjmuję, że wszelkie filtrowania będą robione na poziomie kodu Java, dzięki temu łatwiej będzie mi pokazać różnice. Z góry uprzedzam – żeby nie było pytań dlaczego nie robię tego na innej warstwie, np. w WHERE …. 😉

Przykład 1: filtrowanie po mieście, z którego pochodzi osoba.

Pierwsza wersja to kod w czystej Javie, z czasów sprzed Javy 8. Jest długo, sporo linii się marnuje.

Druga wersja to kod wykorzystujący możliwości Javy 8. Jednak w oczy rzuca się stream() oraz collect(toList()), które nadal zbędnie wydłużają kod. Jest to jeden z moich największych zarzutów dla Javy 8, zaraz po method reference z ::.

Trzecia wersja to wykorzystanie możliwości javaslang. Jest to najkrótsza wersja, i jednocześnie najbardziej czytelna. Jedyne co początkowo może razić to, że należy dokonać konwersji z java.util.List na javaslang.collection.List (metoda ofAll). Następnie jest już dużo krócej. Jednak wraz z tym, jak coraz większe partie kodu zaczną korzystać z API javaslang, liczba takich konwersji szybko się zmniejsza.

 

Przykład 2: wykonanie akcji, dla wszystkich osób, które mają hobby. Pole hobby jest opcjonalne, może być nullem. Założenie: nie mogłem użyć Optional :)

Pierwsza wersja to czysta Java 8. W oczy kłuje konieczność wielokrotnego wołania metody getHobby().

Druga wersja, czyli wykorzystania javaslang. Wykorzystanie potęgi Option. Jeśli hobby było zdefiniowane, Option stanie się Some i dla każdego hobby wykona akcję. Jeśli hobby nie było zdefiniowane – Option będzie None, i żadna akcja nie zostanie podjęta.

Trzecia wersja to zamiana lambdy na method reference z JDK8. Nie dało się chyba bardziej zaciemnić kodu, niż tymi dwoma dwukropkami. Dla porównania, w Scali dało się to zrobić czytelnie, dwie wersje do wyboru:

Obie wersje (z filtrowaniem oraz Option) są dużo bardziej zwięzłe niż w Javie, a także czytelniejsze :)

Ponadto, javaslang znacznie zwiększa możliwości functional interface. Mamy curried(), memoized(), tupled()… Należy tylko pamiętać, żeby zamiast Javowych interface używać tych z javaslang – one i tak rozszerzają te javowe, a dają dużo więcej możliwości. Przykład:

W javaslang zawsze możemy zawołać funkcję z liczbą wypełnionych argumentów mniejszą niż zadeklarowane. W czystej Javie 8 nie mamy takiej możliwości. Daje nam to znacznie więcej możliwości komponowania praktycznego i czystego API.

Kolejna rzecz, o której warto wspomnieć, to Tuple. Przydatne, jeśli na szybko trzeba poskładać byt, który przechowuje wartości, ale nie mamy pod ręką klasy, które się do tego nadaje:

Match, czyli funkcjonalność analogiczna do pattern matching ze Scala. Najpierw jednak pokażmy kod w smutnej Javie:

Switch, a więc trzeba pamiętać o break, a także obsłużeniu default. Ale akurat default to wymusi na nas final.

Teraz wersja z if:

Jest już lepiej, ale zobaczmy jak będzie wyglądać tak samo działający kod z wykorzystaniem Match:

Jest to zdecydowanie najbardziej czytelna wersja. Należy jednak pamiętać o korzystaniu z Supplier (czyli: () ->), dzięki któremu wykonanie instrukcji będzie lazy.

Przedstawiłem tylko kilka z wielu możliwości javaslang. Zachęcam do zapoznania się z tą biblioteką we własnym projekcie.

 

AssertJ jest biblioteką, która sprawia, że asercje w testach można pisać w czytelniejszy sposób. Prawie tak samo fajny jak w ScalaTest. Jak możemy przeczytać na stronie projektu, biblioteka ta jest rozszerzoną i ulepszoną wersją projektu Fest – powstała jako jego fork. Jako ciekawostkę dodam, że podczas mojej pracy z AssertJ znalazłem bug – od czasu jego zgłoszenia do bug truckera projektu do momentu rozwiązania problemu minęło mniej niż 24 godziny :) Taki szybki czas reakcji również pozytywnie świadczy o projekcie i zachęca do dalszego korzystania.

Pierwszy przykład – sprawdzenie czy lista jest pusta. Już sam JUnit daje nam kilka możliwości, ale API AssertJ jest zdecydowanie czytelniejsze:

Sprawdzenie przefiltrowanych danych:

Wynik powinien zawierać tylko osoby, które są z Lublina. Asercja zapisana za pomocą AssertJ jest czytelniejsza, i łatwiejsza w zrozumieniu. Łatwiej widać, jaki cel miał autor tego testu, co chciał sprawdzić i jakich warunków oczekuje. Dla porównania w Scali i tak będzie najkrócej, ale niemniej czytelnie:

Przykład drugi – sprawdzenie czy zadany ciąg znaków spełnia wymagania:

Kolejny raz asercje napisane w AssertJ są łatwiejsze w zrozumieniu – od razu widać co jest przedmiotem tego testu, nie ma niejednoznaczności. Dodatkowym atutem, jest większy feedback z wiadomości w przypadku, gdy test zakończy się failem.

W AssertJ możemy również w prosty sposób zmienić zachowanie się asercji, tak aby zawsze wykonały się wszystkie sprawdzenia – a nie do pierwszego faila. Nazywa się to soft assertions. Przykład:

Należy tylko pamiętać o wywołaniu assertAll() na końcu metody testowej. Ale w przypadku JUnit i na to jest rozwiązanie:

 

Ostatnia z bibliotek nie jest związana bezpośrednio z Javą 8, ale w kontekście całości tego wpisu pasuje idealnie.  Czym jest Lombok? Lombok jest biblioteką umożliwiającą ograniczenie ilości pisanego kodu. Dzięki Lombokowi zamiast tracić czas, na żmudne pisanie getterów, setterów i konstruktorów możemy go spędzić bardziej produktywnie – pisząc prawdziwy kod.

Aby móc korzystać z Lomboka, oprócz wpisu w pomie potrzebujemy także pluginu do naszego IDE. Zarówno dla IntelliJ jak i NetBeans mogę śmiało powiedzieć, że plugin działa poprawnie. Natomiast jeśli chodzi o Eclipse – na stronie Lomboka możemy znaleźć informację, że także dla tego IDE jest plugin, ale z niego nie korzystałem, więc nie wypowiem się czy działa poprawnie. Dzięki pluginom do IDE normalnie działa podpowiadanie składni. Należy tylko pamiętać, aby włączyć w IDE przetwarzanie adnotacji podczas (w IJ jest to ustawienie „Enable annotation processing”). Jednak przejdźmy do przykładów. Poniżej mamy klasę Person, napisaną w czystej Javie:

Jak można łatawo zauważyć, tylko 5 linii kodu ma znaczenie, natomiast pozostałe kilkadziesiąt to pusty kod, który jedynie pobiera lub ustawia wartość. Dodajmy teraz Lomboka: na początek jedynie zamiast getterów i setterów:

Klasa uległa znacznemu skróceniu, a kod nadal działa tak samo. Teraz zastąpmy konstruktory:

Finalnie mamy klasę, która posiada takie same własności, działa tak samo, ale kodu jest znacznie mniej. Czy jest czytelniej? To zależy. Początkowo może być trudno przyzwyczaić się do takiej formy, ale z czasem staje się to coraz bardziej czytelne. Adnotacje Lomboka pozwalają na konfigurowanie niektórych ustawień – można m.in. modyfikować zasięgi widoczności:

Podsumowując: Lombok to dobry sposób na zmniejszenie ilości nudnego kodu. Jeśli jednak możemy to napisać w Scali, to będzie jeszcze krócej i czytelniej:

Podsumowanie

Nie miałem na celu pokazania pełnych możliwości omawianych bibliotek. Moim celem było jedynie wykazanie, że powyższe biblioteki idealnie realizują zadania, do których zostały powołane. Podepnijcie je więc do swoich projektów już dziś, i cieszcie się jeszcze czystszym kodem :)

Facebooktwittergoogle_plusredditpinterestlinkedinmailFacebooktwittergoogle_plusredditpinterestlinkedinmail

Dlaczego warto robić wielokrotne backupy – case study

Posted Leave a commentPosted in Uncategorized

Dziś będzie wpis, który nie będzie dotyczyć programowania :)

Kilka dni temu, oczekując aż pasek postępu pewnej długo trwającej operacji dojdzie do końca, przeglądałem moje archiwa ze zdjęciami. Dane te (zdjęcia) trzymam w dwóch miejscach: na dysku podstawowym WD Green, oraz na dysku backupowym WD Red. Gdy przejrzałem już wszystkie zdjęcia z 2008 oraz 2009 roku, uświadomiłem sobie, że nigdzie nie widziałem zdjęcia, które kiedyś miałem jako profilowe na wielu portalach. A przecież dokładnie pamiętam to zdjęcie – zrobione podczas próby u mnie w garażu, gdy akurat miałem chwilę przerwy w graniu na perkusji. Przez moment pomyślałem, że może pamięć mnie zawodzi, że może to zdjęcie było zrobione kiedy indziej – ostatecznie doszedłem do wniosku, że jednak z moją pamięcią jest wszystko OK, a problem raczej leży po stronie maszyny, zwanej komputerem. Przystąpiłem więc do próby odnalezienia innej wersji tego zdjęcia – jako, że to był mój avatar na wielu forach, miałem je na dysku (w katalogu z obrobionymi zdjęciami) w wielu rozmiarach.

Bingo! Zdjęcie się znalazło – ale tylko obrobione. Surówki brak. Szybkie sprawdzenie danych w Exifie potwierdza mój stan pamięci – data zrobienia zdjęcia 10 lipca 2009. W Exifie są również informacje o pozostałych parametrach zrobienia zdjęcia. Ustaliłem, że zdjęcie zrobiono z ogniskową 135mm. Wyszukałem więc wszystkie pliki JPG, na wszystkich dyskach, które w Exifie mają ogniskową o długości 135mm. Przegląd wyników wyszukiwania nie przyniósł niestety oczekiwanych rezultatów – pośród wyników były tylko obrobione kopie poszukiwanego zdjęcia – surówki nadal brak.

Zacząłem się więc zastanawiać, czy dane Exif są prawidłowe. Przecież rozpoczynając edycję zdjęcia A, a wklejając na płótno zdjęcie B, w Exifie zostaną dane zdjęcia A. Przez chwilę potraktowałem Exif jako fałszywy trop. Podjąłem nawet zupełnie oderwaną od rzeczywistości próbę ustalenia większej ilości szczegółów na temat możliwej daty zrobienia tego zdjęcia – dostrzegłem, że w tle zdjęcia wisi kalendarz. Pomimo tego, że obrobione kopie zdjęcia były w niskiej rozdzielczości, udało się odczytać rok kalendarza – 2008. Niewiele to dało – zdjęcie miało być zrobione w 2009, kalendarz jest z 2008 – nie zawężyło to możliwego zakresu dat.

(w międzyczasie pasek postępu, rzeczonej wcześniej długo trwającej operacji, wolno zmierzał ku 50%, więc nadal miałem sporo czasu na moje analizy).

Analiza innych zdjęć z dni otaczających 10 lipca 2009 potwierdzała, że to zdjęcie mogło być zrobione 10 lipca 2009 – ułożenie przedmiotów w tle się zgadzało. Niestety ostatnie zdjęcie było z 9 lipca, a kolejne dopiero z 12 lipca. Katalog z 9 lipca kończył się na pliku z numerem 86, a katalog z 12 lipca zaczynał się od pliku z numerem 12. To, że w międzyczasie formatowałem kartę i numeracja wyzerowała się jest OK. Ale dlaczego startuje od 12? Czyżby mi brakowało 11 zdjęć? Może właśnie tam jest to zdjęcie, którego szukam. Tyle pytań, a żadnych odpowiedzi.

Uruchomiłem więc stary komputer. Przeszukałem cały dysk, ale na nim kompletnie nie było śladu po tych zdjęciach. No tak – przecież jakiś czas temu skasowałem je z tego komputera, bo były tylko trzecią kopią. Pierwsza i druga kopia były na dwóch dyskach (WD Green oraz WD Red) nowego komputera, zatem nie było sensu trzymać trzeciej kopii.

Ale…. Kopia pierwsza oraz druga (te z nowego komputera) zostały utworzone z danych odczytanych z dysku zewnętrznego Samsung. Dysku, który jak się później okazało był uszkodzony. Jednak zanim się dowiedziałem, że jest uszkodzony używałem go jako backupu. Przez długi czas. W momencie, gdy dysk ten zaczął szwankować nawet się tym nie przejąłem, bo cała jego zawartość była już bezpieczna na dwóch dyskach nowego komputera. Zaraz sami się przekonacie, że było to bardzo złudne poczucie bezpieczeństwa.

Odkładając stary komputer na swoje miejsce do głowy przyszła mi jeszcze jedna myśl – przecież ja kiedyś te zdjęcia nagrałem na płyty! Szybkie przeszukanie archiwów i już mam w dłoni płytę podpisaną 2009.07.10. Czuję specyficzny zapach, charakterystyczny dla płyt. Wkładam krążek DVD do komputera, a napęd powoli rozpędza się. Jak dawno nie słyszałem tego dźwięku. Na płycie są 92 pliki. Plik z numerem 90 to zdjęcie, którego szukałem. Super!

Tylko skąd ta różnica w zawartości katalogów? Teraz wszystko stało się jasne. Pierwszy backup (nagranie zdjęć na płytę) wykonałem jeszcze ze starego komputera. Właśnie na ten komputer przegrywałem wtedy zdjęcia bezpośrednio z aparatu. Za jakiś czas kupiłem dysk zewnętrzny Samsunga i zrobiłem na nim backup zdjęć. Jednocześnie przestałem backupować zdjęcia na płytach. Myślałem, że na dysku zewnętrznym będą bezpieczne. Dysk trzymałem w szufladzie, podłączałem go do komputera tylko, żeby skopiować na niego pliki. Nigdy nie wynosiłem go poza mieszkanie. Teoretycznie więc nic nie mogło mu się stać, wydawał się być pewnym nośnikiem danych.

Jakiś czas później później kupiłem nowy komputer. Jednak dane na nowy komputer nie były przegrywane bezpośrednio ze starego komputera, ani z płyt – tylko z dysku zewnętrznego. Gdy wszystkie pliki leżały bezpiecznie (jak mi się wtedy wydawało) w kilku miejscach na nowym komputerze, sformatowałem stary komputer.

Po jakimś czasie zaczęły się problemy z dyskiem zewnętrznym Samsung. Jego podłączenie czasem zawieszało komputer, bardzo wolno działał, a bywało, że nie dało się odczytać plików. A więc Samsung się zepsuł. Część plików, które były na nim zapisane była wypełniona zerami, a kolejna część plików po prostu zniknęła. Niestety – od czasu powstania tych uszkodzeń, do momentu ich odkrycia minęło sporo czasu. Bo wszystko co skopiowałem z tego dysku na nowy komputer było obciążone wadami – zerami w niektórych plikach lub niepełnymi katalogami. Jednak kopiując te dane na nowy komputer o tym nie wiedziałem – przed sformatowaniem starego komputera nie sprawdziłem checksum katalogów backupów – co było moim błędem. Tak więc backupowałem sobie dalej te uszkodzone pliki i katalogi z brakami, nie wiedząc o tym. Gorsze było to, że losowe sprawdzanie integralności danych (czyli po prostu przeglądanie różnych świeżo skopiowanych plików) nie wykazało, że są problemy. Uszkodzenia był zbyt małe, i wybierając losowe zdjęcia trafiałem zawsze akurat na takie, które dało się otworzyć.

Ostatecznie wszystkie pliki, których brakowało w bieżących kopiach odzyskałem – część z płyt, a część z innych archiwów, takich jak załączniki do maili czy chmury.

Jak wiadomo ludzie dzielą się na dwie grupy: na tych którzy robią backupy oraz na tych którzy będą robić backupy. Jednak jak widać na moim przykładzie samo kopiowanie plików nie zawsze wystarcza. Warto sprawdzać sumy kontrolne wszystkich backupów oraz danych źródłowych. Dane, które leżą na dysku z backupem, mają ten problem, że rzadko do nich sięgamy – bo zwykle korzystamy z danych źródłowych. Mogą się więc uszkodzić, i nawet się o tym nie dowiemy. Robiąc kopię uszkodzonych danych, będziemy żyć w przeświadczeniu o bezpieczeństwie naszych plików, ale będzie to miało dla nas zgubne skutki. Częściowym rozwiązaniem jest więc robienie backupów zawsze tylko z danych źródłowych. Jak widać backup backupu backupu może się nie sprawdzić, jeśli już pierwszy z nich ma wady ukryte.

Obecnie posiadam backup zdjęć w dwóch miejscach, a wszystkie sumy kontrolne są zgodne. Wydaje się więc, że wszystko jest OK. Jednak mimo wszystko zastanawiam się, czy nie zainwestować w kolejny sposób backupu, np. nagrywarkę blu ray. Bo przecież każdy kolejny n backup, zwiększa szanse na odzyskanie danych, jeśli poprzednie n-1 backupów zawiedzie.

Facebooktwittergoogle_plusredditpinterestlinkedinmailFacebooktwittergoogle_plusredditpinterestlinkedinmail

Optymalizacja pracy – wykorzystanie skrótów klawiaturowych

Posted 1 CommentPosted in productivity

Oto trzeci post z cyklu optymalizacji pracy. Dziś poruszę temat wykorzystania skrótów klawiaturowych.
Zdecydowana większość czynności może być wykonana za pomocą skrótów klawiaturowych. Zwalnia nas to z konieczności klikania myszą, dzięki czemu zaoszczędzamy czas. Warto pamiętać, że jednak nie wszystkie narzędzia są przystosowane do tego, aby pracować z nimi za pomocą klawiatury. Na szczęście w przypadku aplikacji dla developerów twórcy oprogramowania nie zapominają o tym jak ważna jest możliwość swobodnej pracy z klawiaturą.

Wszystkie skróty użyte w przykładach dotyczą systemu Windows. Są to jednak na tyle elementarne przykłady, że użytkownicy innych systemów nie powinni mieć problemów z translacją skrótów na ich środowiska pracy,

Zanim przejdziemy dalej, warto wspomnieć o standardowych klawiszach, które z reguły mają takie samo znaczenie w większości aplikacji:

  • Ctrl+C, Ctrl+V, Ctrl+X – czyli kopiuj, wklej i wytnij
  • Page Up, Page Down – przewijanie całych stron
  • Home, End – przeniesienie na początek i koniec (linii, strony, listy), z Ctrl przenosi na początek/koniec dokumentu
  • Enter, Ctrl+Enter – zatwierdzenie – okna dialogowego, pytania
  • Delete – kasowanie znaku na lewo od kursora
  • Tab, Ctrl+Tab – zmiana focusu w formularzu, przełączanie kart (często mylnie nazywanych zakładkami)
  • Esc – anulowanie pytań, wyjście
  • Alt lewy oraz Alt prawy – wspomnę tylko, że mają zupełnie inne znaczenie i to nie jest ten sam klawisz

Klawisze obecnie niewykorzystywane (warto pomyśleć nad przypisaniem do nich własnej funkcji):

  • Scroll lock – znam tylko jedną aplikację, która korzysta z tego klawisza – MS Excel. Służy on tam do blokady przewijania (kursory przewijają akrusz, zamiast przesuwać aktywną komórkę)
  • Pause – ja pod ten klawisz mam przypisaną pauzę w odtwarzaczu muzyki

Domyślam się, że dla większości z was wszystkie te klawisze są doskonale znane, ale nie mogłem ich pominąć. Chociaż z drugiej strony… ciągle spotykam się z nagminnym korzystaniem z myszy zamiast wykorzystania skrótów, nawet dla tak prostych operacji jak kopiowanie, wklejanie czy też zaznaczanie tekstu. Jeśli już jesteśmy przy temacie zaznaczania tekstu – w przypadku kodu, warto skorzystać tutaj z możliwości jakie daje nam IDE. W IntelliJ za pomocą Ctrl(+Shift)+W możemy w bardzo prosty sposób zwiększać (zmniejszać) zaznaczenie kodu w kontekście miejsca, w którym się aktualnie znajdujemy.

Przykład:
Ustawiam się w miejscu edycji – tam, gdzie jest widoczny kursor.
bm1

Naciskam Ctrl+W – zaznaczony zostaje najbliższy wyraz.
bm2

Ponowne naciśnięcie Ctrl+W – zaznaczony zostaje cały napis.
bm3

Naciskam kombinację Ctrl+W nadal – widać, że zaznaczony obszar zwiększa się.
bm4

Jeśli zaznaczyłem zbyt dużo – naciśnięcie Ctrl+Shift+W zmniejszy obszar zaznaczenia o jeden krok.
bm5

Jeżeli nasze ulubione IDE nie posiada tej funkcji – nic straconego. Nadal możemy się sprawnie poruszać po edytorze korzystając z klawiszy Home, End, Page Up, Page Down oraz klawiszy kursora. Oczywiście również w połączeniu z Ctrl i Shift (dla zaznaczania). Ctrl z reguły zwiększa zasięg działania. Przykładowo: Home przenosi na początek linii, Ctrl+Home przenosi na początek pliku. Strzałka w lewo przesuwa się o jeden znak w lewo, a razem z Ctrl przesuwa się o cały wyraz w lewo. Jeśli chodzi o zaznaczanie tekstu, wybieranie elementów z listy, itd – jest jeszcze jedna rzecz – czasem szybciej jest przenieść się na koniec (End lub Page Down) i stamtąd rozpocząć zaznaczanie (Shift + kursory) niż operować od początku.
Przykład: mamy listę, która składa się z 20 elementów, i chcemy zaznaczyć 17 i 18. Dużo szybciej jest nacisnąć Page Down (przeniesie na koniec listy), teraz strzałkę w górę i w odpowiednim momencie Shift, niż strzałką w dół lecieć od początku listy do prawie samego końca. Pamiętajmy – czasem mimo wszystko szybciej będzie zaznaczyć tekst myszką, niż klikać klawiszami. Ale to taki wyjątek od reguły.
Uzytkownicy laptopów będą jeszcze często zmuszeni do nacisnięcia jeszcze jednego klawisza – Fn. Nie wiem dlaczego tylu producentów decyduje się na „ukrycie” podstawowych klawiszy, takich jak Home czy Page Up pod innym klawiszem – tak, że trzeba naciskać Fn aby z nich skorzystać. Co gorsze – zauważyłem trend, że niektóre modele nowych laptopów wcale nie posiadają już Page Up oraz Page Down. Warto zwrócić na to uwagę podczas zakupu nowego sprzętu.

Rozpoznanie skrótów
Nie zawsze jesteśmy skazani na żmudne przeglądanie menu w poszukiwaniu skrótów klawiaturowych. W przypadku IntelliJ warto skorzystać z Ctrl+Shift+A – czyli z okna, które umożliwia dostęp do wszystkiego, jeśli tylko znamy nazwę tego, co chcemy zrobić.

Wpisanie w okno słowa new wyświetli nam wszystkie operacje z tym związane. Widać, że opcja New… (tworząca nowy plik/zasób/itd) ma przypisany skrót Alt+Insert. Niezależnie od tego czy skorzystamy ze skrótu, czy też nie – zawsze można za pomocą klawiszy kursorów podświetlić wybraną opcję i zatwierdzić jej wykonanie klawiszem Enter.
ctrl shift a
Bardzo cenię sobie tę funkcjonalność IntelliJ – nie tylko pomgada odnaleźć skróty, ale umożliwia też szybki dostęp do funkcji, które nie mają skrótów – wystarczy wpisać nazwę, wybrać z listy i Enter. Jest to dużo szybsze rozwiązanie, niż żmudne szukanie danej opcji w menu.

Kolejnym wartym odnotowania dodatkiem jest Key promoter dla IntelliJ (lub MouseFeed dla Eclipse). Jeśli klikniemy myszą na funkcjonalność, dla której istnieje przypisany skrót klawiaturowy – wyświetli się okno informujące o tym, jaki to jest skrót. Świetny sposób na szybką naukę skrótów.
promoter

Zdecydowana większość aplikacji umożliwia przypisywanie własnych skrótów do wybranych czynności. Warto z tego skorzystać.

Istnieje jeszcze jeden sposób na szybkie uzyskanie dostępu (bez użycia myszy) do wybranych czynności, nawet tych głęboko zakopanych w mneu – podkreślone litery. Aby z tego skorzystać, należy nacisnąc lewy Alt, a następnie podkreśloną literę z nazwy menu, do którego chcemy się dostać. Gdy menu się otworzy – znów możemy nacisnąć wybraną podkreśloną literę z teog menu lub po prostu za pomocą kursorów i klawisza enter wybrać żądaną opcję.
podkreslenia

W trosce o naszą efektywność również niektóre aplikacje webowe definiują skróty klawiature, np. Gmail. Zwróćmy na to uwagę i nauczmy się również tych skrótów.

Czasem zdarza się, że po użyciu jakiegoś skrótu, zawsze pojawia się okno z pytaniem (nie można wybrać „Nie pokazuj więcej tego okna”), a co gorsze – okno nie reaguje na klawisz Enter. Ja sobię z tym radzę w następujący sposób – ustawiam kursor myszki na miejscu, gdzie za chwilę pojawi się to okno, a dokładnie w miejscu gdzię będzie przycisk zatwierdzający je. Następnie mogę bez czytania zawartości okna i kładzenia całej ręki na myszce kliknąć jednym palcem (najmniejszym z prawej ręki) lewy przycisk myszy – okno się zamknie, operacja się wykona, a nie musiałem korzystać z myszy w sposób ciągły. Wykonałem tylko jedno kliknięcie jednym palcem. Ma to szczególne zastosowanie do powtarzalnych operacji, gdzie wspomniane problematyczne okno będzie się pojawiać wiele razy, zawsze w tym samym miejscu. Nagrywanie makr również jest bardzo dobrą praktyką – ale znów dochodzimy do tego, że nie każda aplikacja na to pozwala.

Przełączanie aplikacji
Użytkownicy Windowsa mogą skorzystać z opcji przypięcia ulubionych aplikacji do paska zadań.
W moim przypadku klawisz Windows+2 uruchamia Firefoxa, Windows+4 Winampa, a Windows+6 uruchamia konsolę Git Bash.
pasek zadan
Jeśli mamy otwartych wiele okien danej aplikacji – Windows+numer będą cyklicznie pomiędzy nimi przełączać.

Podsumowanie
Korzystanie z klawiatury zamiast myszy pozytywnie wpływa na naszą efektywność. W większości przypadków skraca czas potrzebny na wykonanie danej czynności. Niestety nadal można spotkać aplikacje „odporne” na efektywność, gdzie bez przeklikania myszą przez 1342 okienek i pytań nie damy rady nic zdziałać, gdzie okna dialogowe na Enter dodają niewidoczną linię tekstu w polu jednolinijnym, a klawisz Tab przesuwa kursor poza szerokość tego pola. Zwykle problem dotyczy starych aplikacji, oraz tych napisanych w sposób niechlujny. Jestem zwolennikiem korzystania z klawiatury tam gdzie jest to możliwe i zwiększa to moją produktywność.

Facebooktwittergoogle_plusredditpinterestlinkedinmailFacebooktwittergoogle_plusredditpinterestlinkedinmail

Optymalizacja pracy – pulpit i ekran

Posted Leave a commentPosted in productivity

Pozostając w temacie optymalizacji pracy, warto wspomnieć o organizacji miejsca na pulpicie, lub też ogólnie – na ekranie. Często lekceważonym aspektem jest odpowiednie wykorzystanie powierzchni ekranu. Samo posiadanie monitora o dużej rozdzielczości nie oznacza, że potrafimy umiejętnie wykorzystać jego możliwości. Z drugiej strony – dysponując ekranem o niezbyt dużej rozdzielczości możemy sprawić, aby jego wykorzystanie było efektywniejsze. W dzisiejszym wpisie postaram się pokazać kilka pomysłów na usprawnienia.

Organizacja pojedynczego ekranu
Rozmieszczając okna na ekranie często dochodzi do sytuacji, gdy spora ilość miejsca marnuje się – zwykle po bokach. Problem jest szczególnie widoczny podczas przeglądania stron w sieci, gdzie często po lewej i prawej stronie strony mamy puste, niewypełnione niczym miejsca. Obecnie webdeveloperzy zaczynają pisać strony z uwzględnieniem wykorzystania całej dostępnej powierzchni. Częstym zjawiskiem jest też pisanie strony w taki sposób, aby dynamnicznie dostosowywały się do ekranów różnych rozmiarów – smarftfon, tablet czy też PC. Jako przykład niech posłuży strona javaworld:
javaworld
Łatwo zauważyć, że dużo miejca się marnuje.
Aby sobie z tym radzić warto wypróbować narzędzia typu window layout manager. Służą one do tego, aby w prosty i łatwy sposób zmieniać rozmiar okien, układać je w wyznaczonych miejscach na ekranie oraz przyciągać do krawędzi. Oczywiście wszystko ma największy sens, gdy każdą z tych operacji wykonujemy za pomocą klawiatury – czyli z wykorzystaniem odpowiednich skrótów klawiaturowych. Wykonując tylko klika klinkięć w klawiaturę, bez problemu udało mi się uzyskać efekt jak na obrazku poniżej:
ekran podzielony
Javaworld zajmuje lewą połowę ekranu, a prawa połowa została podzielona na jeszcze dwie części: na górze widzę wpis na blogu, natomiast na dole mogę na bieżąco śledzić wpisy na lbn.sc.
W moim przypadku, podczas codziennej pracy, często lewą część ekranu zajmuje testowana aplikacja webowa, a prawą – output z serwera apliakcji, tail z logów lub inna rzecz, którą chcę śledzić na bieżąco.

Narzędzia: W przypadku większości Linuxów oraz Maców – wszystko jest w standardzie. W Windowsie sprawdza się aplikacja o nazwie WinSplit Revolution. W kontekście Maca, warto wspomnieć także o http://www.irradiatedsoftware.com/sizeup/.

Wiele pulpitów
Kolejnym zagadniemie jest wiele pulpitów. Na każdym z nich możemy mieć otwarte różne aplikacje, zwykle reprezentujące różne konteksty tego, nad czym aktualnie pracujemy. Sens stosowania wielu pulpitów jest widoczny szczególnie wtedy, gdy nasza codzienna praca wymaga posiadania dużej liczby aplikacji otwartych jednocześnie. Wtedy zamiast żmudnego przełączania się pomiędzy aplikacjami (alt+tab) możemy zmieniać całe pulpity (czyli konteksty naszej pracy). Przykładowo: na pierwszym pulpicie uruchamiamy IDE, na drugim przeglądarkę (do testowania naszej aplikacji webowej) która dzieli ekran z tailem z logów, na trzecim program pocztowy, a na czwartym kolejną przeglądarkę (tym razem wykorzystywaną w celach researchowych, np. stack overflow). Przykład:
virtua win
Mając do dyspozycji jeden ekran fizyczny, otrzymujemy wiele ekranów wirtualnych. Coś jak screen w terminalu 😉 Ja pracuję zwykle na 4 takich ekranach, ale nic nie stoi na przeszkodzie aby skonfigurować ich więcej. Oczywiście cała obsługa tego typu narzędzi może odbywać się za pomocą klawiatury – do czego zachęcam.

Narzędzia: Podobnie jak w poprzednim przypadku: dla większości Linuxów oraz Maców – wszystko jest w standardzie, dla Windowsa trzeba skorzystać z dodatkowej aplikacji (np. VirtuaWin).

Wiele ekranów
Każdy dodatkowy monitor zwiększa fizyczną ilość miejsca na ekranie. W połączeniu z menedżerami okien oraz wieloma puplitami rezultaty mogą być naprawdę imponujące. Drugi monitor wymaga jednak od nas poświęcenia nieco więcej uwagi, przynajmniej na początku. Dużo więcej dzieje się na ekranie. Po pewnym czasie docenimy jednak dodatkową powierzchnię pracy. Wtedy na stałe możemy widzieć IDE, i inne wymagane do pracy narzędzia. Dodatkowy monitor sprawdza się nawet jeśli nie jesteśmy programistami czy też administratorami – docenią go także osoby, które piszą wiele maili, czy też po prostu dużo pracują z komputerem. Każda chwila zaoszczędzona na braku konieczności przełączania się pomiędzy oknami może zostać spożytkowana w bardziej efektywny sposób.

IDE
Poniżej widać ekran, który pojawia się przy pierwszym starcie środowiska Eclipse:
eclipse by default
Po prawej stronie jest widok „Welcome” – zajmuje sporo miejsca. Jeśli nie będziemy z niego korzystać – zamknijmy go. Tak samo zróbmy z każdym innym widokiem, którego nie musimy widzieć przez cały czas.
W przypadku IntelliJ do szybkiego pokazywania/ukrywania widoków korzystamy ze skrótów postaci ALT+1, ALT+2, itp. Oczywiście zawsze możemy skorzystać też z CTRL+SHIFT+A, a następnie wpisać nazwę widoku, który nas interesuje. Jak widać na poniższym obrazku: ALT+1 steruje widoczością „Project”, natomiast ALT+7 steruje widocznością „Structure”:
ij alt 1
W Eclipse za pomocą „ALT+SHIFT+Q, Q” możemy pokazać widok, który nas interesuje. Warto zaznaczyć, że od razu po pokazaniu się okna focus jest ustawiony na polu do wpisania nazwy widoku. Można więc od razu zacząć wpisywać żądany widok i zatwierdzić enterem.
eclipse alt shift q q
Dalej korzytając z ALT(+SHIFT)+F7 możemy przełączać focus w przód/tył pomiędzy poszczególnymi widokami:eclipse ctrl f7
Skonfigurujmy IDE tak, abyśmy widzieli tylko to, co jest nam naprawdę potrzebne. Fakt, że cała szerokość panoraminczego ekranu to przesada jeśli chodzi o długość linii kodu, ale zoszczędzone miejsce można spożytkować inaczej, np. do wyświetlania outline klasy czy struktury projektu.

Podsumowanie
Umiejętne korzystanie z powyższych narzędzi połączone z odrobiną wprawy zdecydownaie poprawi nasze możliwości. Menedżery układu okien oraz wiele pulpitów docenią szczególnie posiadacze laptopów, którzy często pracują w miejscach, gdzie nie można postawić drugiego monitora. Jednak niezależnie od tego czy mamy netbooka, laptopa czy desktopa z wieloma monitorami – zawsze warto poświęcić chwilę na konfigurację i wykorzystanie powyższych narzędzi. Z pewnością każdy ma inne upodobania i inne zdanie na temat tego co chce widzieć akurat w danej chwili na ekranie. Zaryzukuję jednak stwierdzenie, że w zdecydowanej większości przypadków problemem nie jest brak miejsca na ekranie – problemem jest to, że nie umiemy odpowiednio zagospodarować naszego miejsca pracy. Ciągłe przełączanie kontekstów (aplikacji) powoduje spadek wydajności, zmniejsza naszą produktywność. Dbajmy więc o takie organizowanie powierzchni ekranów, aby sprzyjały większej efektywności pracy. To pozwoli nam zaoszczędzić czas, który poświęcimy na napisanie kolejnych linii dobrego kodu pokrytego testami :)

Facebooktwittergoogle_plusredditpinterestlinkedinmailFacebooktwittergoogle_plusredditpinterestlinkedinmail

Optymalizacja pracy – bash

Posted Leave a commentPosted in bash

Pomimo tego, że na codzień korzystam z IntelliJ, to jednak do wykonywania buildów, obsługi GITa i kilku innych czynności używam basha. Jest to dla mnie znacznie wygodniejsze rozwiązanie, szczególnie biorąc pod uwagę moje zamiłowanie do korzystania z samej klawiatury dopóki to jest możliwe. Używanie myszki to osteczność :) Warto poświęcić chwilę, na zdefiniowanie aliasów do czynności, które wykonujemy najczęściej.

Tak więc – jeśli korzystasz z mavena pomocne będą napewno:
alias mci='mvn clean install'
alias mcist='mci -DskipTests'
alias mcp='mvn clean package'
alias mp='mvn package'
alias mvc='mvn clean'
alias mmt='mvn clean package org.pitest:pitest-maven:mutationCoverage'

Ostatnia opcja to odpalenie testów mutacyjnych. A co to są testy mutacyjne? Do czego służą i jak ich używać? O tym wszystkim możesz posłuchać na moim talku, link: http://www.youtube.com/watch?v=gMFNV1zeVmQ. Prezentacja odbyła się w ramach grupy lbn.sc, do której zapraszam.

Kolejne aliasy, zaciekawią wszystkich użytkowników GITa. W mojej ocenie wsparcie IntelliJ dla GITa nieco kuleje. W IJ moja praca GITem ogranicza się do przeglądania historii pliku. Pozostałe komendy wolę wykonywać z basha. Oto gitowe aliasy:
alias gl='git log --graph --pretty=format:"%h - %d %s (%cr) " --abbrev-commit'
alias glg='git log --graph --pretty=format:"%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue reverse)%Creset" --abbrev-commit'
alias gap='git add --patch'
alias gc='git checkout'
alias gs='git status'
alias gp='git pull'

Bardzo często korzystam z glg które w szybki sposób pozwala sprawdzić historię gałęzi:
glg

Mam również zdefiniowane aliasy cc, ci, cj, ce itp, które przenoszą mnie bezpośrednio do katalogu danego projektu. Wtedy zamiast pisac cd dluga/sciezka/do/projektu piszę tylko ci i już jestem w odpowiednim katalogu.

Kolejną rzeczą (i ostatnią na dziś) którą mam zdefiniowanym w swoim ~/.bash_profile jest kolorowanie outputu mavena. Bardzo wygodne, przydatne i do tego świetnie wygląda 😉
# thanks to: http://blog.blindgaenger.net/colorize_maven_output.html
# Colorize Maven Output
alias maven="command mvn"
color_maven() {
maven $* | sed -e 's/Tests run: ([^,]*), Failures: ([^,]*), Errors: ([^,]*), Skipped: ([^,]*)/Tests run: 1, Failures: 2, Errors: 3, Skipped: 4/g'
-e 's/([WARN].*)/1/g'
-e 's/(WARN.*)/1/g'
-e 's/([INFO].*)/1/g'
-e 's/([ERROR].*)/1/g'
-e 's/(BUILD FAILURE.*)/1/g'
-e 's/(FAILURE!.*)/1/g'
-e 's/(BUILD SUCCESS.*)/1/g'
-e 's/(SUCCESS.*)/1/g'

}
alias mvn=color_maven

Nieudany build:
build-fail

Udany build:
build-success

Będąc w temacie optymalizacji pracy koniecznie muszę wspomnieć o wykorzystaniu potęgi skrótów klawiszowych, której wiele osób niedocenia. Ale to dosyć obszerny temat, któremu poświęcony zostanie odrębny wpis :)

Facebooktwittergoogle_plusredditpinterestlinkedinmailFacebooktwittergoogle_plusredditpinterestlinkedinmail

Krótka historia o GlassFish4 i BeanManager

Posted Leave a commentPosted in java

W aplikacji Java EE6, nad którą pracuję, wykorzystuję CQRS. W związku z tym korzystam z dosyć rozbudowanej floty Commandów i Handlerów. Aplikacja na starcie wyszukuje wszystkie Handlery i zapisuje mapowanie Command na Handler. Aby uzyskać listę wszystkich handlerów korzystam z BeanManagera. Samo pozyskanie instancji BeanManagera odbywa się w następujący sposób:

Gdy mamy już BeanManagera możemy przejść do sedna sprawy. Oto CommandHandler:

Sama rejestracja handlerów wygląda w ten sposób:

Kod bez problemów działał na JBossie oraz Resinie. Po przesiadce na GlassFisha 4 zaczęły się schody – metoda getBeans zaczęła zwracać pusty zbiór. Korzystanie z aplikacji stało się niemożliwe, gdyż nie działało nawet logowanie. Musiałem więc przyjrzeć się temu kodowi bliżej.

Klasa LoginHandler implementuje CommandHandler. Dodatkowo pamiętamy, że początkiem wszystkiego w Javie jest klasa Object, tak więc mamy taką oto hierarchię:

Posiłkując się IntelliJ oraz debugiem za pomocą getBeans(Object.class) uzyskałem dostęp do wszystkich zarejestrowanych beanów. Na tej liście znalazłem także moje problematyczne beany.

Zagłębiając się w problem natrafiłem na to, że metoda getTypes() rzeczonego handlera zwraca 3 wartości:

debug-pt1

Pomimo obecności CommandHandler na pozycji pierwszej, nie jest ona brana pod uwagę podczas wołania beanManager.getBeans(CommandHandler.class). Wynika to z tego, że CommandHandler przyjmuje typy generyczne, a GlassFish4 inaczej niż JBoss i Resin traktuje takie klasy.

Rozwiązanie, które udało mi się znaleźć to wprowadzenie typu nadrzędnego (bez generyków) wobec CommandHandler.

h2

Teraz należało jeszcze zmodyfikować metodę odnajdującą handlery:

I wszystko działa jak należy.

Facebooktwittergoogle_plusredditpinterestlinkedinmailFacebooktwittergoogle_plusredditpinterestlinkedinmail