Oto nowy adres mojego bloga: lockup.eu/blog
Zapraszam 🙂
Oto nowy adres mojego bloga: lockup.eu/blog
Zapraszam 🙂
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.
Poniżej znajduje się link, który umożliwia pobranie mojej prezentacji “Efektywne programowanie z wykorzystaniem Scali”. Prezentacja odbyła się 6 maja 2014 w ramach Lubelskich Dni Informatyki 2014.
Link do pobrania pliku PDF z prezentacją: http://goo.gl/Ljm29Z
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:
Klawisze obecnie niewykorzystywane (warto pomyśleć nad przypisaniem do nich własnej funkcji):
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.

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

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

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

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

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.

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.

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ę.

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.

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ść.
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:

Ł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:

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:

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:

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”:

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.

Dalej korzytając z ALT(+SHIFT)+F7 możemy przełączać focus w przód/tył pomiędzy poszczególnymi widokami:
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 🙂
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:

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: \([^,]*\)/[1;32mTests run: \1[0m, Failures: [1;31m\2[0m, Errors: [1;33m\3[0m, Skipped: [1;34m\4[0m/g' \
-e 's/\(\[WARN\].*\)/[1;33m\1[0m/g' \
-e 's/\(WARN.*\)/[0;33m\1[0m/g' \
-e 's/\(\[INFO\].*\)/[1;32m\1[0m/g' \
-e 's/\(\[ERROR\].*\)/[1;31m\1[0m/g' \
-e 's/\(BUILD FAILURE.*\)/[1;31m\1[0m/g' \
-e 's/\(FAILURE!.*\)/[1;31m\1[0m/g' \
-e 's/\(BUILD SUCCESS.*\)/[1;37m\1[0m/g' \
-e 's/\(SUCCESS.*\)/[1;37m\1[0m/g'
}
alias mvn=color_maven
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 🙂
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:
| object BeanManagerProvider { | |
| def retrieve(): BeanManager = { | |
| val initialContext = new InitialContext | |
| initialContext.lookup("java:comp/BeanManager").asInstanceOf[BeanManager] | |
| } | |
| } |
Gdy mamy już BeanManagera możemy przejść do sedna sprawy. Oto CommandHandler:
| public interface CommandHandler<COMMAND, RESULT> { | |
| RESULT handle(COMMAND command); | |
| } |
Sama rejestracja handlerów wygląda w ten sposób:
| @PostConstruct | |
| public void initHandlerMap() { | |
| BeanManager beanManager = BeanManagerProvider.retrieve(); | |
| Set<Bean<?>> allHandlers = beanManager.getBeans(CommandHandler.class); | |
| for (Bean<?> bean : allHandlers) { | |
| Class<?> handlerClass = bean.getBeanClass(); | |
| handlers.put(getHandledCommandType(handlerClass), bean.getName()); | |
| } | |
| } |
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:
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.
Teraz należało jeszcze zmodyfikować metodę odnajdującą handlery:
| @PostConstruct | |
| public void initHandlerMap() { | |
| BeanManager beanManager = BeanManagerProvider.retrieve(); | |
| Set<Bean<?>> allHandlers = beanManager.getBeans(GenericCommandHandler.class); | |
| for (Bean<?> bean : allHandlers) { | |
| Class<?> handlerClass = bean.getBeanClass(); | |
| Class<?> handledCommandType = getHandledCommandType(handlerClass); | |
| handlers.put(handledCommandType, bean.getName()); | |
| } | |
| } |
I wszystko działa jak należy.