16/07/2014

LaTeX + PDF + obrazki

Home

Korzystając z LaTeX'a dokumenty PDF można tworzyć na przynajmniej dwa sposoby. Te znane mi to:
  • Pliki źródłowe *.tex -> dokument w formacie DVI -> PDF
  • Pliki źródłowe *.tex -> PDF
W pierwszym przypadku używamy dwóch programów tj. latex.exe oraz dvipdfm.exe, a w drugim tylko jednego tj. pdflatex.exe. Do tej pory stosowałem pierwsze podejście, ale w pewnym momencie chciałem skorzystać z szablonu, który był dostosowany do drugiego podejścia. I tu zaczęły się problemy, na których straciłem dużo czasu, a więc piszę ten post ku pamięci. Problemy te dotyczyły osadzania obrazków w dokumencie PDF.

Pierwszy problem polegał na tym, że kompilator krzyczał, że nie rozpoznaje rozszerzenia PS. To udało mi się przewalczyć w miarę szybko zmieniając rozszerzenia na EPS. Dziwne, ale zadziałało. Jakie było jednak moje zdziwienie kiedy po otworzeniu wygenerowanego dokumentu PDF nie znalazłem w nim żadnych obrazków, a dokładniej w miejscach przeznaczonych na obrazki widniały białe obszary o rozmiarze obrazków! Rozwiązanie okazało się jest dziwniejsze niż wcześniej. Otóż, wystarczyło z nazwy obrazka usunąć rozszerzenie czyli zamiast obrazek.eps wpisać obrazek.

Na tym nie koniec. Po jakimś czasie udało mi się doprowadzić do sytuacji kiedy obrazki były widoczne w dokumencie PDF zarówno kiedy nazwa zawierała rozszerzenie jak i bez niego. Otóż w celu umieszczenia w dokumencie obrazka w formacie JPG najpierw konwertuję go do formatu PS przy pomocy programu jpeg2ps.exe. Nie pamiętam już dlaczego, ale jpeg2ps.exe używałem z przełącznikiem -b. Nie wnikając w szczegóły do czego służy, po jego usunięciu problem ustąpił.

Mam nadzieję, że te krótkie wskazówki oszczędzą komuś czasu. Cały czas uważam, że LaTeX jest wspaniałym narzędziem, ale czasami potrafi doprowadzić do szewskiej pasji.

11/07/2014

Konferencja wewnątrz-firmowa - edycja 2

Home

Rok temu tutaj oraz tutaj opisałem zorganizowaną przez siebie konferencję wewnątrz-firmową. W tym roku odbyła się jej druga edycja. O szczegółach organizacyjnych nie będę pisał, aby się nie powtarzać. Z drobnymi szczegółami wyglądało to podobnie. Tematy prezentacji były przynajmniej tak ciekawe, jak przed rokiem i można było posłuchać następujących wystąpień:

Janusz Prusaczyk - Introduction to PowerShell scripting

Paweł Kupis - C# 5.0 Async Feature (async/await) and Synchronization Context – the old new friends

Marcin Wierzbicki - Praktyczny pomiar i atrybucja efektywności portfela inwestycji finansowych

Kamil Langowski - Wolfram Alpha: Computational Knowledge Engine

Adam Juszkiewicz - Mobile game development in Unity

Albert Skłodowski - Design Patterns in Functional Programming

Daniel Celeda - Kręgosłup programisty

Jaroslaw Trafidlo - Czy możemy czuć się bezpiecznie podłączając komputer do sieci?

Damian Orzechowski - Silniki gier komputerowych

Paweł Kaczan - Claims based itentity

Mikołaj Barwicki - Science of Motivation

Michał Komorowski - Debuggery historyczne, co to takiego?

Konferencja ponownie udała się i nie jest to tylko moja opinia. Znowu można było posłuchać o najróżniejszych rzeczach, typowo technicznych, wymagających więcej i mniej uwagi, luźnych... i właśnie to mi się w tym wszystkim najbardziej podoba. Być może się powtórzę, ale pozwala to dowiedzieć się o rzeczach, którymi na co dzień zupełnie się nie interesujemy i nawet do głowy nam nie przyjdzie, że jednak warto. Zdecydowanie polecam.

Mam też trochę wniosków na przyszłość. Było bardzo fajnie, ale zawsze może być lepiej. Jednym z pomysłów na poprawę jest wprowadzenie szablonu prezentacji z przykładami oraz ostrego limitu na poziom slajdów. Szablon powinien zapewnić, że wszystkie prezentacje będą równie czytelne oraz, że nikogo nie porwie zbytnia fantazja przy tworzeniu slajdów ;) Limit na liczbę slajdów powinien natomiast ułatwić zmieszczenie się w czasie. Po głowie chodzi mi również zaproszenie na konferencję ludzi z poza firmy. Może to być trudne do zrealizowania, ale może się uda. Co o tym myślicie, bylibyście chętni do wzięcia udziału w takim wydarzeniu?

Z nowości względem poprzedniej edycji, w tym roku wystąpienia były nagrywane. A wszystko dzięki uprzejmości Jarka Trafidło, który udostępnił kamerkę z serii GoPro, był operatorem, a także poddał zgromadzony materiał obróbce. Jeśli ktoś nie był na jakiejś prezentacji, to będzie mógł ją teraz obejrzeć na spokojnie w domu.

Z mojej perspektywy ogromnym dodatkowym plusem tych nagrań jest to, że w końcu mogłem sporzeć na siebie od tej drugiej strony. Przyznam, że to trochę dziwne uczucie, bo głos brzmi jakoś tak inaczej i w ogóle percepcja siebie się zmienia. Na przykład, wiedziałem, że dużo gestykuluję, ale nagranie pokazało, że chyba zbyt dużo. Po drugie, występując wydawało mi się, że ogólnie stoję w miejscu i tylko od czasu do czasu zrobię krok w jedną albo w drugą stronę. Nagranie znowu uświadomiło mi, że poruszam się więcej niż mi się wydaje, a to kroczek w tą, a to kroczek w drugą. Nie mówię, że trzeba stać w miejscu, ale zbytnia ruchliowść również przeszkadza. Bardzo cenne wskazówki na przyszłość.

06/07/2014

1.25 biliona dolarów

Home

Niedawno przygotowując prezentację na temat debugger'ów historycznych i szukając informacji na temat kosztu naprawiania błędów natknąłem się na ciekawe badanie na ten temat. Prezentowane wyniki wydały mi się na tyle ciekawe, że postanowiłem się nimi z Wami podzielić.

Publikację, o której mowa, można znaleźć na portalu citiseerx, a tytułowe 1.25 biliona dolarów to według autorów tego opracowania globalny koszt wytwarzania oprogramowania na świecie. Co dla nas ciekawe, połowa z tej sumy przypada na pensje programistów, czyli bagatela 625 miliardów dolarów. Autorzy badania szacują również, ile z tego przypada na naprawianie błędów, właściwe programowanie..., ale nie o tym będę pisać.

Pozwolę sobie natomiast pociągnąć temat wynagrodzeń. Otóż, według IDC, estymowana liczba profesjonalnych programistów na świecie to 11 005 000. Z prostego dzielenia wynika więc, że globalnie uśredniona pensja programisty to 56 792 dolarów, co po aktualnym kursie daje 173 357 złotych, czyli średnio 14 446 złotych miesięcznie brutto.

Czy to dużo czy mało? Dla przeciętnego Kowalskiego zapewne bardzo dużo. Dla tych z nas, którzy tyle nie zarabiają, też będzie to sporo. Niektórzy powiedzą natomiast, że można zarabiać jeszcze więcej, a jakby dostać dobrą robotę za granicą, to ta suma wyda się mała. Należy też pamiętać, że te wyliczenia są uproszczone, a średnia to wrzucenie wszystkie do jednego wora. Wynik pokazuje jednak, że tak globalnie nie powinniśmy narzekać.

Na tą średnią można też spojrzeć inaczej. Truizmem będzie stwierdzenie, że otrzymana średnia dzieli programistów na tych co zarabiają mniej i na tych co zarabiają więcej. Odpowiadając jednak na pytanie, jak średnia pensja programisty w Polsce kształtuje się względem średniej globalnej uzyskamy przybliżoną informację o tym, czy pensje powinny rosnąć czy nie. Osobiście sądzę, że nasza lokalna średnia jest zauważalnie niższa, a więc jest pole do wzrostów. I tym optymistycznym stwierdzeniem zakończę.

PS.

Kiedy skończyłem pisać ten krótki artykuł zdałem sobie sprawę, że dokładam swoje 3 grosze do dyskusji, która rozgorzała po publikacji IT-arystokracja... na przykład na facebook'u czy blogach. Nie było to jednak zamierzone.

08/06/2014

CareerCon 2014 - Kraków

Home

Jakiś czas temu otrzymałem propozycję wystąpienia na konferencji CareerCon w Trójmieście. W tamtym momencie nie miałem na to czasu, ale trochę później miała odbyć się konferencja w Krakowie. Zaproponowałem więc wzięcie w niej udziału i wygłoszenie prezentacji na temat automatycznych testów integracyjnych. Od około roku nie miałem okazji niczego prezentować. Dlatego początkowo miałem wątpliwości i obawy, ale cieszę się, że przemogłem lenistwo i asekuranctwo. Korzystając z tej okazji zaplanowaliśmy z żoną krótki weekend w Krakowie, a więc udało się połączyć przyjemne z pożytecznym, a właściwie przyjemne z przyjemnym.

Nie lubię i raczej nie umiem improwizować. Dlatego do przygotowania prezentacji podszedłem skrupulatnie. Temat już miałem. Następnie zastanowiłem się i ułożyłem sobie w głowie, o czym chcę powiedzieć. Na prezentację dostałem około 30 minut, a więc tyle czasu, aby coś już powiedzieć, ale za mało, aby wchodzić w szczegóły. Z góry odrzuciłem więc programowanie na żywo itp. W kolejnym kroku zabrałem się za przygotowanie pierwszej wersji prezentacji. Poszło gładko. W tej kwestii od dawna trzymam się zasady minimalizmu, czyli moje prezentacje mają białe tło, czarną i szarą czcionkę oraz niebieskie wypunktowania. Dodatkowo staram się minimalizować liczbę słów na slajdach - to akurat najtrudniejszy element. Przyjmuję też 2-3 minuty na jeden slajd, a ostatecznie wyszło mi 14 slajdów włączając slajd tytułowy i pożegnalny.

Prezentacja prezentacją, ale trzeba ją jeszcze wygłosić. Zabrałem się więc za ćwiczenia. Pierwsza próba, pomimo tego, że przecież wiedziałem, co chcę powiedzieć wyszła słabo. Zatrzymywałem się, aby się zastanowić, plątałem się w zeznaniach itp. Kolejnym razem było już lepiej, wprowadziłem również poprawki do prezentacji. Za trzecim razem widownią była żona. Dostałem kilka merytorycznie celnych uwag oraz uwagę abym uważał na tempo i się nie śpieszył. Prezentację przećwiczyłem sobie jeszcze przed wyjazdem. Dzięki tym kilku próbom zawartość slajdów znałem na pamięć. Sądzę, że w razie czego obyłbym się bez nich. W ramach przygotowań poprosiłem również organizatorów o informacje na temat wyglądu sali, czy jest tam podwyższenie, jak wygląda sprawa nagłośnienia, co ze sprzętem itd. No cóż, lubię być przygotowany na wszystko.

Tyle na temat przygotowań. Jak wyszło w praktyce? Zacznę od samej konferencji bo będzie krótko. Powiem tylko tyle, że z mojej perspektywy było po prostu ok. Nie byłem tam jednak długo. Przyszedłem tylko na swoją prezentację, w końcu to był również urlop. Jeśli chodzi o mój występ, to osobiście jestem zadowolony. Na sali było mniej więcej 30 osób, sama prezentacja zajęła mi ok. 25 minut, a więc tyle ile powinna. Kiedy zacząłem mówić, czułem duże zdenerwowanie, ale po 2 slajdach, kiedy dotarło do mnie, że idzie dobrze, udało mi się rozluźnić. Niestety nie udało się mi się nakłonić do zadawania pytań, padło tylko jedno. Na koniec prezentacji poprosiłem również o feedback i udało mi się zdobyć jedną, ale cenną opinię. Jeśli ktoś z Was ma jeszcze jakieś uwagi to bardzo chętnie je poznam.

Co do feedback'u, to z jednej strony jego autor powiedział, że było ok, prezentacja miała dobry plan, a ja mówiłem jasno. Z drugiej stwierdził, że było "zbyt idealnie" i lepiej by było gdybym bardziej pokazywał emocje. Z tą opinią się zgadzam i wiem, że wynika to z tego, że poświęcam dużo czasu na przygotowania. W efekcie wynik końcowy może być trochę wyprany z uczuć, mało charakterystyczny, ale ja czuję się pewny siebie. Sądzę, że będę musiał nad tym popracować, chociaż będzie to walka z samym z sobą. Druga uwaga krytyczna dotyczyła tego, że za mało zaakcentowałem dlaczego mówię to co mówię, czemu uważam to za fajne. Kolejna lekcja do zapamiętania. Sądzę, że wynika to z tego, że zafiksowałem się na pewnym spojrzeniu na temat i zapomniałem, że będą mnie słuchać ludzie o różnych doświadczeniach.

Na koniec zamieszczam też link do mojej prezentacji.


26/05/2014

CTE i wydajność

Home

Ten post będzie o tym jak można zrobić sobie krzywdę stosując skądinąd bardzo fajne narzędzia. W tym przypadku mam na myśli CTE (ang. Common Table Expressions). Moim zdaniem stosowane z umiarem podnoszą czytelność kodu, z drugiej jednak strony użycie CTE może wpłynąć negatywnie na wydajność naszych zapytań.

Należy pamiętać o tym, że CTE nie mają fizycznej reprezentacji w tempdb tak jak tabele tymczasowe czy zmienne tabelaryczne. Na CTE można patrzeć jak na taki tymczasowy, nie zmaterializowany widok. Kiedy MSSQL wykonuje zapytanie i napotka CTE to odwołanie do tego CTE zastępuję jego definicją. W związku z tym jeśli dane CTE jest używane kilkakrotnie w danym zapytaniu to ten sam kod zostanie wykonany kilka razy i MSSQL tego nie optymalizuje. Ten kod pokazuje to zachowanie:

WITH  Test (Id)  
AS (SELECT  NEWID())
SELECT * FROM Test
UNION ALL
SELECT * FROM Test

Na ekran zostaną wypisane 2 różne identyfikatory. Gdyby Test było tabelą otrzymalibyśmy ten sam wynik. W skrajnych przypadkach może to spowodować, że zapytanie będzie koszmarnie wolne. Optymalizacja jest natomiast prosta. Wystarczy w pewnym momencie wrzucić dane do tabeli tymczasowej i dalej używać tej tabeli zamiast odwoływać się do CTE.

Jakiś czas temu widziałem przypadek gdzie dzięki temu jakże prostemu zabiegowi zapytanie zamiast wykonywać się kilka minut wykonywało się kilka sekund!