Archive for the ‘Pragmatyzm’ Category

RSS – co to jest, i dlaczego warto korzystać z tego na co dzień?

Sunday, July 25th, 2010

RSS 2.0Wielkim zaskoczeniem było dla mnie zorientowanie się, że sporo osób, które znam – w tym ludzie z szeroko rozumianej “branży IT” – nie używa, bądź nawet nie słyszało o RSS*. W dobie zasypującej nas, rosnącej lawiny informacji narzędzie to staje się coraz bardziej pomocne. W telegraficznym skrócie, kanały RSS pozwalają nam zobaczyć skrót nowości / zmian na stronach bez konieczności odwiedzania tych ostatnich. Aktualizacje “przychodzą do czytnika”, który przedstawia je w podobny sposób jak pocztę elektroniczną. Innymi słowy, RSS oszczędza nam czas i zmniejsza stres związany z pamiętaniem o regularnym sprawdzaniu różnych serwisów. Strony publikujące kanały RSS zwykle łatwo poznać po charakterystycznej, pomarańczowej ikonce obok pasku adresu, którą wyświetlają niektóre przeglądarki.

Kanały RSS subskrybuje się za pomocą wszelkiego rodzaju czytników RSS – dostępnych on-line, off-line czy nawet wbudowanych w przeglądarkę. Subskrybcja ta nabiera prawdziwej mocy w połączeniu z czytnikami wbudowanymi w programy pocztowe – można wtedy przeglądać pocztę i większość istotnych dla nas informacji w sieci wewnątrz jednego programu. Jest to szczególnie wygodne dla osób stosujących w życiu coś mniej lub bardziej przypominającego GTD – wtedy wszystkie ważne informacje i sieciowe ciekawostki same trafiają do miejsca, gdzie znaleźć się powinny – do skrzynki spraw przychodzących.

Potężną zaletą “korzystania z RSS-ów” jest zwolnienie z obowiązku pamiętania o sprawdzaniu zmian na stronach. Każda rzecz, o której trzeba pamiętać zajmuje nam “RAM” i zabiera “cykle procesora” w głowie, które lepiej przeznaczyć na przykład na pracę, którą aktualnie wykonujemy. Pół biedy, jeżeli rozprasza nas regularna, acz przelotna myśl o sprawdzeniu, czy znajomy blogger nie napisał nowego postu. Są sytuacje, w której wymaga się od osób, by były na bieżąco z informacjami – na przykład sekretariaty czy dyrekcje szkół powinny wiedzieć o wszystkim, co ogłaszają kuratoria. Konsekwencje przeoczenia jakiejś informacji mogą być ogromne; ryzyko to jest jednak znacznie mniejsze, gdy wszystkie aktualizacje “wpadają” w jedno miejsce obok poczty elektronicznej.

Tam, gdzie RSS-ów nie ma…
Zdarza się, że autorzy strony zapomną, lub z innych powodów nie umieszczą na stronie kanału RSS. W takiej sytuacji pomóc mogą serwisy typu page2rss, które “przerabiają” zmiany na stronach na kanał RSS. Zrobiłem tak ze stroną wydziału uczelni, na której studiuję i w końcu już jestem na bieżąco z informacjami organizacyjnymi.

Oprócz zwykłych stron internetowych serwujących informacje są też przeróżne usługi, które oferują bądź powinny oferować kanał RSS. Przykładem jest serwis GitHub, który udostępnia w ten sposób historię ostatnich commit’ów. Osobiście też bardzo zadowolony jestem z kanału RSS z pewnego serwera FTP współdzielonego przez dużą grupę osób – ale takie “dobrodziejstwo” wymagało już odrobinę brudnej zabawy z PHP. Osobiście chciałbym zobaczyć kiedyś kanał RSS z “Ściany” (ang. Wall) na Facebook‘u; podobno ktoś podejmował takie próby, ale Facebook je zwalczył (“prywatność”, takie tam). Byłaby jedna strona mniej do codziennego sprawdzania.

Negatywna strona RSSów
Oczywiście, “nie ma róży bez kolców” – głównym problemem RSS-ów jest coś, co jest też ich największą zaletą – nowa treść trafia nam “prosto przed nos”. Mając wszystkie ciekawe teksty i nowinki w jednym miejscu można bardzo łatwo zacząć – mniej lub bardziej szkodliwieprokrastynować. Jak każde narzędzie, jakie dają nam nauka i technika, tak i kanałów RSS należy używać rozważnie – ale to już nie jest temat tego postu.

* – RSS nie jest jedynym protokołem tzw. syndykacji w Internecie. Niemniej jednak termin RSS jest używany czasem w rozumieniu różnych protokołów, podobnie jak w przypadku obuwia – “adidasy” niekoniecznie muszą być wyprodukowane przez firmę Adidas. W tym znaczeniu używam skrótowca RSS w powyższym tekście.

Używaj rzutowania w stylu C++

Friday, May 7th, 2010

Chociaż temat ten był wałkowany m.in. przez Scotta Meyers’a w More Effective C++, to wciąż widzi się masę kodu pisanego z rzutowaniami w stylu C. Dla przypomnienia, w C++ mamy cztery rodzaje rzutowań:

  • static_cast
  • const_cast
  • dynamic_cast
  • reinterpret_cast

Rzutowania w stylu C wyglądają natomiast tak: (typ)argument, lub tak: typ(argument).

Jeden z ciekawych problemów, który może się pojawić u programisty stosującego rzutowania w stylu C ilustruje poniższy fragment kodu:

Object Foo( int(parameter) );

Ten kod wbrew pozorom nie robi tego, na co wygląda. Nie jest to stworzenie obiektu Foo typu Object, z rzutowaniem parametru na typ int. C++ przyjmuje zasadę, że wszystko co wygląda jak deklaracja funkcji ma być w pierwszej kolejności potraktowane jak deklaracja funkcji. I w tym przypadku kod ten deklaruje nam funkcję o nazwie Foo, zwracającej obiekt typu Object i przyjmującej jeden parametr typu int.

Może na co dzień nie spotkamy się z takimi ekstremalnymi zjawiskami, ale rzutowania w stylu C++ mają kilka dobrych cech, o których warto wiedzieć:

  • Są dużo bardziej przyjazne dla grep’a i innych narzędzi wyszukujących w tekście. O wiele łatwiej jest znaleźć wszystkie wystąpienia static_cast niż rzutowań opartych o nawiasy okrągłe, które czasem mogą przypominać np. wywołanie funkcji albo tworzenie nowego obiektu. Poza tym, w jaki sposób znaleźć wszystkie rzutowania niezależnie od typu, na który się ono odbywa? ;)
  • Są dużo bardziej przyjazne dla vgrep’a (dla ludzkiego oka ;) ) – łatwiej je wypatrzeć w gąszczu nawiasów; z resztą w większości IDE są kolorowane jako słowa kluczowe. Weźmy przykład poniższego kodu:
        int offset = (int)(T*)1 - (int)(Singleton <T>*)(T*)1
        ms_singleton = (T*)((int)this + offset);

    i porównajmy go z tym:

        int offset = reinterpret_cast<int>(reinterpret_cast<T*>(1)) -
        reinterpret_cast<int>(static_cast<Singleton <T>*>(reinterpret_cast<T*>(1)));
        ms_singleton = reinterpret_cast<T*>((reinterpret_cast<int>(this) + offset));

    Wariant C++ nie jest ani trochę piękniejszy, ale przynajmniej można od razu policzyć ile jest rzutowań i jakiego rodzaju. Poza tym, składnia wywołania funkcji pozwala od razu ogarnąć, które wyrażenia są rzutowane.

  • Jak widać powyżej, są długie, rozwlekłe i brzydkie. I bardzo dobrze. Rzutowania to coś, czego nie powinno się stosować bez wyraźnej potrzeby, więc jeśli programiście przeszkadza pisanie takiego kodu, to tym lepiej dla projektu.
  • Lepiej rozdzielają odpowiedzialność – każdy z rodzajów rzutowania w C++ jest odpowiedzialny za inne zadanie. Dzięki temu kod lepiej wyraża intencje autora (np. widząc w kodzie const_cast masz pewność, że programista chciał jedynie zdjąć lub założyć modyfikator const albo volatile).
  • Mają spójną składnię. Rzutowania w stylu C mogą występować w dwóch wariantach – z typem w nawiasie oraz w składni “konstruktora”, z rzutowanym argumentem w nawiasie. Sam fakt, że w tym samym programie możemy natknąć się na oba warianty powoduje, że myśl o wyszukiwaniu ich w kodzie jest przerażająca.

Zainteresowanych tematem rzutowania odsyłam do świetnego artykułu Reg’a poświęconego temu tematowi. Chciałbym zaznaczyć jednak, że nie zgadzam się z jego wnioskiem numer 2, tj.

Nie ma praktycznych przesłanek, by rezygnować ze stosowania eleganckiego, zwięzłego rzutowania w stylu C na rzecz rozwlekłych operatorów static_cast i reinterpret_cast.

Wydaje mi się, że w tym poście zawarłem wiele praktycznych przesłanek za rezygnacją z rzutowania w stylu C.

Hipster PDA – organizer ‘zrób to sam’

Friday, October 16th, 2009

Nie ma powodu, żeby mieć tą samą myśl dwa razy; chyba, że bardzo lubisz ją mieć.

David Allen, Getting Things Done

Powszechnym zjawiskiem stało się posiadanie organizerów – najczęściej różnego rodzaju i rozmiaru kalendarzy w mniej lub bardziej twardej oprawie, które znajdują swoje stałe miejsce w niezliczonych plecakach, torebkach i samochodach. Notatniki te możemy dostać w sklepach papierniczych, biurowych, a nawet i w spożywczych – zwykle wiąże się to z wydatkiem kilkudziesięciu złotych. Pomijając kwestię właściwego używania tych narzędzi (po zimny prysznic odsyłam do Getting Things Done), zapewne nie każdy zdaje sobie sprawę, że w pełni funkcjonalny i elegancki organizer można zrobić samemu za kilka złotych.

Hipster PDA
Pomysł ten, zaproponowany Merlina Manna na 43Folders, sprowadza się do pliku karteczek o rozmiarze niewiele większym od karty kredytowej spiętego klipsem do papieru. Taka prosta konstrukcja ma swoje zalety w stosunku do konwencjonalnych organizerów – zarówno papierowych jak i cyfrowych:

  • Elastyczność: Brak narzuconej struktury oznacza, że notujemy co chcemy i jak chcemy.
  • Wygoda: Klips do papieru pozwala otwierać notes na wiele różnych sposobów, oraz rozłożyć go, przetasować i wymienić karteczki – na przykład zarchiwizować stare notatki lub dołożyć nowy papier.
  • Funkcjonalność: Możemy wyjąć karteczkę z notatkami i bez obaw dać ją komuś innemu.
  • Pewność: Nigdy nie skończy się mu bateria, nie grozi mu awaria z powodu wstrząsów.
  • Bezpieczeństwo: Raczej mała szansa, że ktoś będzie chciał go ukraść.

Oczywiście Hipster PDA złożony z czystych kartek może okazać się niewystarczający – w końcu jak może zastąpić elegancki kalendarz czy listy adresów, które znajdują się w sklepowych oragnizerach?

D*I*Y Planner i Hipster PDA
D*I*Y Planner (DIY to z angielskiego ‘zrób to sam’) Douglasa Johnstona to zbiór bardzo dobrych darmowych szablonów do budowy własnego organizera. Pośród nich znajdują się m.in.:

  • Kalendarz dzienny, miesięczny i roczny
  • Checklisty dla agend, zadań i projektów
  • Listy zakupów i wydatków
  • Różne karty związane z zarządzaniem biznesem i projektami
  • Karty związane z powieściopisarstwem i innymi kreatywnymi czynnościami
  • Szablony pozwalające tworzyć własne karty do organizera

Oryginalnie zestaw ten powstał z myślą o dużych organizerach, jednak autor stworzył też wersję specjalnie dla Hipster PDA. Jedyne, co trzeba zrobić, by zamienić plik papieru w potężny organizer dostosowany do indywidualnych potrzeb, to… ściągnąć D*I*Y Planner Hipster PDA Edition i wydrukować interesujące nas karty.

Implementacja
Używam Hipster PDA już od ponad dwóch lat i miałem przy tym okazję wielokrotnie sprawdzić, że jest to przydatne narzędzie – chciałbym więc podzielić się kilkoma uwagami związanymi z implementacją.

Konstrukcja Hipster PDA sprowadza się do ściągnięcia wspomnianego pakietu kartek, wydrukowania interesujących egzemplarzy i odpowiednim pocięciu – na jedną kartkę A4 dostajemy cztery wkładki do Hipster PDA. Warto przy tym wszystkim zalaminować (koszt: ok. 4zł) pierwszą i ostatnią kartę (okładki) – dzięki temu będą one sztywniejsze i szersze od reszty, co skutecznie ochroni notes przed zniszczeniem w kieszeni. Klips do papieru nie może być zbyt duży, gdyż wtedy przeglądanie notesu byłoby niewygodne. Dobrze jest też mieć dedykowany długopis lub ołówek do noszenia razem z notesem. Mój obecny Hipster PDA wygląda tak:

HipsterPDA - rozłożony
Mój Hipster PDA – w kawałkach

HipsterPDA
Ten sam Hipster PDA po złożeniu, z dedykowanym dla niego ołówkiem automatycznym

Jest to już drugie podejście do tego organizera – o ile za pierwszym razem trzymałem tam kalendarz dzienny, miesięczny i całą masę przeróżnych list, o tyle teraz skupiłem się przede wszystkim na używaniu Hipster PDA jako podręcznego notesu do zbierania informacji (gdzie się podział kalendarz i dlaczego tak jest lepiej to temat na osobny wpis) i przenoszenia specyficznych danych (ostatnio dołączyłem zestaw kodów EAN-13 do najczęściej kupowanych przeze mnie produktów spożywczych).

Hipster PDA, znany szczególnie w kręgu tzw. GTD-owców, to bardzo dobra alternatywa dla konwencjonalnych organizerów. Jest tani, bazuje na papierze i można – a nawet trzeba – nosić go wszędzie ze sobą.

REPL i PHP – czyli Telnetem do rakiety :)

Tuesday, September 15th, 2009

Telneting into your rocket is sort of fundamentally cool.

Wiele języków – Lisp, Python, Perl czy Ruby posiadają tzw. pętlę wczytaj-wykonaj-wypisz – z angielskiego Read-Eval-Print Loop, czyli w skrócie REPL. Chodzi oczywiście o tryb interaktywny, w którym możemy wpisywać wyrażenia w danym języku, które są natychmiast wykonywane a rezultaty działania zwracane. Poza oczywistym zastosowaniem jakim jest mądrzejszy kalkulator :) REPL może przydawać się też do debugowania kodu, często pracującego. Python ma nawet swojego on-line REPLa do wypróbowania :) .

PHP jest językiem, na którego temat można znaleźć bardzo wiele negatywnych opinii – jednak pomimo tego i tak jest szeroko wykorzystywany do tworzenia aplikacji webowych. Biorąc pod uwagę specyfikę działania skryptów PHP – są one wykonywane od nowa ‘na czysto’ przy każdym zapytaniu HTTP – REPL mógłby być dla tego języka przydatnym narzędziem; szkoda tylko, że autorzy tego nie uwzględnili (ściślej rzecz ujmując PHP posiada tryb interaktywny wywoływany parametrem -a, ale z bliżej mi nieznanych powodów tryb ten jest raczej krytykowany).

Podczas opracowywania wyników Eksperymentu powstał problem – jak pracować na danych, których samo wyciągnięcie z bazy i przetworzenie zajmuje (na localhost’cie) ok. 1.5 minuty? Zwłaszcza kiedy jeszcze na początku nie wie się, co się chce osiągnąć? W takich sytuacjach przydaje się REPL – i na szczęście takowy dla PHP został stworzony.

phpsh to projekt Facebook’a, będący Open-Source i napisany głównie… w Pythonie. Szczegóły pod adresem:
http://www.phpsh.org/ Całość wykonana jest bardzo ładnie i dobrze wykorzystuje możliwość wyświetlania w konsoli kolorowego tekstu. Po rozpakowaniu na serwerze działa po prostu ‘z marszu’ :)  .

Dalsze poszukiwania pozwoliły znaleźć trzy kolejne projekty: php shell, phpa oraz pozwalający na zdalną pracę przez przeglądarkę (i potrafiący wyświetlać wyjście w HTMLu) PHP Interactive. Niech więc każdy wybierze co lubi (ja zamierzam raczej zmienić język ;)  ).

Przydatność narzędzia jakim jest REPL jest nieoceniona, wypadałoby zacytować pracownika NASA JPL dotyczący awarii na pokładzie sterowanego zdalnie pojazdu kosmicznego:

Debugging a program running on a $100M piece of hardware that is 100 million miles away is an interesting experience. Having a read-eval-print loop running on the spacecraft proved invaluable in finding and fixing the problem.

Edit 15.09.2009 17:39
Fus donosi, że nawet C# ma swojego REPL’a. Podjęte też zostały próby stworzenia takiego narzędzia dla C i C++.

Limity OneNote

Friday, February 20th, 2009

A jednak nawet OneNote ma swoje limity. Ostatnio w ramach nauki analizy matematycznej przygotowałem w pojedynczej notatce OneNote’a pewien konspekt, który po wydrukowaniu ma 23 strony. Oprócz tekstu zawiera on bardzo dużo wklejonych obrazków ze wzorami i fragmentami książki do matematyki. Przy takiej ilości danych w jednej notatce OneNote się poddaje – wczytanie notatki (gdy np. przełączaliśmy na inną) trwa nawet do minuty, a samo jej przewijanie też potrafi na chwilkę zamrozić program.

Wniosek jest oczywisty – pojedyncze notatki w programie OneNote nie nadają się do tworzenia bardzo długich dokumentów ze sporą ilością multimediów. Na szczęście nie jest to większy problem – wystarczy nie pakować wszystkiego do jednej notatki, ale tworzyć ich kilka (OneNote radzi sobie dobrze z drukowaniem całych sekcji na raz).

Zobaczyć podczerwień.

Monday, December 8th, 2008

Jestem zaskoczony tym, jak mało osób (wliczając w to prowadzącego laboratoria z Elektroniki Cyfrowej oraz panią w lokalnym sklepie elektronicznym) wie, że matryce CCD potrafią rejestrować promieniowanie podczerwone. Tak drogi Czytelniku, Twój aparat cyfrowy, także ten w telefonie, potrafi zobaczyć podczerwień. Zjawisko to prezentują poniższe zdjęcia pilota od telewizora zrobione telefonem komórkowym.

Pilot TVPilot TV z naciśniętym przyciskiem

Pierwsze zdjęcie przedstawia przód pilota. Drugie zdjęcie przedstawia tego samego pilota, przy naciśniętym przycisku. Widzimy, że dioda, której światło jest nie widoczne gołym okiem, została doskonale zarejestrowana przez aparat. Znajomość tej sztuczki przyda się każdemu do testowania sprawności pilotów od sprzętu RTV. W ten sposób można chociażby łatwo sprawdzić, które przyciski nie stykają (albo czy panowie z serwisu faktycznie naprawili nam pilot).

Zastosowania są oczywiście szersze – zjawisko to wykorzystuje się w kamerach CCTV do ochrony obiektów – w nocy taka kamera może pracować w trybie czarno-białym i doświetlać teren podczerwienią. Podobnie spotykane coraz częściej wideofony zawierają zestaw diod LED, które służą do oświetlania podczerwienią, dzięki czemu kamera dobrze rejestruje rozmówcę niezależnie od zewnętrznego oświetlenia (np. w nocy). Jeden z moich kolegów przeprowadził niegdyś eksperyment – za pomocą diody podczerwonej wysokiej mocy (3W chyba) mógł widzieć przez wyświetlacz aparatu cyfrowego obiekty w odległości ok. 2-3 metrów w kompletnej ciemności.

Sprawna zmiana nazw plików

Tuesday, September 30th, 2008

Czasem zdarza się, że musimy zmieniać nazwy grupie plików w jakimś katalogu. Niedawno przypadkiem odkryłem (nacisnąłem zły klawisz ;) ) sztuczkę, która ułatwia ten proces. Przetestowana na Windows Vista, nie wiem czy działa na starszych (i czy ktoś ją skopiował do *nix’ów).

Jak wiadomo ;) , skrótem do zmiany nazwy zaznaczonego pliku jest klawisz F2. Po jego naciśnięciu najczęściej wpisujemy nazwę, po czym wciskamy ENTER i wybieramy inny plik, lub od razu klikamy na tym pliku. Potem kolejne F2 lub kliknięcie, co zabiera nam jakąś sekundę. Zamiast tego, gdy skończymy wpisywać nazwę, wystarczy nacisnąć klawisz TAB, by przeskoczyć na kolejny plik, od razu w trybie zmiany nazwy. Czyli wklepujemy nazwę, TAB, i wklepujemy kolejną ;) . Hope that helps.

DropBox – wygodne współdzielenie plików

Sunday, September 28th, 2008

Dzielenie się plikami to temat znany chyba każdemu developerowi. Dzielimy się naszymi grami, programami. Dzielimy się screenami, logami. Pracujemy wspólnie nad kodem. Stosujemy w tym celu wiele metod – strony typu Rapidshare, własne lub kupione serwery FTP, narzędzia kontroli wersji (CVS, SVN). Ludzie z Warsztatu stworzyli nawet program ScreenUp – wygodne narzędzie do wrzucania screenów. Chciałem dziś napisać o kolejnym ‘wynalazku’ w tej dziedzinie.

Niedawno odkryłem ciekawe narzędzie – DropBox. W założeniu jest to prosta metoda przechowywania i współdzielenia plików. Jak w praktyce to działa?
Wchodzimy na stronę http://getdropbox.com/ i ściągamy klienta. Dostępny jest on w wersjach dla Windows, Linux i Mac. Po instalacji w systemie Windows zakładamy konto, podając swój adres e-mail (używany jako login na stronę), hasło i inne opcjonalne dane. Przy instalacji można też wybrać lokalizację katalogu DropBox.

No dobrze, ale o co chodzi? Mamy w systemie teraz specjalny katalog, który jest automatycznie synchronizowany ze stroną DropBox. Wszystkie pliki wgrywane są automatycznie na serwer, wszystkie zmiany przesyłane metodą inkrementalną (dogrywane są jedynie zmienione fragmenty). Do podkatalogu Public wrzucamy pliki, które chcemy udostępniać całemu światu. Tak jak ten :) . Podkatalog Photos pełni rolę zbioru galerii fotograficznych (wrzucamy foldery), które również może oglądać każdy, komu damy odpowiednie linki. Wreszcie istnieje możliwość tworzenia i współdzielenia katalogów z innymi użytkownikami DropBox. Oznacza to, że każda zmiana w takim katalogu będzie synchronizowana u wszystkich osób, które mają do niego dostęp.

Wszystkie te rzeczy są zintegrowane z Eksploaratorem Windows (o pozostałych systemach wiem tylko tyle, że na pewno integruje się z GNOME), dzięki czemu obsługa całej mechaniki DropBox’a to po prostu przerzucanie plików między swoimi folderami, a folderem DropBox. Program dodaje do menu kontekstowego swoje podmenu z kilkoma użytecznymi funkcjami, jak np. Copy Public Link.

DropBox oferuje dwa rodzaje kont. Darmowe ma ograniczoną pojemność do 2GB, płatne – do 50GB ($9.99 / miesiąc lub $99 / rok). Cały projekt jest na razie w fazie beta (chociaż patrząc na Google, słowo “beta” chyba straciło już swoje znaczenie…), więc można spodziewać się jeszcze wielu zmian (omawianych na forum DropBox’a).

Large Hadron Rap

Tuesday, September 2nd, 2008

Bonus na dobranoc, uśmiech w stronę fizyków :) .

Na uwagę zasługuje fragment w opisie tego filmiku na Youtube.
“The sound should be slightly better on this version – we’ve tried to get round YouTube’s new extreme audio dynamic range compression by layering a 20kHz sine wave over the top of the soundtrack.”
To jest podejście prawdziwego Technika! Chak de planet~! :) .

Chronienie funkcji

Thursday, January 3rd, 2008

Chronienie funkcji to ciekawe zastosowanie metody obsługi sytuacji wyjątkowych, dzięki któremu możemy w chwili wystąpienia błędu uzyskać dokładne informacje o miejscu awarii. Samą technikę podpatrzyłem dawno temu w publicznym kodzie gry Unreal Tournament. Przykładowy komunikat błędu prezentuje poniższy screen:

Komunikat o błędzie pokazujący stos wywołań.

Jak widać, komunikat zawiera historię wywołań funkcji, które doprowadziły do miejsca wystąpienia błędu (tak zwany call-stack).

Napiszmy dwa pomocnicze makra oraz przykład użycia

#define GUARD(functionName) {static const char __GUARDED_FUNCTION_NAME__[] = #functionName; try{
#define UNGUARD } catch(...) { Framework->GetErrorManager()->AddCallHistory(__GUARDED_FUNCTION_NAME__); throw; } }
//przyklad uzycia
void funkcja_chroniona()
{
    GUARD(funkcja_chroniona);
    //jakies operacje
    UNGUARD(funkcja_chroniona);
}

Makra te ujmują kod zawarty między nimi w blok try-catch. Kiedy chcemy zasygnalizować wystąpienie bardzo poważnego błędu, który powinien spowodować przerwanie działania programu, wówczas rzucamy wyjątek. W chwili złapania wyjątku w makrze UNGUARD, nazwa podana do makra GUARD zostaje zapisana w systemie obsługi błędów ( to proszę napisać sobie samemu ;) ), po czym wyjątek zostaje rzucony dalej. Jeśli zabezpieczymy w ten sposób wiele funkcji, to rzucony wyjątek przeleci przez nie wszystkie aż do miejsca, w którym zostanie obsłużony i zatrzymany. Takim miejscem może być np. pętla główna gry. Przykład:

//punkt obslugi, fragment jakiejs funkcji
//...
try
{
    EnterMainLoop();
}
catch(std::exception& exc)
{
    errorSystem->DisplayException("STL exception", exc.what());
}
catch(CMyException& exc)
{
    errorSystem->DisplayException(exc.type(), exc.what());
}
catch(...)
{
    errorSystem->DisplayException("Unknown exception", "Unknown error");
}
//...

Z metodą tą wiążą się też pewne niedogodności:

  • Każdą chronioną funkcję / blok kodu trzeba zawierać w makrach GUARD/UNGUARD
  • Blok try/catch powoduje zwiększenie czasu wykonania funkcji
  • Utrudnione lub wręcz uniemożliwione jest używanie w kodzie wyjątków w celach innych niż obsługa błędów krytycznych, powodujących awaryjne zakończenie pracy programu

Równoważone są one jednak przez korzyść wynikającą ze znajomości dokładnej historii wywołań funkcji prowadzącej do miejsca wystąpienia błędu. Oczywiście makr tych nie stosujemy we wszystkich możliwych funkcjach; na przykład nie powinno się ich używać w prostych funkcjach wymagających bardzo dużej wydajności (np. iloczyn wektorowy).

Możliwe usprawnienia podanego przykładu:

  • Zastosowanie dyrektyw #ifdef / #else / #endif do warunkowej kompilacji makr GUARD/UNGUARD, dzięki czemu można będzie je łatwo wyłączyć
  • Stworzenie dodatkowej pary makr GUARD_SLOW i UNGUARD_SLOW, które będą automatycznie wyłączane w wersji wydaniowej (patrz punkt poprzedni), a które stosowane będą w funkcjach wymagających możliwie wysokiej wydajności
  • Połączenie chronienia funkcji z własnymi makrami Assert/Verify, dzięki czemu przerywając pracę programu uzyskamy dokładne informacje o miejscu naruszenia asercji i drodze do tego miejsca. Własne makra Assert/Verify opiszę w przyszłości.
  • Połączenie makra GUARD z loggerem, dzięki czemu nazwa funkcji będzie automatycznie dopisywana do komunikatu. Jest to duże udogodnienie, jeśli ktoś zapisuje nazwy funkcji do loga.
  • Przerobienie makr, by system działał w oparciu o Unicode (w przypadku kodu, który w całości jest oparty o to kodowanie znaków)

Osobiście z powodzeniem stosuje koncepcję chronienia funkcji w kodzie od dość długiego czasu. Zintegrowała się ona na stałe z silnikami i frameworkami, których pisania się podejmowałem. Z wymienionych wyżej usprawnień nie udało mi się jedynie połączyć chronienia funkcji z loggerem.