27 lipiec 2008

przeciętny Kowalski....

Na warsztacie wystartowała kolejna już Wielka Warsztatowa Ankieta. Jest to już trzecia edycja, odbywającego się co dwa lata spisu. Celem, jest oczywiście władza nad światem, oraz poznanie preferencji członków warsztatowej społeczności. Ankietę możemy znaleźć tutaj, zaś informacje o niej w tym wątku na forum. Ankieta będzie trwać od 27 lipca do 10 sierpnia 2008. Z informacji o mnie: na tydzień wyjeżdżam więc prace koderskie będą na jakiś czas przerwane. Po powrocie mam zamiar wypuścić betę isabellFramework.

wirtualne zaufanie...

Ostatniego czasu przydarzyła mi się ciekawa przygoda, która może być przestrogą dla innych, choć nie jestem pierwszym, który miał okazję przeżyć coś takiego. 

Historia rozpoczęła się na allegro.pl :). Znajomy sprzedawał tam nowy telefon komórkowy - dość młody model Sony Ericssona. Aukcja nie należała do specjalnie zaciętych, pewnie przez dość wysoką cenę komórki. Pewnego dnia jednak, w skrzynce mailowej sprzedającego pojawił się dość interesujący list. Całość pisana w dość nieczęsto spotykanym języku - angielskim :). Jako, że byłem jedyną osobą w okolicy, która mogła pomóc w tłumaczeniu i ewentualnej korespondencji - zgodziłem się. E-mail dotyczył aukcji owego telefonu. Autor wyraził chęć szybkiego kupna oraz zaproponował cenę, która różniła od tej proponowanej na allegro, tylko walutą. Propozycja była niezwykle atrakcyjna, tym bardziej, że kupujący chciał płacić w dolarach amerykańskich. Pierwszą reakcją na tak intratną ofertę, było oczywiście zadowolenie, jednak w tle powoli rysował się strach przed oszustwem.  W odpowiedzi napisaliśmy, że zgadzamy się na transakcję, pod warunkiem, że kwota, którą zadeklarował autor listu, pojawi się na koncie sprzedającego. Odpowiedź była bardzo szybka (aczkolwiek dowiedziałem się o niej dopiero następnego dnia). Anglik podał adres na który należy wysłać telefon. Ku naszemu zdziwieniu była to... Afryka. Jednak w następnym liście wyjaśniło się, że ma być o prezent urodzinowy dla jego syna, który aktualnie pracuje w Nigerii.  Pisał również, że bardzo zależy mu na czasie, bo urodziny są już za tydzień i nie chciał spóźnić się z prezentem. Dostaliśmy także treść życzeń, które mieliśmy dołączyć do paczki.  Nasza odpowiedź była dość rzeczowa: podaliśmy dane niezbędne do przelewu (numer konta i bank) i powtórzyliśmy, że na początku muszą pojawić się pieniądze na koncie.  Następnego dnia dotarła do nas informacja, że przelew został dokonany. No cóż - pozostaje czekać aż pieniądze dotrą na konto. Kilka minut później jednak, w skrzynce odbiorczej znajomego pojawił się kolejny mail, tym razem od banku. Pierwszą rzeczą na która zwróciłem uwagę podczas czytania owego listu, był jego dość niezwykły wygląd. Nigdy nie sądziłem, że można mieć tak duże zamiłowanie do grafiki rodem z Wordowskich ClipArtów, zielonej czcionki i masy ozdobników. Treść nie była specjalnie interesująca - potwierdzenie wysłania pieniędzy. Postanowiliśmy poczekać, aż pieniądze dotrą do Polski. Tak jednak się nie działo. Po kilku dniach czekania, napisaliśmy, że bank wysłał do nas potwierdzenie przelewu, jednak wciąż czekamy na gotówkę. Tym razem odpowiedź była mniej miła od poprzednich. Autor był wyraźnie zirytowany. Poinformował nas, że bank czeka na nasze potwierdzenie wysyłki - dopiero wtedy będzie mógł przekazać pieniądze dalej. Rzeczywiście tak było, bo chwilę później przyszedł mail informujący, że należy przesłać do banku zdjęcie (lub skan) potwierdzenia wysyłki. W naszym kraju nie spotkałem się z podobnymi zabiegami, więc postanowiłem poszukać informacji w polskich i angielskich oddziałach tej instytucji. Tam jednak też nie oferowano tej usługi. Przeglądając uważniej maile z banku, zauważyłem link do strony, gdzie można było znaleźć bardziej szczegółowe informacje.  Klik. Moim oczom ukazał się czerwony obraz ostrzeżenia informującego o phishingu. Wszelkie wątpliwości zostały rozwiane. 

25 lipiec 2008

linkowanie zewnętrzne a wewnętrzne

Po naciśnięciu magicznej kombinacji CTRL + F5 uruchamia się tajemna maszyneria, za pomocą której, z naszego, pisanego w pocie czoła, tekstu, wyłania się (nie)działający program. Zazwyczaj szczegóły jak to się dzieje,  że zwykły plik tekstowy zostaje zamieniony na coś co czasem przypomina wirtualną formę życia, jest mało istotne. Są jednak detale, które powinny obchodzić każdego (nie)przeciętnego programistę. 

Proces budowania programu dzieli się na dwa etapy: kompilacja i linkowanie.  Pierwszy etap to utworzenie pojedynczych jednostek translacji. Polega to na rekursywnym dołączaniu, przez preprocesor tekstu, do każdego pliku cpp, odpowiednich plików nagłówkowych (#include). Po wykonaniu tych operacji, następuje kompilacja i zostaje utworzony plik *.obj o takiej samej nazwie. Gdy powstaną wszystkie jednostki translacji, linkier (konsolidator) łączy w całość powstałe pliki obj, dając nam wynikowy program (etap drugi).

Nie zawsze jednak jest tak różowo. Kompilacja jak i linkowanie mogą zakończyć się błędami.   Błędy kompilacji są zazwyczaj dość proste do naprawienia - IDE pokazuje nam miejsce wystąpienia oraz przyczynę.  Gorzej jest z błędami podczas linkowania, jednak i te po krótkim czasie stają się oczywiste. Najczęściej spotykanym problemem, jest użycie niezaimplementowanej funkcji lub metody (unresolved external symbol). Czasem w pośpiechu, zapomnimy o samej main() (unresolved external symbol _main), lub utworzymy zły typ projektu i zamiast WinMain napiszemy znane z konsloli main() (unresolved external symbol _WinMain@16).  Czasem możemy natrafić jednak na problemy zwiazane z powonym zadeklarowaniem, lub zdefiniowaniem obiektów, zmiennych. Jak się przed tym ustrzec? Poznać kilka prostych zasad ;)

Nazwa jest konsolidowana (łączona) wewnętrznie, jeśli jest nazwą lokalną wewnątrz jej jednostki translacyjnej i podczas linkowania nie koliduje z identyczną nazwą, zdefiniowaną w innej jednosce translacyjnej. 

No tak. Oczywiste prawda? Prawda ;) Po krótce, jeśli zdefiniujemy jakąś zmienną łączoną wewnętrznie w pliku cpp w globalnej przestrzeni nazw, zmienna ta będzie widoczna tylko w tym pliku i nie wywoła kolizji podczas linkowania z innym plikiem, w którym jest zdefiniowana inna zmienna o tej samej nazwie. Łączenie zewnętrzne działa w odwrotny sposób - dana definicja nie może zostać powtórzona w innych jednostkach translacji, bo wywoła kolizje podczas linkowania. 

Jakie typy są w jaki sposób łączone?

Linkowne zewnętrzne są:

  • definicje zmienych 
  • definicje funkcji i metod niebedących inline
  • statyczne składowe klas
  • deklaracje z modyfikatorem extern

Łączone wewnętrznie są:

  • deklaracje i definicje klas
  • definicje typów za pomocą typedef
  • metody klas typu inline
  • globalne definicje statyczne
  • typy wyliczeniowe
  • stałe

Pewnie nie to wszystkie możliwości, jednak te najważniejsze. Wiedza ta czasem okaże się przydatna, w szczególności gdy korzystamy z zewnętrznych bibliotek, pisanych bez użycia przestrzeni nazw i "podstawowych zasad bezpieczeństwa" ;) .