Dla odmiany zająłem się ostatnio czymś nieco prostszym niż GUI, a mianowicie systemem logującym. To zdecydowanie niezbędne narzędzie, które docenia się zwłaszcza wtedy, kiedy coś innego psuje. Jak dotąd aczkolwiek nic poważnego nie zdążyło się jeszcze, ale w programowaniu jest to, jak wiadomo, tylko kwestią czasu ;)
Do logowania istnieje mnóstwo podejść, które różnią się głównie tym, gdzie i jak zapisujemy nasze informacje. Bo jeśli o to, co mamy logować, to odpowiedź jest prosta: wszystko albo jak najwięcej.
Dość obszerny przegląd możliwych wyjść loggera przedstawił TeMPOraL w jednej swoich notek. Jakkolwiek długa ta lista by nie była, pewne jest jedno: na pewno nie może być ona zapisana “na sztywno” w kodzie głównej klasy systemu logującego. Same ‘wyjścia’ należy bowiem opakować w osobne klasy, wywodzące się ze wspólnej bazy i wykorzystać zalety polimorfizmu. W ten sposób można kierować komunikaty zarówno na konsolę, do zwykłego pliku tekstowego, jak i do funkcji OutputDebugString
.
Pomyślałem jednak nad rozszerzeniem tego pomysłu, który wyraża się w tytułowym równaniu: wyjście = format + ujście. Postanowiłem oto podzielić wyjście logowania na dwie części:
Nie jest to oczywiście żadna rewolucja. Czasami też obie części muszą być do siebie ściśle dopasowane, aby osiągnąć pożądany efekt (np. wypisywanie kolorowych komunikatów w asynchronicznej konsoli Windows). Zwykle jednak można je zestawiać dowolnie i otrzymywać ciekawe rozwiązania. Najważniejsze, że tą dodatkową elastyczność da się osiągnąć małym kosztem.
Programy rezydujące w zasobniku systemowym (system tray) są zawsze wyposażone w menu kontekstowe. Zwykle pojawia się ono po kliknięciu prawym przyciskiem myszy na ikonkę aplikacji i zawiera najczęściej używane opcje programu – co czasem oznacza też “wszystkie opcje programu” :)
Czasami jednak to menu jest uparte i jeśli nie zdecydujemy się na wybranie żadnej pozycji, ono pozostaje otwarte nawet mimo tego, że już dawno zajęliśmy się czymś innym. Zupełnie jakby Windows “zagapił się” i przeoczył moment, gdy menu utraciło fokus (wtedy właśnie powinno było zniknąć). Bywa to o tyle denerwujące, że takie osierocone menu przykrywa wszystkie inne okna w systemie.
Niekiedy pomaga wtedy ponowne kliknięcie w ikonkę programu. Jeżeli jednak to nie działa, trzeba jakoś przywrócić feralnemu menu utracony fokus, aby mogło go ponownie stracić – i, miejmy nadzieję, zniknąć na dobre. Jak to zrobić bez uaktywniania żadnej pozycji menu? Są co najmniej dwa sposoby:
Kiedy następnie klikniemy w jakiekolwiek miejsce poza menu, oporna lista powinna się w końcu schować.
Często na warsztatowym kanale IRC nie dzieje się nic ciekawego, ale czasem można usłyszeć tam coś interesująco. I czasem nawet kontrowersyjnego – jak choćby ta oto opinia:
[19:19:21]
przy gamedevie brakuje poczucia misji
[19:19:29]to tak jakbym sprzedwal narkotyki dzieciom
Może jest ona nieco skrajna, ale to nie znaczy, że nie warto z nią polemizować. Jaka jest więc misja przemysłu wytwarzającego gry komputerowe?… W odpowiedzi na podobne wątpliwości lubimy zwykle sięgać do przykładu kinematografii – z tego porównania korzysta się na przykład wtedy, kiedy ktoś (po raz nie wiadomo który) podnosi kwestię nadmiernej brutalności gier.
Nie da się ukryć, że obecnie główną misją obu dziedzin twórczości jest dbanie o odpowiednio przyzwoity stan kont osób, które się nimi parają. W przemyśle filmowym jest domena hollywoodzkich superprodukcji, słynących z wtórności, powtarzalności, słabej strony fabularnej i przeładowaniem efektami specjalnymi. To nie przypadek, że dokładnie te same epitety możemy dopasować do wielu komercyjnych gier.
Jednocześnie mamy też tzw. kino niezależne, które celuje w nieco bardziej wyrafinowane gusta. Być może jego odpowiednikiem w przemyśle gier komputerowych są produkcje realizowane przez małe, czasem nawet nieprofesjonalne zespoły. Ich dzieła zwykle nie są nastawione na stronę techniczną – grafikę zapierającą krew żyłach i mrożącą dech w piersiach (;]) i superrealistyczne efekty dźwiękowe. Zamiast tego posiadają to, co bardzo rzadko przejawia się w komercyjnych grach – oryginalność.
Można jej zasmakować przeglądając chociażby zwycięskie produkcje z dorocznego Independent Games Festival. Mówienie o nich jako o “zwykłych casualach” byłoby według mnie grubym nietaktem ;P
Naszła mnie dzisiaj nieodparta ochota, aby opublikować nową wersję jednej z bardziej udanych swoich produkcji – czyli Taphoo. Oczywiście nie oznacza, że potrafię pstryknąć palcami i w ten sposób wyczarować nową edycję gry. Po prostu planowałem to od jakiegoś czasu, lecz chciałem jeszcze dodać trochę więcej etapów i jakieś nowe funkcje.
Ostatecznie skończyło się na 10 nowych poziomach – zatem łącznie jest ich teraz 60. I na pewno nie są już one takie proste jak poprzednie ;] Wystarczy rzucić okiem choćby na ten:
Jeżeli jakimś cudem nie jest on dla ciebie odstraszający, to zapraszam do ściągnięcia nowej wersji :) Można ją zainstalować bezpośrednio na starej, w tym samym katalogu.
Taphoo (1.8 MiB, 6,423 downloads)
Ostatnio zająłem się nieco stronką pod względem technicznym, czego efektem są trzy proste zmiany. Prawdopodobnie są to zmiany na lepsze :)
Pierwszą jest fakt, że w końcu działają tutaj tzw. permalinki. Wcześniej miałem z nimi pewne problemy, bo chociaż w WordPress mogą być one ustawione automatycznie, kłopotliwy okazał się jeden z pluginów. Ostatecznie skończyło się na tym, że musiałem nauczyć się obsługi apaczowego mod_rewrite i zrobić wszystko samodzielnie ;P
A cóż to takiego są te permalinki? Jest to sprytny mechanizm, która sprawia, że adresy poszczególnych elementów strony wyglądają o wiele ładniej. Przykładowo, niniejsza notka jest dostępna zarówno pod adresem
http://xion.org.pl/?p=107
, jak i http://xion.org.pl/2007/08/17/pewne-usprawnienia
. Ten drugi adres jest naturalnie o wiele bardziej opisowy, a poza tym wyszukiwarki bardziej go lubią :)
Druga sprawa dotyczy kanału RSS, który został ‘usprawniony’ przy pomocy serwisu FeedBurner. Prawdę mówiąc nie mam bladego pojęcia, jaka wynika z tego korzyść praktyczna, ale widziałem tak potraktowane RSSy na wielu blogach, zatem pewnie coś w tym jest :) Na oko działa on jednak tak samo jak wcześniej.
Trzecia zmiana jest widoczna na pasku po prawej stronie. Ponieważ notek jest już sporo i przeglądanie starszych tylko poprzez archiwum miesięczne może być mało wygodne, dodałem jeszcze listę kategorii. Ten swego rodzaju spis treści pozwala przeglądać notki o wybranej tematyce.
Kilka miesięcy temu odkryłem bardzo ciekawą i pomysłową usługę internetową. Można ją uznać za pewną formę wyszukiwarki ale w gruncie rzeczy potrafi ona znacznie więcej. Teoretycznie – niemal wszystko. Chodzi tu serwis o nazwie YubNub – internetowy wiersz poleceń
Z wyglądu strona przypomina wyszukiwarkę. W zajmującym centralne miejsce polu tekstowym nie wpisujemy jednak zapytania, tylko polecenie z ewentualnymi parametrami. Dostępnych komend jest mnóstwo i co ważniejsze, każdy może dodawać swoje własne. Ich wspólną cechą jest to, że opierają się na przekształceniu swoich parametrów na odpowiedni URL. I tak polecenie
g test
spowoduje przejście pod adres http://www.google.com/search?q=test
– czyli wyszuka podaną frazę za pomocą Google. Mechanizm jest więc podobny do prefiksów wyszukiwania dostępnych w Internet Explorerze od wersji 5.
Cały ten kram byłby pewnie mało przydatny, gdyby za każdym razem należało ręcznie wchodzić na stronę YubNuba. Na szczęście powstało całe mnóstwo różnych wtyczek i osobnych programów, które można pobrać ze strony Installing YubNub. Osobiście używam wtyczki do domyślnej wyszukiwarki w Firefoksie i małego programiku YubNub Trip.
Poniżej zamieszczam listę kilkunastu wybranych komend. Część z nich sam wykorzystuję, a pozostałe są po prostu ciekawe :) Większe spisy są oczywiście dostępnie na stronie YubNuba.
g zapytanie
– Googley zapytanie
– Yahoobrain pytanie
– BrainBoost: wyszukiwarka odpowiadająca na pytanie w języku naturalnym (przynajmniej w teorii ;))lyric artysta lub tytuł
– wyszukiwarka słów piosenekthott zapytanie
– Thottbotdf słowo
– definicje Googledict słowo
– słownik angielski dict.orgud słowo
– Urban Dictionary, czyli słownik internetowego (i nie tylko) slangumsdn zapytanie
– przeszukuje MSDN Libraryrfc numer
– wyświetla dokument RFC o podanym numerzephp funkcja
– dokumentacja funkcji PHPjd klasa
– dokumentacja klas Javyrand (-min min -max max -num n)
lub rand max
– losuje n (domyślnie 1) liczb z zakresu [min; max)split url, url, ...
– wyświetla kilka stron w jednym oknie podzielonym na ramkilynx url
– pobiera ze strony sam HTML i wyświetla go w przeglądarceascii tekst
– tworzy kilkanaście ASCII-artów z podanego tekstuman polecenie
– wyświetla opis polecenia YubNubals (fraza)
– wyświetla listę komendcreate (nazwa)
– tworzy nowe polecenieurl polecenie
– podaje URL powstały w wyniku wykonania poleceniagui polecenie
– tworzy prostą stronę z GUI do wpisania parametrów poleceniaKiedy programista grafiki i/lub gier nad czymś pracuje, pierwszym widocznym rezultatem powinny być oczywiście screeny. Sam najwyraźniej jestem wyjątkiem potwierdzającym tę regułę (;D), ale to nie znaczy, że nie potrafię docenić małego i zgrabnego programiku wspomagającego robienie zrzutów ekranu.
Takim programem jest ScreenUp autorstwa spaxa. Siedzi on sobie w zasobniku systemowym i przechwytuje wciśnięcia klawiszy PrintScreen i Alt+PrintScreen, buforując wykonane screeny. Można je potem obejrzeć w postaci miniaturek lub otworzyć w pełnej wersji.
Najciekawszą opcją jest aczkolwiek możliwość załadowania screena na zdalny serwer i otrzymania w zamian linku do niego w Schowku. Niestety, jedynym dostępnym sposobem jest wysyłka przez HTTP POST – brak obsługi FTP. Docelowy host musi mieć więc wsparcie dla jakiegoś systemu skryptów w rodzaju PHP czy ASP, który przetworzy takie żądanie na rzeczywisty plik na serwerze. Na szczęście domyślnie można w tym celu używać serwera autora programu, jeżeli oczywiście komuś nie przeszkadza fakt, że jego zrzuty hostuje ktoś inny ;P
Generalnie programik uważam za całkiem przydatny i to wcale nie dlatego, że jestem w nim wymieniony jako jeden z testerów ;]