Przez ostatnie tygodnie występowało u nas zjawisko, które ciężko było zignorować. Każda taka próba była zresztą zupełnie sprzeczna z intencjami tych, którzy za owym zjawiskiem stoją. Podstawowym założeniem rzeczonego procederu było bowiem przede wszystkim zwrócenie na siebie powszechnej uwagi, wzbudzenie zainteresowania, chociaż ostatecznie głównym osiągnięciem było chyba tylko powodowanie niezdrowych emocji. Tak, mówię oczywiście o kończącej się właśnie kampanii wyborczej. I zanim rozpocznie się ustawowy, 44-godzinny okres ciszy, nie zaszkodzi się nad tym przez chwilę zastanowić (gwoli ścisłości: na pewno mi to nie zaszkodzi ;D).
Już wiele razy słyszałem, że jak dotąd to najważniejsze wybory w historii III (IV?) RP i pewnie jest w tym sporo racji. Świadczy o tym choćby fakt, że według sondaży zdecydowana większość obywateli planuje w tym roku pójście do urn, co u nas nie zdarza się zbyt często. Pewien (i to, jak sądzę, spory) wpływ na ten stan rzeczy może mieć również wysyp różnego rodzaju serwisów zachęcających właśnie do głosowania.
Zaczęły się one pojawiać wkrótce po ogłoszeniu decyzji o wyborach i każdy z nich stara się chyba prześcignąć pozostałe w znajdowaniu różnych powodów, dla których warto pojutrze oddać swój głos na wybraną partię. Do ciekawszych stron tego typu należą chociażby:
Jeżeli zaś jesteśmy już przekonani, że głosować pójdziemy, to wypadałoby jeszcze wiedzieć, na kogo :) Naturalnie malkontenci zawsze mówią, że “znowu nie ma na kogo głosować”, ale prawie połowa społeczeństwa jakoś sobie z tym wyborem radzi. Można rzucać monetą, patrzeć na sondaże, zastanawiać się który lider ładniej wygląda itp., lecz chyba lepiej kierować się programami (nawet jeśli to ‘tylko obietnice’).
A jeśli nie mamy ochoty na ich studiowanie, to i tutaj pomaga nam Internet. Serwis Wybory 2007 Wirtualnej Polski oraz strona twojwybor.pl oferują testy, składające się odpowiednio z 20 i 30 pytań, na które można odpowiedzieć i poznać przystawalność naszych opinii do programów różnych partii politycznych. Jednoznacznej odpowiedzi zapewne nie uzyskamy, lecz dla zupełnie niezdecydowanych rezultat może być przydatny.
Tak czy siak, na coś wypadałoby się zdecydować. A przy okazji można też pozazdrościć tym, którzy głosować jeszcze nie mogą i takich dylematów nie muszą rozstrzygać :)
Co do obrazka po prawej, to niniejszym informuję, że widoczna na nim kolejność symboli komitetów wyborczych wynika wyłącznie porządku alfabetycznego ich nazw :)
Po tygodniu używania systemu operacyjnego nazwie Windows Vista (w wersji Home Premium) mogę, jak sądzę, opisać swoje pierwsze wrażenia. Wbrew licznie powtarzanym opiniom i ostrzeżeniom okazało się, że te dziesięć miesięcy, które minęło od czasu premiery, wystarczyły, by system ten nadawał się już do używania na zupełnie normalnych komputerach.
Dwa najczęściej pojawiające się stwierdzenia na temat Visty to prawdopodobnie: bardzo duże wymagania co do sprzętu, “odpłacone” niską wydajnością oraz paranoiczny wręcz poziom zabezpieczeń obecnych w systemie, uniemożliwiający zrobienie czegokolwiek bez ciągłego, dodatkowego potwierdzania swoich zamiarów. Opinie te nie są oczywiście całkiem wyssane z palca, ale ich bezsprzeczna prawdziwość jest według mnie wysoce wątpliwa.
Vista wymaga oczywiście od systemu więcej niż jej poprzednik, lecz nie są to różnice aż tak drastyczne. Rzeczywiście pamięć operacyjna rzędu 1GB to rozsądne minimum, lecz tak naprawdę podobna jej ilość jest niezbędna, by wygodnie pracować także w Windows XP. Empirycznie stwierdzam bowiem, że system wraz z normalnym pakietem aplikacji działających w tle zajmuje w przypadku Visty tylko ok. 200MB RAMu więcej. Taki wzrost w ciągu 6 lat – które w świecie IT są całą epoką – to chyba nie jest bardzo dużo?…
Swego czasu głośno było też o tym, iż Vista wymaga karty graficznej wspomagającej wyświetlanie grafiki 3D do zwykłego działania. No cóż, ona nie tylko jej wymaga (co dzisiaj chyba nie jest zbyt wygórowanym żądaniem), ale też całkiem poprawnie wykorzystuje. Skutek jest taki, że GUI – mimo że “na oko” jest bardziej skomplikowane: te wszystkie cienie, animacje “rozdymania”, itd. – wyświetla się szybciej, a czas odpowiedzi jest wyraźnie niższy. Naturalnie jednak mógłbym to złożyć na karb faktu, że moja Vista jest świeżutka niczym trawka na wiosnę, a XP najlepsze miesiące ma już za sobą… A swoją drogą muszę też przyznać, że wygląd stylu interfejsu nowego systemu całkiem mi odpowiada. O ile Lunę (styl Windows XP) wyłączyłem właściwie natychmiast jako zbyt cukierkową, o tyle Aero wydaje mi się zgrabne i spójne. Co ważne jego kolorystykę można łatwo dopasować i trochę przeszkadza jedynie niezmienna czerń paska zadań.
A co z przeładowaniem mechanizmami bezpieczeństwa? Otóż na początku faktycznie mogą dać się one we znaki. Zwłaszcza w trakcie doprowadzania systemu do stanu używalności, czyli instalowania niezbędnych programów. System będzie bowiem prosił o potwierdzenie uruchomienia każdej aplikacji instalacyjnej – lecz na tym koniec; na pewno nie jest prawdą, że klikania wymaga każda zmiana dokonywana np. w Rejestrze. Poza tym mechanizm ten można oczywiście łatwo wyłączyć (Panel sterowania > Konta użytkowników > Kontrola konta użytkownika), a potem – jeśli bardzo chcemy – włączyć ponownie, gdy już zakończymy niezbędne czynności przygotowujące system do pracy. Sam aczkolwiek pozostawiłem ostrzeżenia permanentnie wyłączone. Jeśli bowiem przez pięć lat “nie udało mi się” popsuć Windowsa XP, to raczej nie potrzebuję aż takiej troski :)
Pozostaje jeszcze kwestia kompatybilności wstecz, która też najwyraźniej jest rozdmuchana. Przykładem jest choćby liczący sobie ponad dwa lata modem kablowy, który bez problemu zainstalowałem z użyciem sterowników przeznaczonych dla… Windows 2000. Zaś jeśli chodzi o programy, to sprawa zgodności wyskoczyła jedynie w trakcie instalacji Visual Studio 2005 i to od razu z sugerowanym przez system rozwiązaniem (którym była instalacja SP1), podanym w gustownym okienku komunikatu. I chociaż nadal nie lubię aplikacji, które starają się myśleć za użytkownika i robią mnóstwo rzeczy za jego plecami, akurat ten przypadek “inwencji” systemu oceniam jak najbardziej pozytywnie. W końcu unikanie problemów jest zawsze w naszym interesie.
A z Vistą tych kłopotów – wbrew obiegowym opiniom – nie ma znów, jak widać, aż tak wiele… Istnieje aczkolwiek niezerowe prawdopodobieństwo, że kiedyś przekonam się, iż jest inaczej ;P Cóż, miejmy nadzieję, że to tylko niczym nieuzasadniony pesymizm :)
Na dzisiaj mam drobną radę, jak poprawić wygląd kodu i wygodę pracy z nim, jeżeli akurat używamy któregoś z IDE (dla jakiegokolwiek języka) pod systemem Windows. Otóż w większości wypadków domyślną czcionką dla kodu, jaka jest w takich programach używana, jest Courier New. Ma ona oczywiście stałą szerokość znaków, ale właściwie na tym jej zalety się kończą… Zwłaszcza programiści pracujący czasem w Linuxie stwierdzić mogą, że fonty tam obecne są zdecydowane ładniejsze.
Dlatego do kodu polecam stosunkowo niedawny wynalazek Microsoftu, wprowadzony wraz z nowym Office’em – czcionkę Consolas. Jest ona wbudowana w Vistę, a jeśli używamy Windows XP, możemy się w nią zaopatrzyć na stronie MS. Wówczas do idealnego wyglądu powinniśmy jeszcze włączyć opcję wygładzania czcionek ClearType.
Przyznam, że kiedy kilka miesięcy temu zacząłem używać tej czcionki, dość trudno było mi się do niej przyzwyczaić. Teraz jednak na poczciwego Couriera patrzę już z dużym niesmakiem :) Consolas oprócz niewątpliwie większej wartości estetycznej ma też tę zaletę, że jej znaki są dość wąskie – a mimo to nadal doskonale czytelne. Sprawia to, że na ekranie mieszczą się linijki o znacznie większej długości, co dla programisty jest rzecz jasna bardzo wygodne.
Naturalnie nie twierdzę, że wszystkim akurat ta właśnie czcionka przypadnie do gustu. Zachęcam jednak, aby poeksperymentować z ustawieniami środowiska programistycznego, bo prawie zawsze można sobie choć trochę poprawić komfort kodowania.
W języku angielskim istnieje bardzo ciekawe słowo ‘serendipity‘. W skrócie, oznacza ono “umiejętność” dokonywania szczęśliwych i ważnych odkryć całkowicie przez przypadek – w szczególności wtedy, gdy tak naprawdę szukaliśmy czegoś zupełnie innego. Najciekawszą cechą tego słowa jest fakt, że bardzo trudno przełożyć je na język inny niż angielski przy pomocy czegoś krótszego niż podana wcześniej definicja (a już na pewno nie poprzez jeden wyraz). Dlatego też w 2004 roku znalazło się ono w czołówce najtrudniejszych do przetłumaczenia słów.
Czy w językach programowania możemy spotkać się z czymś podobny? Istnieją oczywiście tzw. idiomy, nakazujące by określone czynności robić tak, a nie inaczej – jak choćby słynny idom erase
–remove
z STL. Jednak tutaj chodzi mi raczej o taki element języka, który ułatwia życie albo po prostu jest w jakiś sposób nietypowy i – co najważniejsze – nie jest po prostu cukierkiem składniowym: jego przełożenie na inny język wymagałoby większej ilości kodu lub byłoby po prostu niemożliwe.
Jeżeli odpowiedź to pytanie jest twierdząca, to moimi osobistymi typami są:
for
w C++. Można ją rzecz jasna z powodzeniem symulować we wszystkich językach proceduralnych przy pomocy pętli typu while
, lecz jej elastyczność jest naprawdę zadziwiająca. Prawie komicznie wygląda pętla, w której wszystkie operacje wykonywane są w nagłówku, a jej zasadnicza treść jest pustym blokiemlist
, pozwalająca rozdzielić elementy tablicy pomiędzy ustalone zmienne za pomocą jednej instrukcji. Przydatna choćby przy przetwarzaniu rekordów baz danych czy parametrów GET i POST. Jej odpowiednikiem w innych językach jest po prostu odpowiednia seria przypisań.
Mid
z Visual Basica. Zasadniczo jej celem jest wyodrębnienie fragmentu łańcucha znaków i zwrócenie go, lecz może ona występować też po prawej stronie operatora przypisania. Wówczas służy ona do zastąpienia tegoż fragmentu innym tekstem, np.:
initalization
i finalization
w modułach Delphi. Zawarty w nich kod jest wykonywany jednokrotnie, odpowiednio: przy załadowaniu modułu oraz przy “sprzątaniu” w trakcie kończenia aplikacji. Nie jest to za bardzo przydatne w kodzie obiektowym – tym bardziej używającym odśmiecacza pamięci – ale podobny mechanizm występuje też w języku Python.x
, y
, z
lub w
) podajemy kilka:
Na pierwszy rzut oka może to wyglądać nieco zagadkowo, ale warto tej konstrukcji używać, gdyż karty graficzne dokonują swizzlingu albo za darmo, albo bardzo małym kosztem Zatem mamy tutaj elegancję, tajemniczość i efektywność w jednym, czyli to co programiści lubią najbardziej ;)
Ta lista na pewno jest o wiele za krótka. Jestem pewien, że programiści innych języków – tych co bardziej egzotycznych – mogliby dodać mnóstwo własnych typów.
Komputery maleją. To pewnie nic odkrywczego, ale trudno by było temu zaprzeczyć. Już od dłuższego czasu poczciwe blaszaki z dużą prostokątna skrzynką są wręcz wypierane przez te mniejsze – o wiele szczuplejsze i, przede wszystkim, bardziej mobilne.
Właściwie to ostatnio laptop stał się prawie synonimem komputera. Wystarczy obejrzeć dowolny film, serial czy nawet reklamę, by stwierdzić, że zdecydowana większość PC-tów, jakie tam występują to właśnie komputery przenośne. I to nawet wówczas, gdy nigdy nie opuszczają one przytulnych czterech ścian.
Sam od kilku już miesięcy zastanawiałem się nad kupnem komputera przenośnego, a ostatnio rozważania te stały się nawet intensywniejsze :) Posiadanie laptopa ma sporo zalet, jak choćby to, że:
Mając na uwadze powyższe argumenty (i pewnie nie tylko te) ostatecznie zdecydowałem się wczoraj na ten jakże ‘niezbędny’ zakup. I chociaż wybrany przeze mnie model nie jest może najwyższej jakości cudem techniki, ale do codziennej pracy czy nawet grania w niezbyt wymagające tytuły powinien w zupełności wystarczyć. Zresztą najważniejsze jest głównie to, aby bez problemów uruchomiło się na nim Visual Studio – z czym nie ma akurat najmniejszych problemów :)
Szablony to bardzo potężna część języka C++. Można przynajmniej powiedzieć, że spośród podobnych mechanizmów obecnych w wielu innych językach (jak np. typy generyczne z C# czy parametryzowane z Javy), daje on zdecydowanie największe możliwości. Ale, jak wiadomo, wszędzie można zawsze coś poprawić :)
Jednym z takich mankamentów jest choćby to, że póki co szablonowe – czyli opatrzone frazą template <...>
– mogą być tylko funkcje i klasy (pomijając dość specyficzny przypadek szablonowych deklaracji przyjaźni). To może się wydawać absolutnie wystarczające, ale istnieje jeszcze jeden potencjalny kandydat na “uszablonowienie”. Chodzi tu o deklarację typedef
.
Przydatność takiego ‘szablonowego typedef
‘ ukazuje się choćby w tym – przyznam że generalnie niezbyt mądrym – przykładzie tablicy dwuwymiarowej:
Nieco bardziej życiowy przypadek to zdefiniowanie własnego alokatora STL i chęć użycia go w standardowych kontenerach:
Widać, że w obu sytuacjach pewne fragmenty nazw typów powtarzają się, co zresztą sprawia, że nazwy stają się dość długie. Są to więc doskonali kandydaci do aliasowania poprzez typedef
, lecz jest tu jeden feler: w takim aliasie musimy dokładnie wyspecjalizować typ, któremu nadajemy nową nazwę. Nie można zatem zostawić sobie pewnej swobody w sposób, jaki się od razu narzuca:
Po prostu w aktualnej wersji C++ nie ma szablonowego typedef
. Obecnie można tylko zastosować pewien substytut, posługując się zwykłą definicją szablonu klasy:
która sprawi, że np. my_list
będzie naszą listą int
ów z niestandardowym alokatorem.
Niezbyt to zgrabne, ale na razie musi wystarczyć. Poprawy życia pod tym względem należy spodziewać wraz z C++0x, acz proponowana składnia “szablonowego typedef
” jest nieco inna od tej, którą zaprezentowałem wyżej.
W naturze gdy jakiś obiekt jest oświetlony, automatycznie powstaje za nim obszar cienia (a czasem i półcienia) tylko z tego powodu, że promienie świetlne są zatrzymywane przez ów przedmiot. Jest to w gruncie rzeczy bardzo proste zjawisko, lecz opiera się ono na śledzeniu torów promieni (raytracing) i dlatego wszelkie jego symulacje są kosztowne obliczeniowo. Oczywiście nie dotyczy to prawdziwych fotonów, bo one “same się śledzą” :)
Jeżeli więc chcemy mieć na scenie 3D coś, co przynajmniej stara się wyglądać jak prawdziwe cienie, musimy sami o nie zadbać. Sposobów na osiągnięcie tego celu jest oczywiście mnóstwo; różnią się one zarówno stopniem skomplikowania, jak i kosztem obliczeniowym czy “wspieralnością” przez różne karty graficzne.
Prawdopodobnie dwie najprostsze (i najszerzej obsługiwane) to:
Decyzja, którą z tych technik wybrać (czy może posłużyć się jeszcze jakąś inną), ma wbrew pozorom znacznie dalej idące konsekwencje niż tylko sam wygląd cieni czy szybkość ich generowania. W każdym przypadku inaczej wygląda bowiem ‘współpraca’ cieni z różnymi cechami materiałów, jak choćby półprzezroczystością czy mapowaniem nierówności.
Chwilowo bardziej skłaniam się ku shadow mapom z tegoż to ambitnego powodu, iż są prostsze w implementacji :) Wypadałoby jednak wpierw zrobić krótkie rozpoznanie ewentualnych problemów, jakie mogą z tego później wyniknąć…