Początek września to czas, w którym dużo się dzieje i dużo jest do zrobienia. Liście przestają się trzymać drzew, więc służby oczyszczania miasta mają co robić. Telewizje wprowadzają nowe ramówki, więc ich – nieliczni i wciąż ubywający – widzowie też mają co robić (i oglądać). Aha, no i oczywiście rozpoczyna się nowy rok szkolny, więc i uczniowie, i ich rodzice, i nauczyciele znów mają co robić.
Aczkolwiek jeśli chodzi o to ostatnie wydarzenie, to już od paru miesięcy wszyscy mieli się nad czym zastanawiać. Dylemat dotyczy głównie osobliwej i narzuconej odgórnie ‘mody’ na tzw. stroje jednolite. To oczywiście tylko jeden element wątpliwej jakości spuścizny po poprzednim ministrze edukacji, o którym napisano już jednak tyle, że chyba nie trzeba nic więcej dodawać :)
Na całe szczęście jako student już od trzech lat jestem całkowicie odporny na wszelkie pomysły osób zasiadających na tym stanowisku. I chociaż po drodze musiałem przetrwać inne “ciekawe” zmiany, jak choćby wprowadzenie gimnazjów czy nową maturę, wydaje mi się, że były one o wiele łatwiejsze do przełknięcia niż to, co jest serwowane uczniom w tym roku.
Wszystkim zmuszonym dzisiaj do marszu do szkół życzę więc powodzenia, a reszcie kształcących się – udanego ostatniego miesiąca wakacji :)
W czasach panowania języków proceduralnych i strukturalnych – jak C czy Pascal – możliwości ukrywania i ochrony kodu przed niepowołaną zmianą były, delikatnie mówiąc, słabe. Wszystkie funkcje, pola i struktury były dostępne na zewnątrz i tylko dzięki programistycznej kurtuazji (i czytaniu dokumentacji technicznej, o ile istniała) zawdzięczało się poprawne działanie kodu.
Sytuacja poprawiła się wraz z językami obiektowymi, takimi jak C++. Mamy już klasy, których składniki mogą być określone jako publiczne, chronione (protected
) albo prywatne. Jeżeli tylko odpowiednio oznaczymy składowe należące do implementacji, nikt niepowołany nie będzie miał do nich dostępu zwyczajnymi środkami.
Od tego czasu świat poszedł jednak do przodu pod względem technik organizacji kodu. Nowsze języki programowania – jak Java, C# czy Python – posiadają wbudowane mechanizmy pakietów (zwanych w .NET złożeniami – assemblies). Dzięki nim można grupować klasy wykonujące wspólne zadania i zapewniać dostęp do wybranych składowych wszystkich klasom z danego pakietu. W precyzyjnym określaniu widoczności celuje zwłaszcza C#.
W C++ teoretycznie mamy dość podobne możliwości, oferowane przez kilka osobnych mechanizmów językowych. Czymś co zdaje się najbardziej przypominać pakiety lub złożenia są przestrzenie nazw (namespaces). Ich przeznaczeniem jest przede wszystkich jednak zabezpieczenie przed dublowaniem i niejednoznacznością nazw. Na przykład klasa string
z STL jest zawarta w przestrzeni std
i dzięki temu nie będzie pomylona z jakąś inną klasą łańcuchów znakowych o tej samej nazwie.
Jednak przestrzenie nazw to bardzo ułomny sposób pakietowania. Elementy jednej przestrzeni (klasy, funkcje) domyślnie są dla siebie tak samo obce, jak te należące do różnych przestrzeni. Można to oczywiście zmienić, korzystając z deklaracji przyjaźni; wymaga to jednak znajomości wszystkich tych “przyjaciół” – czyli odpowiednich deklaracji zapowiadających – co jest bardzo niewygodne. Naturalnie można powiedzieć, że wtedy przynajmniej wiemy, kto nas “podgląda”. Lecz co z tego, skoro w takim zaprzyjaźnianiu stosować można wyłącznie zasadę wszystko albo nic: klasa/funkcja będzie widziała albo wszystko składowe, albo tylko publiczne (domyślnie). Bez pokrętnych sztuczek nie da się udostępnić pewnych składników tylko w ramach “pakietu”.
Całkiem osobną kwestią jest też to, jak mechanizm przestrzeni nazw współpracuje z tą zakałą C++, czyli plikami nagłówkowymi i dyrektywą #include
. W nowszym językach wystarcza instrukcja podobnej do tej:
żeby jednocześnie zadeklarować użycie pakietu i uchronić się przed koniecznością używania kwalifikowanych nazw (w tym przypadku np. ListBox
zamiast System.Windows.Forms.ListBox
). W C++ potrzebujemy do tego dwóch dyrektyw:
i niby wszystko byłoby w porządku. Problem w tym, że wielce inteligentny mechanizm plików nagłówkowych oraz #include
sprawia, że nazw niekwalifikowanych możemy używać praktycznie tylko w plikach *.cpp. Gdyby bowiem umieścić using namespace
w nagłówku, to instrukcja ta zostałaby bezmyślnie powielona we wszystkich plikach, które ten nagłówek dołączają. A wtedy przestrzeń nazw nie spełniałaby nawet tej najprymitywniejszej funkcji, czyli ochrony przed wieloznacznością powtarzających się nazw.
Tak naprawdę to same przestrzenie nazw nie są złe. Nawet same pliki nagłówkowe z C++ nie byłyby aż tak bardzo złe, gdyby ich zadaniem nie było tylko ułatwianie życia kompilatorowi. Dopiero połączenie tych dwóch rzeczy sprawia, że zdecydowanie odechciewa się używać którejkolwiek z nich ;P
Istnieje jednak pewien optymistyczny akcent. Jeśli kiedykolwiek zostanie zniesiony w C++ podział na dwa rodzaje plików z kodem, wówczas i przestrzenie nazw będą musiały się przekształcić w coś podobnego do pakietów Javy czy złożeń z .NET. Podobnie jest w drugą stronę: jeżeli C++ dorobi się mechanizmu pakietów, wtedy pliki nagłówkowe i dyrektywa #include
nie będą miały wielkiego sensu. Wypada więc tylko kibicować Komitetowi Standaryzacyjnemu w wykonaniu tego pierwszego kroku, bo drugi prawdopodobnie zrobią siłą rozpędu :)
Wszyscy zapewne wiedzą, że z okazji 15-lecia swojej obecności w Polsce Microsoft oferuje domową wersję pakietu biurowego Office 2007 za niecałe 200 złotych. Są w nim trzy klasyczne i najczęściej wykorzystywane programy, czyli Word, Excel i PowerPoint, oraz czwarta aplikacja – bardzo ciekawy wynalazek o nazwie OneNote. Za tę cenę (niektóre PC-towe gry kosztują niewiele mniej) to naprawdę doskonała okazja, więc oczywiście się na nią skusiłem :)
Najbardziej rzucającą się w oczy cechą tej wersji jeszcze rzecz jasna nowy interfejs, przypominający mi trochę paletę komponentów z Delphi (te same intensywne użycie zakładek). Początkowo dość ciężko się przyzwyczaić do braku paska menu i konieczności wybierania opcji z tej toolbaro-podobnej Wstęgi – jak ją MS ładnie nazwał – ale po jakimś czasie jest już nieco lepiej. Zdecydowanie ciężej nauczyć się obsługi np. edytora vi ;]
Pośród programów wchodzących w skład pakietu najbardziej tajemniczy był dla mnie czwarty z nich – OneNote. Okazało się jednak, że jest on z nich wszystkich najprzydatniejszy :) Śmiało mogę wręcz powiedzieć, że jest to aplikacja, o której marzyłem całe życie. Jest to coś w rodzaju menedżera umożliwiającego prowadzenie wirtualnego notesu. Zawarte w nim notki można katalogować wzdłuż, wszerz i w poprzek na wszystkie możliwe sposoby, a ponadto edytować w niezwykle swobodny sposób. Nic nie stoi na przykład na przeszkodzie, żeby po prostu kliknąć gdzieś na stronie i zacząć pisać. Potem można manipulować tak powstałymi polami tekstowymi, dodawać do nich obrazki, tabele, a nawet tekst z obrazków (przy pomocy modułu OCR). Generalnie jest to świetny program do spisywania pomysłów, wstępnych szkiców, projektów, przemyśleń, idei i w ogóle wszystkiego, co tylko przyjdzie nam do głowy. A dodatkowo wszystko to jest zapisywane automatycznie w określonym katalogu (domyślnie w Moich dokumentach) i nie rozłazi się po całym systemie.
I wszystko było cudownie, gdyby nie pewnie problemy przy… nazwijmy to, instalacji. No dobrze, powiem wprost – chodzi o pudełko, w którym kupuje się pakiet, a dokładniej o sposób jego otwarcia. Sprawa nie jest bowiem taka prosta, jako że spędziłem dobrym kilka minut szukając wskazówek na gładkiej powierzchni plastikowego prostopadłościanu o opływowych krawędziach. A rozwiązanie było całkiem proste: niczego się tu klasycznie nie otwiera, należy po prostu je odpowiednio… przekręcić :) Naciskamy po prostu na akcyzopodobną naklejkę na górze opakowania, przesuwamy je w prawo i voila, naszym oczom ukazuje się błyszcząca płyta DVD.
Mam nadzieję, że dzięki tej radzie ktoś zaoszczędzi sobie intensywnego główkowania, jak się do promocyjnego Office’a dobrać. A dobrać się naprawdę warto, bo taka okazja nie zdarza się często… Zapewne raz na 15 lat ;)
Wczoraj naszła mnie niesamowita ochota, aby napisać tekst. Taki zwyczajny programistyczny artykuł, w którym można poruszyć ciekawe sprawy i nauczyć czegoś czytelników. Podobne natchnienie ostatnio nie zdarza mi się często, więc żal byłoby go nie wykorzystać :)
Efektem jest dość spory tekst traktujący o pisaniu prostego modułu do grafiki 2D z użyciem DirectX – czyli czegoś, czym zajmowałem się kilka tygodni temu. Jak sądzę wyszedł z tego całkiem przejrzysty i przydatny opis, w którym udało mi się też poruszyć kilka różnych tematów z zakresu DXa ze szczególnym uwzględnieniem dynamicznych buforów wierzchołków.
Jak donosi Rzeczpospolita, w myśl precedensowego orzeczenia Sądu Najwyższego, serwisy internetowe należy traktować tak samo jak… prasę. Jeżeli tylko strona jest aktualizowania częściej niż raz na rok, podpada pod bycie czasopismem i jako takie powinna być zarejestrowana. Jeżeli zaś nowe treści pojawiają się na niej częściej niż co tydzień, wówczas jest już w myśl tego orzeczenia dziennikiem.
Absurd? Oczywiście. Nie pierwszy raz zresztą w naszym pięknym kraju powstaje prawo, które z logiką i zdrowym rozsądkiem ma niewiele wspólnego. Tak przynajmniej wydaje się na pierwszy rzut oka. Pomyślmy na przykład o sytuacji, w której istnieje strona dynamicznie generowana po stronie serwera – za każdym razem z inną zawartością – którą autor porzucił kilka lat wcześniej; czy ona nadal jest dziennikiem? A gdzie się “kończy” jeden serwis internetowy, a “zaczyna” drugi? To przecież niezbędne do określenia, ile tytułów należy zarejestrować! A jak określić nakład takiego “tytułu prasowego”? I tak dalej, i tak dalej…
Pomińmy to jednak i zastanówmy się, jakie konsekwencje miałoby zarejestrowanie wszystkich serwisów internetowych jako czasopism lub dzienników. Przede wszystkim nikt nie mógłby prowadzić np. anonimowego bloga, bo po jego nazwie z łatwością można by dotrzeć do “redaktora naczelnego”. Mit anonimowości w sieci jest naturalnie już dawno tylko mitem, jednak obecnie dotarcie do autorów treści publikowanych w Internecie wymaga interwencji służb porządkowych, zatem dotyczy tylko treści zabronionych przez prawo. W sytuacji gdy serwis jest tytułem prasowym, każdy może dotrzeć do tej informacji.
Ale to jeszcze nie wszystko. Najciekawiej wygląda połączenie pomysłu rejestracji stron jako prasy z utrąconym na szczęście projektem ustawy lustracyjnej. Zawarta w niej definicja dziennikarze obejmuje każdego, kto kiedykolwiek przesyłał jakiekolwiek materiały dowolnemu tytułowi prasowemu… Czy zamieszczanie niusów, komentowanie artykułów czy nawet wypowiadanie się na forum dyskusyjnym jest takim “dostarczaniem materiałów”? Jeśli serwisy internetowe są tytułami prasowymi, to czemu nie?
Tak oto wszyscy mogliśmy nagle stać się dziennikarzami. Pomyślmy, jakie wrażenie wywierałaby wtedy taka oto pozycja w CV:
2004 – 2007: intensywnie komentowałem wszelkie artykuły w Onet.pl jako czuly_wojtek
Kariera gwarantowana ;]
Dawno temu w firmie Xerox wymyślono, że interfejs użytkownika można zapakować w zestaw prostokątnych, nakładających się na siebie okien. Pomysł okazał się niezwykle trafiony i zaowocował nawet wielce kreatywną nazwą pewnego systemu operacyjnego ;) Od tamtej pory trudno sobie wyobrazić zaawansowane UI posługujące się czymś innym niż właśnie zestawem okien.
Nie jest trudno otrzymać na ekranie puste okno. W środowiskach RAD – w rodzaju Visual C# czy Delphi – mamy je najczęściej dane automatycznie, gdy tworzymy nowy projekt. W przypadku programowania niewizualnego (jak np. z użyciem czystego Windows API) sprawa jest nieco bardziej skomplikowana, ale i tak zamyka się w nie więcej niż kilkudziesięciu linijkach.
Takie puste okno wydawać się może mało interesujące czy wręcz zbyt oczywiste, aby zwracać na nie uwagę. Rzadko zwracamy uwagę na to, że ten pozornie trywialny prostokąt sam w sobie potrafi bardzo wiele. Wśród typowych możliwości mamy chociażby:
Uzyskanie podobnej funkcjonalności, zaczynając od zera, jest bardziej pracochłonne niż może się wydawać. W moim przypadku otrzymanie czegoś, co przypomina w pełni funkcjonalne i interaktywne okno, zamknęło się w ok. dwóch tysiącach linijek kodu – nie licząc oczywiście modułu grafiki 2D, potrzebnego do rysowania okien.
To całkiem sporo. Skutkiem ubocznym tej pisaniny jest też to, że obecnie patrzę na stare poczciwe okna systemu Windows z nieco większym respektem :)
W programie mIRC – kliencie IRC dla Windows – możemy definiować sobie przeróżne skrypty wywoływane przez komendy rozpoczynające od znaku backslash. Zintegrowany z programem język jest wprawdzie wybitnie toporny składniowo, ale oferuje całkiem spore możliwości.
Pozwala on na przykład definiować sposób, w jaki program ma reagować na pewne zdarzenia. Tego typu odpowiedzi programujemy za pomocą wbudowanego w program edytora skryptów. Wystarczy wybrać z menu Tools | Script Editor i przejść na zakładkę Remote, by wyświetlić i edytować plik remote.ini.
Możemy tam wpisać np. taką linijkę:
W ten sposób stworzymy prosty mechanizm automatycznego odpowiadania na powitania wypowiadane przez nowo przybyłych na kanał IRC. Bardzo podobnie można też – będąc opem lub halfopem – stworzyć prosty filtr wykopujący userów, którzy w wypowiedziach użyją przekleństw czy innych niedozwolonych słów.