Posts from 2009

override w C++, i nie tylko

2009-10-13 19:13

O braku słowa kluczowego override w C++ zdarzyło mi się już wspominać. Wskazywałem też, że jego niedobór jest całkiem istotnym brakiem, gdyż przypadki nadpisywania metod wirtualnych nie zawsze są zupełnie oczywiste.
Tym bardziej jest mi miło podzielić się odkryciem, które kiedyś poczyniłem na forum Warsztatu. Dowiedziałem się mianowicie, że słówko to do C++ można… dodać!

Jak to? – słychać pewnie pełne zdziwienia głosy. Ano bardzo prosto; zostało to zresztą wyczerpująco przedstawione w oryginalnym poście Esidara. Tutaj pokrótce tylko nakreślę jego ideę, która sprowadza się do genialnego spostrzeżenia, iż C++ zasadniczo radzi sobie bez override. A skoro tak, to jego wprowadzenie jest banalnie i wymaga zaledwie jednej linijki kodu:

  1. #define override

I już! Składniowo można go teraz używać dokładnie tak samo jak analogicznego słówka z C#… albo właściwie jakkolwiek inaczej – implementacja jest bowiem na tyle elastyczna, że zaakceptuje każde jego wystąpienie :) To aczkolwiek jest też, niestety, jego wadą…

W porządku, żarty na bok. Żeby ta notka nie była jednak zupełnie bezużyteczna, pokażę jeszcze, jak przekonać Visual C++, by nasze nowe słówko było przezeń kolorowane tak, jak inne słowa kluczowe w C++.
Da się to zrobić, tworząc (lub edytujący istniejący) plik UserType.dat, umieszczony w tym samym katalogu co plik wykonywalny Visual Studio (devenv) – czyli gdzieś w czeluściach Program Files, zapewne. W tymże pliku wpisujemy w nowej linijce override. Jeśli przypadkiem chcielibyśmy kolorować też inne, niestandardowe słowa kluczowe (to pewnie jest bardziej prawdopodobne), to każde z nich należy umieścić w osobnej linijce.
Po zapisaniu pliku i restarcie VS wystarczy teraz wejść w opcje programu, do zakładki Environment > Fonts & Colors, a tam na liście Display items zaznaczyć User Keywords i przyporządkować im wybraną czcionkę i/lub kolor. Możliwe zresztą, że w ogóle nie musimy tego robić, jako że domyślnie własne słowa kluczowe kolorowane są tak, jak te “oryginalne”.

Tagi kontra kategorie

2009-10-10 20:46

Tydzień temu pozwoliłem sobie na poprawienie strony pod względem formy, czyli zaaplikowałem zupełnie nowy layout. (Z opinii wynika, że nie wszyscy podzielają zdanie o jego lepszym wyglądzie, ale zakładam, że to głównie kwestia przyzwyczajenia ;]). Teraz przyszedł z kolei czas na usprawnienia funkcjonalne, by treść bloga można było przeglądać łatwiej, szybciej, przyjemniej, i w ogóle lepiej :)

W tym celu odchudziłem to wybitnie rozrośnięte drzewko kategorii, które przez bardzo długi czas zajmowało dużą część miejsca na pasku bocznym po prawej. Większość pozycji się nie ostała i teraz kategorii jest kilka razy mniej. Taki ruch był o tyle właściwy, że w założeniu kategorie powinny być tylko ogólnymi szufladkami do umieszczania w nich treści. Przy takiej ich ilości będą, jak sądzę, lepiej spełniać to zadanie.
Wycięcie wielu kategorii służących jako tematyczne etykietki (np. “Windows” czy “C/C++”) nie oznacza jednak, że nic już nie da się tutaj znaleźć. Ich funkcję (z nawiązką) przejmują bowiem tagi, i to łącznie ze sztandarowym wynalazkiem Web 2.0, czyli chmurką tagów :) Ona właśnie zajmuje “odzyskaną” przestrzeń bocznego paska.

Cała ta reorganizacja nie jest może tak zauważalna jak zmiana wyglądu, ale pozwalam sobie o niej napisać z jednego prostego powodu. Ponowne przejrzenie prawie 350 (!) notek, przydzielenie ich do odpowiednich kategorii oraz opatrzenie odpowiednimi tagami nie jest na pewno zadaniem na pięć minut. A skoro udało mi się tego dokonać, uważam za stosowne pochwalić się tym :P

Tags: ,
Author: Xion, posted under Website » 5 comments

Co to jest przeglądarka?

2009-10-08 22:31

Prawie dokładnie dwa lata temu pisałem o tym, że przeglądarki WWW wpisują w dziwny trend przyswajania sobie coraz to nowych funkcjonalności. Część z nich nie musi być zresztą w jakikolwiek sposób związana z przeglądaniem stron. Aż chciałoby się jeszcze dodać, iż wkrótce użytkownicy zapomną, do czego ich przeglądarki tak naprawdę służą oraz gdzie się “kończą”.

Loga trzech przeglądarekNo i voila – to już się dzieje. Oto powstała strona internetowa, z której można się dowiedzieć… czym są przeglądarki, dlaczego nie są tym samym co internetowe wyszukiwarki i czym różnią się od reszty systemu operacyjnego. Tę wiedzę możemy posiąść między innymi poprzez oglądnięcie wielce interesującego filmiku. Żeby było jeszcze zabawniej, wspomnę, że tę edukacyjną witrynę przygotował nie kto inny, jak tylko sam… Google!
W rzeczywistości jednak nie ma się z czego śmiać. Skoro już nawet tam dostrzegana jest potrzeba szerszego informowania o tym, że Firefox jest czym innym niż Windows, a pasek adresu to nie to samo co pole zapytań wyszukiwarki, to ze stanem tej wiedzy wśród tzw. przeciętnych użytkowników musi być naprawdę źle. A skoro granica między online i offline tak bardzo się zatarła, to ani się obejrzymy i zawód programisty zostanie zastąpiony przez web developera…Brr! Chciałbym, żeby tym razem moje przewidywania w tej dziedzinie się nie sprawdziły :P

Tags:
Author: Xion, posted under Internet » 6 comments

Ciągnięcie okna za wnętrze

2009-10-06 21:14

System Windows pozwala tworzyć okna o różnych niestandardowych właściwościach – między innymi takich, które nie zawierają żadnego standardowego elementu, jak pasek tytułu czy przycisk zamknięcia. Kiedy zechcemy umożliwić przesuwanie takiego okna, to natrafimy na klasyczny problem Windows API, który posiada kilka rozwiązań. I jak to często bywa, mało które jest dobre ;)

Najkrótszym jest obsłużenie komunikatu WM_NCHITTEST. Przy jego pomocy system pyta okno, w jaką jego część “trafia” (stąd nazwa hit test) podany punkt. Trik polega na oszustwie poprzez udawanie, że prawie całe nasze okno (a przynajmniej jego obszar klienta) jest paskiem tytułu:

  1. case WM_NCHITTEST:
  2.     LRESULT hit = DefWindowProc(hWnd, uMsg, wParam, lParam);
  3.     return hit == HTCLIENT ? HTCAPTION : hit;

Jest to jednak na tyle skuteczne, że wówczas nasze okno naprawdę zacznie składać z samego paska tytułu. Najpoważniejszym (acz wcale nie jedynym) skutkiem ubocznym tego faktu jest niemożność jakiejkolwiek interakcji z kontrolkami zawartymi w oknie. Jeśli więc mamy takowe, to mamy też kłopot :)

Można oczywiście załatwić wszystko ręcznie: wykryć przeciąganie (WM_LBUTTONDOWN), “złapać” myszkę (SetCapture), odpowiednio przesuwać okno (np. SetWindowPos) o różnicę początkowej oraz aktualnej pozycji kursora (w WM_MOUSEMOVE), a na koniec zwolnić gryzonia (ReleaseCapture) w odpowiedzi na koniec przeciągania (WM_LBUTTONUP). Uff… Sporo roboty, nieprawdaż? Tak to jest, kiedy oszustwo nie popłaca :)
A może jednak?… Pomysł z podszyciem się pod pasek tytułu wydawał się dobry, lecz sęk w tym, że nie potrzebujemy (wręcz nie chcemy) całej jego funkcjonalności. Dlatego zamiast dużego przekrętu posłużmy się małym: symulujmy tylko i wyłącznie wciśnięcia lewego przycisku myszy:

  1. case WM_LBUTTONDOWN:
  2.     SendMessage (hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0);
  3.     break;

Wciśnięcia kierowane w pasek tytułu, rzecz jasna. W ten sposób “wywołamy” niejako tę część jego możliwości, która nas interesuje – czyli przesuwanie okna. Jednocześnie, ponieważ robimy to dopiero w WM_LBUTTONDOWN, nie przeszkadzamy innym kontrolkom w odpowiadaniu na zdarzenia myszy.

To rozwiązanie ma jeszcze jedną zaletę: daje się je zastosować także w środowiskach, które nie dają łatwego dostępu do procedury zdarzeniowej okna – jak np. Windows Forms. W nich wystarczy wywołać SendMessage wewnątrz zdarzenia w rodzaju OnMouseDown (wciśnięcie przycisku myszy nad oknem).

Tags: , ,
Author: Xion, posted under Programming » 4 comments

Jest ładniej

2009-10-04 12:26

…i będzie jeszcze ładniej – niż jest. No, może niezupełnie – nietrudno bowiem zauważyć, że już teraz jest zupełnie dobrze. Zniknęła przecież ta niezbyt imponująca niebiesko-szara kolorystyka, okraszona tu i ówdzie pospolitymi gradientami. Na obecny, nowy layout powinno się już patrzeć zdecydowanie przyjemniej.
A skąd on się w ogóle wziął? Bo chyba nikt nie podejrzewa, że mój wybitnie ograniczony talent artystyczny zdolny jest do takich dzieł :) Faktycznie nie jest, a niniejszy szablon otrzymałem w prezencie od znajomej, utalentowanej graficzki i webdesignerki (zainteresowani mogą tutaj obejrzeć inne jej prace).

Docelowo trzeba było go oczywiście dostosować do współpracy z WordPressem, ale koniec końców okazało się całkiem wykonalne ;) Nie jestem wprawdzie wielkim fanem PHP, lecz akurat w tym przypadku prostota API, jakie należało przy okazji wykorzystać, była na tyle duża, że dało się to zrobić bez większych problemów. Jeszcze jeden dowód na to, że podjęta ongiś decyzja o wykorzystaniu właśnie WP okazała się nadzwyczaj trafna.

A zatem, skoro kwestia formy wydaje się na jakiś długi czas załatwiona, życzę wszystkim przyjemnego oglądania i czytania.

Tags:
Author: Xion, posted under Website » 20 comments

Pasek boczny czyli gadżetomania

2009-09-28 13:13

Po przesiadce na monitor typu widescreen (w moim przypadku 22-calowy) zaczyna się doceniać sens istnienia takiego wynalazku jak pasek boczny Windows. Na takim ekranie zmniejszenie obszaru przeznaczonego na okna nie tylko przeszkadza, ale wręcz pomaga w uniknięciu zeza rozbieżnego ;) A że przy okazji taki pasek może wyświetlać chociaż częściowo przydatne informacje – tym lepiej…
Zawsze jednak można chcieć więcej. Dlatego też przez te kilka ostatnich dni, kiedy to przygotowywałem do użytku dołączony do wspomnianego wcześniej monitora komputer (o czym pewnie wspomnę jeszcze później ;]), zainteresowałem się też tworzeniem swoich własnych gadżetów do umieszczenia na sidebarze. Zaprezentuję więc, co na ten temat odkryłem.

Jak wiadomo, pasek boczny Windows to właśnie skupisko takich gadżetów, które coś przydatnego pokazują i czasem są też interaktywne. Domyślnie mamy tu zegar, kalendarz, miernik zużycia procesora i pamięci, itp. Nie są więc one jakoś specjalnie zachwycające; lepiej byłoby mieć tutaj coś bardziej spersonalizowanego. A skoro umiemy kodować, to może dałoby się samemu taką wtyczkę napisać?… Okazuje się, że to całkiem proste – chociaż w nieco innym sensie niż mogłoby się z początku wydawać.
Prostota polega na tym, że tworzenie takich wtyczek nie wymaga programowania w klasycznym sensie. Są one bowiem głównie… zbiorami dokumentów HTML, czyli małymi stronami WWW. To, co widać na pasku bocznym jest zwyczajnie renderowane przez silnik przeglądarki IE7. (Pod tym względem pomysł przypomina trochę ActiveDesktop z Windows 95).

Naturalnie jest tutaj trochę dodatkowej roboty, polegającej m.in. na przygotowaniu manifestu, czyli dokumentu XML z opisem plików składających się na nasz gadżet – łącznie ze wskazaniem, który z plików HTML stanowi jego zasadniczą zawartość. Ponadto możliwe jest też utworzenie oddzielnego dokumentu (też HTML) z ustawieniami na gadżetu – sidebar udostępnia przy tym proste API, które pozwala na ich wczytywanie i zapisywanie. Podobnie jest z tzw. flyoutem, czyli częścią pluginu “wystającą” poza pasek boczny; tutaj też możliwe jest jej pokazywanie i ukrywanie.
Te bardziej zaawansowane funkcje wymagają już używania skryptów (np. JavaScript), ale nawet z niewielką ich znajomością można osiągnąć ciekawe efekty. Oto jeden z nich, jaki przy okazji poznawania tematu popełniłem – bardzo prosty gadżet, który umieszcza na pasku okienko na wpisywanie poleceń YubNuba (przydatnej usługi sieciowej, o której kiedyś pisałem):

File: Yubnub Gadget  Yubnub Gadget (43.1 KiB, 1,363 downloads)


Jeśli ktoś też chciałby pobawić się w tworzenie wtyczek do sidebara, to polecam odwiedzenie przede wszystkim tych linków:

  • Build Your Own Windows Vista Sidebar Gadgets – wyczerpujący artykuł omawiający wszystkie aspekty związane z tworzeniem gadżetów, łącznie z tymi bardziej skomplikowanymi, jak okienka ustawień i flyouty
  • Blog Tima Heuera skąd można ściągnąć szablon projektu dla Visual Studio, mogący służyć jako podstawa do tworzenia gadżetów (niestety jest tylko wersja dla VS2005)
Tags: ,
Author: Xion, posted under Programming » 3 comments

Przekierowanie z POST-em

2009-09-19 15:45

Oprócz ciasteczek (cookies) dwoma podstawowymi sposobami przekazywania parametrów na wejście serwera HTTP są metody znane jako GET i POST. Ta pierwsza wykorzystuje do tego sam adres URL, umieszczając dodatkowe dane po znaku zapytania, np.: /forum/showthread.php?id=12345&filter=none. W przypadku tej drugiej parametry są przekazywane poprzez treść samego żądania HTTP; z punktu widzenia użytkownika są więc one niewidoczne.
Metoda GET zwykle służy do wymiany danych między stronami połączonymi za pomocą zwykłych linków. POST z kolei wykorzystuje się do wysyłania informacji wprowadzanych przez użytkownika w różnego rodzaju formularzach. Przekierowanie następuje wówczas po jego wysłaniu, co zwykle czyni się odpowiednim przyciskiem (submit).

Bywa jednak tak, że chcemy dokonać takiego przekierowania – z ustalonymi parametrami – po zwykłym kliknięciu na link, z pominięciem wypełniania formularza przez użytkownika. Dobrym przykładem jest sytuacja, gdy nasza strona korzysta w jakiś sposób z innego serwisu, do którego przejście wymaga logowania. Jeśli chcielibyśmy, by odbywało się ono automatycznie – po kliknięciu jakiegoś linku – to musimy wysłać odpowiednie żądanie HTTP z parametrami przesłanymi metodą POST. Do tego nie wystarczy niestety sam znacznik <a>.

Rozwiązaniem jest wtedy użycie dodatkowej strony przekierowującej, na której umieścimy już odpowiednio “wypełniony” formularz:

  1. <form method="POST" action="http://someusefulwebsite.com/login">
  2.      <!-- parametry i ich wartości -->
  3.     <input type="hidden" id="user" value="qwerty"/>
  4.     <input type="hidden" id="pass" value="uiop"/>
  5. </form>

Oczywiście nazwy i wartości parametrów (zapewne generowane dynamicznie po stronie serwera) zależą ściśle od tego, dokąd chcemy nasz wyrób formularzopodobny wysłać. Wszystkie je deklarujemy jednak jako <input type="hidden" />, bo w założeniu użytkownik nie powinien ich (łatwo) zobaczyć. Ponadto, jeśli – tak jak wyżej – mówimy o loginie/haśle czy innych danych, które powinno się chronić przed niepowołanym dostępem, to powinniśmy jeszcze wysyłać razem z naszą stroną nagłówki HTTP zabraniające cache‘owania:

  1. // HTTP/1.1
  2. Cache-Control: no-store, no-cache, must-revalidate
  1. // HTTP/1.0
  2. Cache-Control: post-check=0, pre-check=0
  3. Pragma: no-cache

W końcu, skoro mamy już gotowy “formularz”, to trzeba jeszcze zadbać o to, by wysłał się on sam natychmiast po załadowaniu strony przekierowującej. Do tego już trzeba wykorzystać skrypt uruchamiany w przeglądarce:

  1. <script language="javascript" type="text/javascript">
  2.     document.forms[0].submit();

Tak przygotowaną stronę możemy podlinkować pod nasz serwis. Jak widać trochę z tym zabawy, ale tak to jest, gdy chcemy zrobić coś niestandardowego :)

Tags: , , ,
Author: Xion, posted under Internet » 3 comments
 


© 2021 Karol Kuczmarski "Xion". Layout by Urszulka. Powered by WordPress with QuickLaTeX.com.