Pokazywanie postów oznaczonych etykietą LaTeX. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą LaTeX. Pokaż wszystkie posty

piątek, 30 marca 2012

Nowa ksiazka o testowaniu jednostkowym


Dnia 28 marca 2012 pojawiła sie oficjalnie książka: Practical Unit Testing with TestNG and Mockito napisana przez Tomka Kaczanowskiego. Wspominałem w jednym z poprzednich wpisów (na temat testowania wyjatków), że ta książka nadchodzi. Już oficjalnie jest dostępna do kupienia na practicalunittesting.com do czego zachecam.

Dlaczego o tym pisze?

Powodów jest kilka.

Po pierwsze jest to książka polskiego autora (co prawda po angielsku, ale spolszczenie jest w przygotowaniu), a tych należy wspierać. Łatwiej (podobno) jest napisać książkę techniczną po angielsku i później ją przetłumaczyć na nasze, niż pisać po polsku i później się męczyć.

Po drugie jest to kompletny, uporządkowany i aktualny zbiór technik z przykładami, jak pisać dobre testy. Książka wyjaśnia wszelkie wątpliwości związane z nazewnictwem, konwencjami i dobrymi praktykami, jak i daje wiele cennych wskazówek.

Dla kogo jest ta książka?

Książka jest bardzo dobra dla osób, które chcą właśnie zacząć pisać testy jednostkowe do swojego kodu i nie wiedzą jak wystartować. Książka wprowadza krok po korku do lepszego świata kodu pokrytego testami. Również dla startych wyjadaczy znajdzie się sporo cennych informacji. Dalsze rozdziały książki omawiają zaawansowane zagadnienia ze świata testowania. Tomek wskazuje również dobre praktyki jak pisać testy, a także prezentuje narzędzia powiązane z nimi(jak catch-exception czy testy mutacyjne).

Dlaczego więc się wypowiadam o tej książce, skoro dopiero co się ukazała?

Dobra, dość tej krypto reklamy, czas na konkrety ;)

Powodem dla którego piszę na blogu o tej książce, jest fakt, że brałem udział w jej powstawaniu. Mianowicie robiłem korektę (review) książki, za co dostałem podziękowania uwiecznione na jednej ze stron w książce:
In various different ways a number of people have helped me with writing this book – some by giving feedback, others by comforting me in times of doubt.
Marcin Stachniuk was the first person to offer to review the book in the early stages of its being written, and at the same time the most persistent of my reviewers. He read every part of the book and gallantly overcame the obstacles I frequently put in his way: frequent releases, constant juggling of the contents, minor piecemeal adjustments, etc.
Nadszedł teraz czas podzielenia się moimi wrażeniami ze wspólnej pracy z autorem.

Wszystko zaczęło się na konferencji GeeCON 2011 w Krakowie, Podczas (za)ostatniego dnia konferencji (tzw. Community Day) Tomek miał swoją prezentację pt.: Who watches the watchmen? - on quality of tests. Na prezentacji trochę się wynudziłem, gdyż otarłem się już o większość omawianych tam zagadnień. Pod koniec jednak prelegent pochwalił się, że właśnie pisze książkę o testach. Wówczas jeden z uczestników (nazwisko do wiadomości redakcji) zaproponował, że chętnie by zrobił review jego książki. Bardzo zaciekawiła mnie ta inicjatywa, i mimo iż wszyscy już wychodzili z sali, zostałem chwilę dłużej, aby przysłuchać się rozmowie na temat recenzowania książki.

Tomek zaproponował aby chętni się do niego zgłosili mail’owo, aby ustalić szczegóły współpracy.  I tak to się zaczęło. Stwierdziliśmy, że najlepszą formą wymiany informacji będzie założona na Google prywatna grupa dyskusyjna, poprzez którą Tomek będzie podsyłać nowe wersje książki. Tym kanałem można również podyskutować i wyjaśnić ewentualne kwestie sporne. Rozwiązanie to sprawdziło się.

Preferowanym sposobem zgłaszania uwag, było odsyłanie aktualnego pdf’a ze wstawionymi komentarzami w teksie, w formie żółtych karteczek. Funkcjonalność taką daje nam Foxit Reader. Dzięki temu Tomek widział dokładnie, którego miejsca dotyczy uwaga. Było to również wygodne dla mnie, gdyż fragmenty czytałem na ekranie komputera. Niektórzy zgłaszali swoje uwagi w postaci wiadomości na grupie, ale dla mnie żółte karteczki i tak były lepsze, gdyż dokładniej wskazywały miejsce, gdzie jest coś nie tak.

Na podstawie e-maili naliczyłem jakieś 20 „release’ów” książki, tzn. fragmentów, które Tomek podsyłał do korekty. Początkowo przychodziły pojedyncze rozdziały do czytania, ale lepszym wyjściem, jak się później okazało, było podsyłanie całości. Dzięki temu nie było rozdziałów wyrwanych z kontekstu i było widać ogólnego zarys całości książki, w którą stronę ona dąży.

Koleje wersje pojawiały się z różną częstotliwością. Czasem było kilka w tygodniu, a czasem była cisza przez dłuższy czas. Ale to już była kwestia Tomka jak sobie organizuje pracę nad książką. Ze swojej strony mogę powiedzieć, że często nowe wersje się pojawiały, jak akurat mocno byłem zajęty innymi sprawami i niemiałem możliwości aby usiąść od razu do lektury. Kilka razy dogoniła mnie kolejna wersja i wtedy już trzeba było się zmobilizować i przeczytać to co tam Tomek naskrobał :)

Co do zgłaszanych uwag, to Tomek zazwyczaj je akceptował. Jak nie widziałem poprawy w następnej wersji, to początkowo się czepiałem, że moje sugestie są nieuwzględniane, ale w późniejszym czasie doszedłem do wniosku, że nie powinienem się tym przejmować. W końcu to książka Tomka i Jego koncepcja, a nie moja. Jedynie sprawy edytorsko/estetyczne (zła czcionka, rozjeżdżające się tabelki) były dla mnie bardzo irytujące, ale to chyba przez spędzenie dawniej sporej ilości czasu z LaTeX’em. Tomek postanowił zostawić to sobie na sam koniec, przez co ciągle widziałem te niedoskonałości. To była chyba jedyna pierdółka, która mi troszkę przeszkadzała w naszej współpracy.

Moje zaangażowanie zostało wynagrodzone cytowanymi wyżej podziękowaniami w książce (Dzięki Tomek!). Właściwie to nie nawet nie ustaliliśmy szczegółów współpracy, tzn. co ewentualnie będę z tego miał. Do samego końca nie wiedziałem nawet, czy pojawią się te podziękowania w książce (po cichu na nie liczyłem). W końcu w jednej z ostatnich wersji książki zobaczyłem, że są :) Świadczy to o tym, że moje zaangażowanie było kompletnie non-profit.

Podsumowując współpracę cieszę się, że wziąłem udział w tym przedsięwzięciu. Było to bardzo ciekawe doświadczenie i mogłem przez to poznać proces powstawania książki. Robienie review sprawia wielka frajdę, czego zwieńczeniem jest oczywiście ukazanie się książki „na produkcji”. Szczerze polecam każdemu zaangażowanie się w tego typu akcję.


Btw. Co do relacji z 33 degree (kilka osób już o nią pytało), to musi ona jeszcze poczekać kilka dni, z powodu natłoku innych zajęć (w tym korekty ostatecznej wersji książki Tomka), jak i obecnych sporych zmian życiowych.

czwartek, 9 września 2010

Czysta strona w prezentacji i problem ostatniego slajdu

Trochę znajomych osób trochę narzeka na mnie ostatnio, że nic nowego na blogu nie piszę. Cóż trzeba się trochę poprawić, mimo niezbyt dużej ilości wolnego czasu ostatnio. Przygotowałem więc krótki wpis na temat tego, z czym się ostatnio męczyłem.

Tworząc prezentację z wykorzystaniem systemu składu tekstu LaTeX, a dokładniej pakietu beamer, wykorzystujemy zazwyczaj jeden ze zdefiniowanych szablonów wyglądu prezentacji. Powoduje to, że nagłówek, stopka i inne jeszcze elementy w całej prezentacji będą wyglądać tak samo. Chcąc zmienić wygląd naszej prezentacji wystarczy modyfikacja jednej linijki (ewentualnie dwóch) w preambule dokumentu i już całkowicie zmienia się nam wygląd prezentacji. Tabelę jakie są dostępne szablony prezentacji można zobaczyć tutaj: http://www.hartwork.org/beamer-theme-matrix/. Nic oczywiście nie stoi na przeszkodzie aby zdefiniować sobie własny szablon, ale to nie temat na dziś.

Ostatnio potrzebowałem, aby jeden slajd prezentacji wyglądał zupełnie inaczej niż reszta. Nie jest to może eleganckie rozwiązanie, gdyż prezentacje - techniczne zwłaszcza - powinny trzymać się jednego szablonu / wyglądu. Ale czasem chcemy cos bardzo podkreślić i potrzebujemy wtedy jednego innego slajdu.

Jak to osiągnąć? Najpierw pozbądźmy się nagłówka, loga i stopki z prezentacji. Można to wykonać w następujący sposób:



lub jak kto woli:



Dzięki temu zabiegowi (użyciu [plain]) otrzymujemy jeden pusty slajd. No dobra niby ładnie, pięknie, ale jak korzystamy z szablonu, który wstawia navigation bar, to wówczas na slajdzie jest on dalej widoczny. Czym jest ten navigation bar? A no jest to zbiór pewnych przycisków, umieszczanych na slajdach, najczęściej w prawym dolnym rogu. Umożliwiają one nawigację po slajdach, ale są raczej rzadko używane i mają dlatego mało kontrastowy kolor. Przykład takiego paska zamieszczam poniżej (celowo na czarnym tle):


Jak się tego pozbyć? Przykład poniżej:



Rozwiązanie to zaproponował mi Marcin M. (nazwisko znane redakcji), za co serdecznie dziękuję. Co prawda nie spotkałem się z szablonem który miałby tego navigationbar’a ustawionego pionowo (można sobie samemu takiego zrobić za pomocą opcji [vertical]), ale jednak tą ostatnią linijkę lepiej jest zamienić na przywrócenie domyślnych ustawień:



Działa? Działa! Dzięki tym zabiegom otrzymaliśmy pusty slajd. No dobra, ale co nam po pustym slajdzie? Zmieńmy kolor tła:



Komendy te możemy wstawiać pomiędzy slajdami, manipulując przez to tym jak mają wyglądać.

To tyle jeśli chodzi o modyfikację pojedynczego slajdu (lub grupy slajdów) w prezentacji. Jeśli chodzi o inne kolorowanie tekstu na takim slajdzie to zamiast edytować kolory szablonu, lepiej zadeklarować kolor danego tekstu, za pomocą \textcolor.

Chciałem jeszcze opisać problem ostatniego slajdu w prezentacji. Otóż zalecane jest, aby pierwszy i ostatni slajd był taki sam (gdyby się komuś przysnęło na prezentacji, to aby wiedział za co brawa biją ;) ). Czasem jednak pierwszy i ostatni slajd mogą powodować figle już na samej prezentacji. Jako przykład, z życia wzięty, przytoczę historię jaka się przytrafiła Jackowi Laskowskiemu na konferencji 4Developers, opisaną we wpisie: Ochy i echy z piątkowego 4Developers w Poznaniu. Otóż byłem na tej prezentacji i Jacek chce zaczynać, a tu nie może się przełączyć na drugi slajd. Chwila napięcia i „atmosfera gęstnieje”. Na szczęście ktoś z sali zauważył że jest to ostatni slajd a nie pierwszy.

Mi dzisiaj do głowy przyszło, że ok - pierwszy i ostatni slajd powinny wyglądać tak samo - ale pod koniec wystąpienia zazwyczaj się dziękuje za uwagę. Czy jest na to potrzebny osobny slajd? Pomyślałem, że na ostatnim tytułowym slajdzie, można by było od razu podziękować za uwagę. Czy jest to możliwe do zrealizowania w beamer’ze? Po chwili kombinowania okazało się ze tak.

Stronę tytułową wstawiamy w prezentacji za pomocą polecenia \titlepage. Jest ono generowane automatycznie według danego schematu wyglądu prezentacji. Chcą mieć wpływ na to co znajdzie się na prezentacji, w preambule wywołujemy następujące polecenia (nie musimy wszystkich):



Polecenia te zazwyczaj umieszczamy w preambule dokumentu, ale nic nie stoi na przeszkodzie aby później je przedefiniować. Aby wyświetlić ostatnią stronę prezentacji taką jak pierwszą z małą modyfikacją możemy to zrobić następująco:



Przykładowy efekt poniżej:



Jakby komuś przeszkadzało, ze na końcowym slajdzie tytuł jest trochę wyżej, to w preambule może dodać polecenie:



Dzięki temu tekst na pierwszym slajdzie nie będzie widoczny (bo będzie w kolorze tła), ale pozycje pozostałych elementów zostaną wyliczone tak, jakby był ten tekst wyświetlany.

To już koniec na dzisiaj. Mam nadzieję, że moje wywody się komuś przydadzą...

piątek, 27 sierpnia 2010

Kolorowanie składni Javy w systemie LaTeX

Dzisiaj opiszę trochę o środowisku lstlisting w systemie składu tekstu LaTeX. Czemu chcę o tym napisać? Ponieważ ten temat do mnie co chwile wraca. Nie wystarcza mi raz skonfigurowane i użyte środowisko, tylko co jakiś czas musze coś w nim zmodyfikować i wykorzystać gdzieś indziej. Innymi słowy chciałbym sobie zrobić małą ściągawkę na blogu, dotyczącą tego pakietu, bo ciągłe przeszukiwanie dokumentacji - co znaczą poszczególne opcje - zaczęło mnie już irytować.

Chcąc ładnie wyświetlić kod w naszym dokumencie, składanym przy użyciu systemu LaTeX, musimy dołączyć w preambule pakiet listings. Najczęściej zaraz pod nim następuje konfiguracja pakietu:



Następnie będzie można już korzystać z prostego otoczenia do wstawiania kodu:



W nawiasach kwadratowych można przedefiniować niektóre ustawienia dostępne w lstset, dodać etykietę i treść podpisu. Zmiany te będą aktywne dla danego listingu kodu.

Odmiennym sposobem wstawienia kodu może być dołączenie go bezpośrednio z pliku zewnętrznego:



I tutaj w nawiasach kwadratowych można przedefiniować odpowiednie parametry.

Poniżej najważniejsze i najciekawsze parametry lstset:

language - Wybór języka programowania z którego korzystamy. W przypadku Javy mamy dostępny dialekt AspectJ, który możemy użyć następująco: language=[AspectJ]Java.
basicstyle - Ogólny styl kodu, np. \footnotesize \small \scriptsize itp. Gdzieś wyczytałem / usłyszałem, że kod powinien być trochę mniejszą czcionką pisany od reszty tekstu.
aboveskip - Odstęp nad kodem.
belowskip - Odstęp pod kodem.
showspaces - Wyświetlanie znaku spacji (jako pokreślenie). Domyślnie wyłączone.
showstringspaces - Wyświetlanie znaku spacji (jako pokreślenie) ale w tekstach (Stringach). Domyślnie włączone, więc warto ustawić na false.
showtabs - Wyświetlanie znaku pokreślenia w miejscach występowania tabulatora.
tab - Możemy zdefiniować, co będzie wyświetlane jako znak tabulacji. Wymaga showtabs=true.
prebreak - Wyświetlanie znaku na końcu linii tekstu, która musi być złamana.
postbreak - Wyświetlanie znaku na początku linii, która została złamana.
breakindent - Wielkość wcięcia złamanej linii.
frame - Ramka dookoła listingu. Możliwe wartości: none, leftline, topline, bottomline, lines(linia na dole i górze) , single (pojedyncza ramka), shadowbox (ramka z cieniem).
identifierstyle - Styl identyfikatorów (zmiennych).
commentstyle - Styl komentarzy.
stringstyle - Styl napisów.
keywordstyle - Styl słów kluczowych.
numbers - Położenie numerów linii. Możliwe wartości: none, left, right.
stepnumber - O ile linijek ma się wyświetlać numer linii. Domyślnie 1.
numberstyle - Styl numerków.
numberblanklines - Jeśli false to puste linie nie mają numerków, domyślnie true.
numbersep - Odległość między numerem a listingiem.
captionpos - Pozycja podpisu listingu. Możliwe wartości t (top) i/lub (bottom).
gobble - Liczba początkowych znaków w kodzie, która ma być ignorowana. Tzn. jak wklejamy kod, który zawsze się zaczyna od dwóch spacji, to możemy je, za pomocą tego parametru, zignorować
escapeinside - Definiuje znaki pomiędzy którymi, można wstawić dodatkowy komentarz wewnątrz kodu. Użyte w ten sposób: escapeinside="" powodowało mi kiedyś, że nie chciał odpowiednio cudzysłowów wyświetlać.

Czasami użycie niektórych parametrów może wymagać dołączenia dodatkowych pakietów przed definicją.

Poniżej zamieszczam przykładowy kod który będę próbował ładnie wyświetlić:



Dobra teraz pokażę kilka konkretnych przykładów zastosowania tego co dotychczas opisałem. Na początek ustawienia zaproponowane przez mojego przyjaciela Tomka:



A oto efekt:

No kod został bardzo ładnie pomalowany. Wszystkie słowa kluczowe zostały ładnie wyłapane i pomalowane na niebiesko. Komentarze również zostały ładnie wyróżnione niezależnie od tego w jaki sposób zostały zadeklarowane. Podpis rysunku uzyskano przy pomocy dodatkowego parametru dla danego listingu:



Jakby się przyjrzeć bardziej temu listingowi to można jednak zobaczyć mały mankament. Otóż długa linijka tekstu została automatycznie złamana przez system składu. Spowodowało to jednak to, że obramowanie pomiędzy liniami 11 a 12 zmieniło kolor na kolor tekstu. Nie wiem czym to jest dokładniej spowodowane, ale podejrzewam komendę \raisebox użytą przy prebreak. Jak ktoś wie skąd to się bierze, to chętnie poznam rozwiązanie. Niby można wyłączyć łamanie linii za pomocą breaklines=false ale to spowoduje, że tekst wyjdzie po za obszar ramki.

Jak dla mnie ustawienia te nie są idealne. W swojej pracy magisterskiej zrezygnuję z ramki i kolorów. Dlaczego? Gdyż będę musiał wtedy część stron wydrukować na kolorowej drukarce a takiej nie posiadam. Może to spowodować, że marginesy stron pochodzących z różnych źródeł, nie będą dokładnie do siebie pasowały (z powodu innych obszarów drukowania w różnych drukarkach). Dlatego wolę uniknąć kolorowych stron w swojej pracy.

Poniżej zamieszczam mój zestaw ustawień:



Dają one następujący efekt:


Już nie wygląda tak ładnie, ale nie jest też tragicznie. Można się dziwić czemu nie wyrzuciłem z kodu definicji keywordstyle, commentstyle i stringstyle tylko ustawiłem w nich kolor na czarny? A no po to, aby krój czcionki mi się nie zmienił :)

Dobra teraz chciałbym pokazać takie ustawienia, aby składnia kodu wyglądała tak jak w NetBeans’ie:



Efekt poniżej:

Nie jest to do końca tak jak bym sobie tego życzył. NetBeans dodatkowo nazwę klasy i metody testSetId wyświetla czcionką pogrubioną. A metoda assertEquals jest czcionką pochyloną pisana, ze względu że jest to metoda statyczna. Szukałem sposobu w jaki to zrobić, ale lstlisting po za słowami kluczowymi, komentarzami i string’ami nic więcej nie rozróżnia…

Ale można, jakby dodefiniować nowe słowa kluczowe i zastosować dla nich oddzielny styl. Z tym że jeśli chodzi o nazwy klas i metod, to warto te ustawienia jednorazowo dla konkretnego listingu stosować. Przykład poniżej:



Efekt poniżej:


Uff udało się. Nazwa klasy i metody są już pisane pogrubioną czcionką. Również metoda assertEquals zaczęła być wyświetlana kursywą. A co ja takiego zrobiłem? Najpierw zdefiniowałem nowy classoffset o numerze 1. Następnie zdecydowałem jakie słowa kluczowe należą do tego zestawu (morekeywords) i jak mają wyglądać (keywordstyle). Następnie czynność powtórzyłem dla assertEquals nadając jej inny styl. Może da się to jakoś bardziej uniwersalnie zrobić, ale tego już nie wiem.

Na koniec podam jeszcze kilka ciekawych sztuczek. Gdybyśmy chcieli zmienić numerowanie linii musimy przedefiniować polecenie \thelstnumber. Np. chcąc wyświetlać dwukropek po numerze linii musimy po definicji \lstset dodać poniższą linijkę:



Chcąc zrobić np. na końcu dokumentu spis wszystkich listingów użytych w dokumencie wystarczy wydać komendę:



Aby zmienić nagłówek dodawany przez to polecenie piszemy w preambule:



Chcąc zmienić nazwę Listing dokładaną do każdego listingu możemy zastosować nastepującą instrukcję w preambule:



I jeszcze numerowanie listingów. Chcąc je numerować według numeru rozdziału i numeru który to rysunek w danym rozdziale piszemy (najlepiej w jednej linijce):



Definicję tę umieszczamy za \begin{document}! Dodatkowo trzeba przedefiniować section (w premabule):



Co ciekawsze jak kilka razy w ramach \lstset zdefiniujemy pewne wartości to zostaną wybrane te położone dalej. Dlatego czasem jak nam nie chcą działać pewne zmiany to sprawdźmy czy nie mamy duplikatów. Ja trochę czasu w ten sposób straciłem.

Ponadto trzeba kolejne ustawienia wartości rozdzielać przecinkiem (nie stawiamy go po ostatnim parametrze). Inaczej nie wszystkie parametry zostaną dobrze skwalifikowane. Podobnie możemy mieć ustawione parametry które nie istnieją, a kod i tak się będzie kompilował :)

I jeszcze uwaga jeśli chodzi o umieszczanie listingów kodu na prezentacjach z użyciem pakietu beamer. Musimy zezwolić na „złamanie” slajdu, gdyby kod się nie zmieścił na jednym. Inaczej dostaniemy błąd: Paragraph ended before \lst@next was complete. Pozbywamy się tego za pomocą:



Powinniśmy jednak unikać kilkustronicowych listingów kodu na slajdach prezentacji, gdyż nie należy to do sztuki tworzenia dobrych prezentacji. Zmniejszenie czcionki kodu może zwiększyć liczbę kodu jaki możemy przedstawić, ale stanie się on mniej czytelny. Zresztą komu chce się analizować kilkustronicowy kod na prezentacjach?

Użycie allowframebreaks powoduje jednak, że w górnej części slajdu w tytule będzie na końcu wyświetlana cyfra rzymska mówiąca który to slajd z kodem. Nawet jak będziemy tworzyć jednoslajdowe listingi to i tak otrzymamy brzydką jedynkę rzymską w tytule. Aby się tego pozbyć należy w preambule dokumentu dodać linijkę:



Od teraz już nasze listingi kodu, czy to w dokumentach, czy w prezentacjach będą wyglądać profesjonalnie:)