piątek, 10 lutego 2012

Nazywanie argumentów funkcji w C#

Ostatnio (dopiero) rozpocząłem poznawanie możliwości C# 4.0. Dzisiaj zachwyciłem się możliwością nazywania argumentów.

Ta cecha pozwala na zwiększenie czytelności kodu, a polega na poprzedzeniu argumentów funkcji ich nazwą. Na przykład dla funkcji obliczającej BMI (waga w kilogramach, wzrost w metrach)
static double CalculateBMI(double weight, double height)
{
    return ( weight / ( height * height ));
}

Można wywołać ją w następujący sposób:
double myBMI = CalculateBMI(weight: 85, height: 1.90);
Co więcej, możemy także zamienić kolejność parametrów!
double myBMI = CalculateBMI(height: 1.90 ,weight: 85);
Taki kod sam się dokumentuje, ponieważ od razu widać co robi dany literał w kodzie.

niedziela, 29 stycznia 2012

Szkolenie: "XNA - Szybki start" / Wrażenia / Relacja

Microsoft XNA
Image via Wikipedia
Tydzień temu dostałem e-mail z zapytaniem czy nie chciałbym uczestniczyć w Akademii Kontentu Microsoft. Moja decyzja (jak na mnie) była błyskawiczna - jadę.

Akademia Kontentu Microsoft zbiera chętne osoby do pisania artykułów np. do bazy wiedzy MSDN.

Jako środek transportu Szczecin<->Warszawa wybrałem nocny pociąg z miejscem leżącym inaczej bałbym się zabrać laptopa w taką podróż.

Przybyłem do Warszawy głodny, a zlezienie czegoś otwartego od 6:05 jest trudne, ale od czego jest McDonald?  Pierwszy raz jadłem ofertę śniadaniową, moim zdaniem to jest bez sensu. No ale mają WiFi i nie wyrzucają Ciebie za drzwi jak już skończysz jeść.


Image representing Microsoft as depicted in Cr...
Image via CrunchBase
Aby poznać Warszawę choć troszeczkę, postanowiłem chodzić niż wybierać komunikację miejską. Od Warszawy Centralnej do siedziby Microsoft Poland jest 1 godzina 15 minut pieszo i więc wiedz na co się decydujesz.

Jestem przyzwyczajony do chodzenia, a więc osoby które myślały, że zmarłem na zawał są w błędzie!

Spotkanie rozpoczęło się od wykładu/warsztatu dr Jacka Matulewskiego z Uniwersytetu Mikołaja Kopernika w Toruniu, na temat XNA 3D. Mówił o grafice 3D od zera w przeciągu pierwszej godziny omówił wiele aspektów grafiki 3D OpenGL'a jako bazy, ponieważ jest uczony także na uczelniach innych niż moja.

Szczerze mogę powiedzieć, że po tej godzinie mój poziom wiedzy z OpenGL oraz XNA 3D się wyrównał.

Następnie nastąpiła przerwa na pizzę aby mieć siły ruszyć do kolejnych zmagań z grafiką 3D. Skoro poruszyłem temat przerw, Microsoft posiada genialny ekspres do kawy... ah.

English: The wordmark of Microsoft's DirectX-A...
Image via Wikipedia
Wciągu następnej godziny warsztatów z grafiką 3D zmagaliśmy się shaderami (przypominam, że XNA na Windows Phone 7 NIE POSIADA programowalnych shaderów, używa się klas typu Basic Effect).

Muszę przyznać, że można było się sporo nauczyć z tego względu, że shadery były pisane od zera, a więc dowiedziałem się po co piszę każdą linijkę shadera. Bardzo pouczające. HLSL nie gryzie!

Prowadzący czasem używał FX Composer programu do programowania od NVIDII, muszę się temu narzędziu bliżej przyjrzeć kiedy w przyszłości będę się zajmował programowaniem gier.

Między czasie odbyła się wideokonferencja z leaderem Akademii Kontentu Microsoft, co sprowadziło się do podania terminów następnych spotkań.

Potem przyszła pora na człowieka z People Can Fly (firmy, która stworzyła Bulletstorm), opowiedział on o etapach produkcji gry. Od pomysłu, przez pierwszy pokaz gry, do finiszu i wydania gry. A po wykładzie nastąpił długo trwający Q&A, czyli pytania i odpowiedzi. Pojawiły się różne pytania np. jaka platforma jest najlepsza do pisania gier (PC, X360,PS3 czy może urządzenia mobilne lub gry sieciowe).
Bulletstorm
Image via Wikipedia

Najdłuższa dyskusja dotyczyła pytania: Dlaczego People Can Fly nie może znaleźć pracowników?

Chodzi o to, że PCF posiada test (słowo test pojawiało się często) jest to test wiedzy z C++. Czy on jest ciężki? Zależy czy masz odpowiednią wiedzę. Generalnie prowadzący Q&A dał mi do zrozumienia, że warto, ale to naprawdę warto przeczytać specyfikację C++, czyli taki dokument wg. którego później pisze się kompilatory.

Jeżeli czyta tego posta ktoś kto chce się ubiegać o posadę w PCF, to rzucam kolejną poradom sprawdzaj skrajne przypadki, zawsze.

Wymagania są wysokie, a uczelnie nie uczą C++ na tak wysokim poziomie. Na 30 CV zgłoszonych w przeciągu roku test przechodzi 0-1 osób.

A jeżeli ktoś nie przejdzie testu, to nie ma możliwości, że zatrudnią Cię. Programiści muszą przejść test.
Enhanced by Zemanta

sobota, 14 stycznia 2012

Tworzenie klasy do deserializacji pliku XML

Español: fotoXML
Image via Wikipedia
Jak zdeserializować plik XML jeżeli nie posiadamy klasy, która została zserializowana.
Do zdeserializowania pliku XML potrzebujemy odpowiedną klasę, która przyjmę dane z pliku.
Za pomocą narzędzia znajdującego się w Windows SDK możemy potrzebne klasy wygenerować. Owym narzędziem rozwiązującym problem jest xsd.exe znajdujący się domyślnie w katalogu:

(Windows 7 x64)
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin

Aby wygenerować potrzebną mam klasę uruchamiamy Visual Studio Command Prompt znajdujący się w:

Start->Wszystkie programy -> Microsoft Visual Studio 2010 -> Visual Studio Tools

Odtworzy się nam okno wiersza poleceń przechodzimy w nim do katalogu z naszym plikiem .xml i wykonujemy następujące czynności:
  • xsd filename.xml – tworzony jest plik XSD dla naszego pliku XML. Jeżeli takowy plik już istnieje pomijamy ten krok.
    • Plik XSD posiada opis schematu pliku XML (jakie pola występują w pliku)
    • Warto przejrzeć wygenerowany plik ponieważ to narzędzie przyjmuje że każda dana jest stringiem, warto zamienić odpowiednie wpisy w pliku na inny typ
    • Typ pola w XSD jest definiowany za pomocą atrybutu type, oprócz xs:string może zawierać następujące typy
      • xs:dateTime
      • xs:time
      • xs:date
      • xs:integer
      • xs: float
      • xs:double
      • resztę typów możliwych do wprowadzenie można znaleźć na stronach W3C
  • xsd filename.xsd /c – tworzone są klasy w języku C# 
    • Można również utworzyć klasę w innym języku korzystając z przełącznika /language.
    • Przykłady:
      • /language:VB – Visual Basic
      • /language:CPP – C++/CLI
  • Zdeserializować przy użyciu klasy XmlSerializer
Enhanced by Zemanta

wtorek, 6 grudnia 2011

Programmer Bot - wersja Alpha. Moje przeżycia część 2

Link do poprzedniej części moich przeżyć podczas pisania gry.

Przenoszenie kodu z C++ do C#
Musiałem przepisać kod, przy przekopiowaniu kodu musiałem pamiętać o:
  • różnicy w składni pomiędzy językami.
    • Największe różnice w składni napotkałem przy przepisywaniu klas.
    • kod wewnątrz funkcji większości identyczny
  • Zmienić wywołania w OpenGL na odpowiadające w OpenTK
    • Przykład: glTranslatef(1.0f,0.0f,0.0f); na GL.Translate(1.0,0.0,0.0);
    • Istnieje skrót klawiszowy zmieniający wielkości litery stojącej przed kursorem
      • Ctrl+Shit+U - Zmienia literę na wielką.
      • Ctrl+U - Zmienia literę na małą.
Przy okazji przepisywania kodu naprawiłem parę błędów (z kategorii Programowania Obiektowego), które powstały w młodej fazie projektu.

Pisanie w rytm Tick-Tock
Intel rozwija swoje procesory "w rytmie" Tick-Tock, każdy Tick to zmniejszenie architektury, a każdy Tock to wprowadzenie nowej architektury.

Zastosowałem podobny sposób pracy. W Tick dodawałem nową funkcjonalność do gry, a w Tock poprawiałem kod.

Ważną rzeczą dla mnie była czytelność kodu. Kiedy korzystałem z przykładowego kodu znalezionego w internecie np. dotyczącego ładowania i wykorzystywania shaderów. Wyciągałem w kodu to co najważniejsze i wkładałem w osobne klasy czy funkcję z zamysłem późniejszego wykorzystania.

sobota, 3 grudnia 2011

Programmer Bot - wersja Alpha. Moje przeżycia część 1

W pierwszym semestrze na 2 roku studiów na Zachodniopomorskim Uniwersytecie Technologicznym na kierunku Informatyka, jest zadanie. Trzeba napisać grę.

I to grę 3D.

Ludziom co nie znają poziomu ZUT'u dopowiem, że piszemy korzystając z OpenGL 1.1 - 2.1, czyli czegoś super wypas nie musimy robić, bo też narzędzia wydają się mało ostre.

Chyba w tym roku najpopularniejszym pomysłem wśród braci studenckiej są wyścigi 3 rzędowe. Przykładowa gra taka jak Wild Wild Taxi (gra flash).

Ja pomysł na grę także zaczerpnąłem z gier flashowych, a mianowicie z gry lightBot.

Nie zamierzam opisać tej gry, wystarczy przejść kilka pierwszych poziomów oryginału, aby wiedzieć z czym musiałem się zmagać podczas tworzenia tego klonu gry.

Start programowania, zgrzyt językowy
Domyślnie językiem, który każdy student na drugim roku powinien potrafić, to C. Obok zajęć z grafiki istnieje przedmiot programowanie obiektowe na którym zgłębiamy język C++.

Rozpocząłem projekt od zera, od pustego projektu konsolowego. Następnie dodałem biblioteki i zadbałem aby projekt był łatwy do przeniesienia pomiędzy komputerami. Biblioteki umieściłem w katalogu lib obok źródeł. A ścieżki dla kompilatora były podane jakie ścieżki pośrednie.

Gdy projekt osiągnął pułap 300-400 linii kodu, stwierdziłem, że język C++ spowalnia pisanie gry. Uciążliwe stały się pliki nagłówkowe które trzeba było pamiętać, aby je aktualizować za każdym razem gdy chcemy dodać, zmienić, zmodyfikować, usunąć funkcję.

Ponadto trudne do zrozumienia były błędy kompilatora, a sam proces kompilacji wydłużał się z powodu wielu zbędnych #includów. Wtedy zmiana jednego fragmentu programu powodowała re-kompilację całego projektu.

Poczułem, że za mało znam C++ aby mógł komfortowo z niego korzystać. Teraz czuję, że dalsze korzystanie z C++ mogło spowodować przyspieszone łysienie.
OpenTK
Jako, że znam C# chyba najlepiej z wszystkich języków to postanowiłem poszukać bibliotek które pozwoliły mi przenieść istniejący kod na C#

Przeszukując rożne istniejące biblioteki, których rozwój jest martwy lub nie całkiem martwy, wybrałem OpenTK
Zalety OpenTK:
  • Pozwala na wykorszystanie OpenGL 1.1, 2.0
  • Jest bibliotką niskiego poziomu
  • Posiada API do przechwytywania danych z klawiatury, myszy, josticka
  • Możliwość tworzenia okna przy użyciu OpenTK
  • Przykładowe programy.
Wady OpenTK:
  • projekt nie jest aktywny, ostatnia stabilna wersja datowana jest na 6-10-2010 (choć pojawią się nocne paczki)
  • nie wspiera najnowszych wersji OpenGL
  • Duża ilość śmieciowego kodu, oznaczonego jako deprecate

niedziela, 20 listopada 2011

Prezentacja drzewa binarnego za pomocą przeglądarki

Na laboratoriach z struktur danych tworzymy drzewo binarne, do prezentacji tego drzewa mieliśmy stworzyć prezentację semigraficzną. Taka prezentacja ma wadę  taką że w oknie konsoli zmieści się tylko mała ilość węzłów. Z moich szybkich szacowań w oknie konsoli nie zmieści się więcej niż 40 węzłów (trzeba zachować hierarchę etc.)

Miałem parę pomysł jak taki graficzną prezentacje zrobić:
  • wykorzystać bibliotekę taką jak SDL i wykonać obliczenia pozycji węzłów ręcznie i je połączyć za pomocą lini.
  • wykorzystać istniejące oprogramowanie takie jak: Graphviz
  • szukać czegoś w związanego z przeglądarką
Pierwsze pomysł odrzuciłem ponieważ wymagał zbyt dużego poświęcenia czasu (programowanie odbywa się w późnych godzinach wieczornych), o drugim wtedy nie pamiętałem.

Wszedłem na Google i rozpocząłem poszukiwania, wiedząc że coś z javascriptem musi być.

Moja pewność była spowodowana znajomością pewnego prawa w oprogramowaniu.
 Atwood's Law: any application that can be written in JavaScript, will eventually be written in JavaScript.
Rozpocząłem szukanie od strony Google Charts, przeszukałem wszystko i... nic odpowiedniego nie znalazłem, nie było nic tworzeniu grafów.

Niezrażony przeszukałem sieć pod kątem "graphs jquery". i znalazłem! Ale... znaleziony biblioteki wydały mi się zbyt skomplikowane jak do takiego małego problemu, do wróbla nie strzela się z armaty.

Zawiedziony rozpocząłem na nowo przeszukiwania Google Charts teraz stawiąc na coś co raczej przypomina coś co chcę stworzyć.

W oko padło mi Org Charts (służące do pokazywania hierarchii wewnątrz firm).

Niemalże wszystkie Charts jako dostawcy danych korzystają z google.visualization.DataTable(); jako dostawcy danych do tabel, rysunków etc.

DataTable dla Org Charts może składać się 3 kolumn (o dowolnych nazwach):
  • Pierwsza jest wymagana i posiada informacje o nazwie elementu. Ta nazwa musi być unikatowa wewnątrz całej tabeli. Można rozdzielić unikatową nazwę od nazwy wyświetlanej.
  • Druga kolumna jest opcjonalna i posiada informacje od rodzicu
  • Trzecia kolumna przechowuje tekst ToolTipa (informacji która się pojawia po najechaniu kursorem)
Wypełnienie danych w tabeli było proste, do póki nie doszło do wyświetlania :)

Chciałem aby wyświetlał się informacje o NULL'u (czyli że wskaźnik jakieś węzła nie posiada lewo/prawego potomka), a na stronie pokazywał się tylko jeden NULL.

Problemem było nie unikatowość NULL'a. Przypomniało mi się pewna rzecz z języka C#, tam aby coś miało unikalny identyfikator korzystało się z GUID'ów (jest implementacją UUID).

W C++ aby uzyskać GUID trzeba skorzystać z funkcji CoCreateGuid (która jest dostępna w za pomocą pliku nagłówkowego windows.h) w sposób następujący:
GUID guid
CoCreateGuid(&guid); 
Po wykonaniu tej funkcji struktura GUID zostaje zapełniona danymi. Kolejne części identyfikatora znajdują się w polach guid.Data1, guid.Data2, guid.Data3, guid.Data4.

I teraz dzięki unikalnemu GUID'owi oraz możliwości rozdzielenia unikalnego klucza oraz wyświetlanej nazwy, mogłem się cieszyć stroną internetową, która posiada hierarchię drzewa binarnego.

Przykłady wygenerowanych drzew:
Mała ilość danych, wartości wprowadzane z ręki

Dane losowe

środa, 9 listopada 2011

Kod mnożący dwie liczby w asemblerze bez używania MUL

Turbo Debugger 1.0 (1989) debugging a "he...
Image via Wikipedia
Mnożenie w asemblerze można wykonać za pomocą instrukcji MUL, jednak zadanie na Architekturze Systemów Komputerowych, brzmiało:
Dany jest 8-bitowe ‘a’ i ‘b’, a wynik to 16 bitowy zapis w zmiennej ‘wynik’ . Proszę wykonać operację mnożenia.
Zanim przejdę do kodu i jego omawiania trzeba poznać trochę logiki, która 'stoi' za algorytmem.
Algorytm rozkłada liczbę b na sumę potęg dwójki wykonuje mnożenie a potem sumuje wyniki mnożenia.

Ale przecież nadal mamy mnożenie liczb ze sobą! Tak to prawda, ale do mnożenia liczb które są potęgami dwójki nie musimy korzystać z instrukcji MUL a za pomocą przesunięć bitowych w prawo SHR i lewo SHL

Zakładając że liczba b wynosi 10 to wtedy algorytm by tak 'pracował'
Kod z komentarzami:
unsigned char a,b; //char'y są 8 bitowe (patrz treść zadania)
unsigned short int wynik = 0; // short int 16 bitowy (patrz treść zadania)
a=12; //Ustawiamy dwie wartości które chcemy przemnożyć
b=8;
//Rozpoczynamy wstawkę assemblerową
_asm
{ 
 mov dx,0 //kolejne sumy a << coś będziemy przechowywać w dx (patrz wzór)
 mov bl, b //kopiujemy do bl wartość zmiennejb
 mov cl, 0x00 //cl będzie przechowywać wykładnik potęgi 2 (patrz wzór) 
multi_loop: //etykieta służy później do przeskoków

 shr bl, 1 // przesuwamy bl czyli kopię naszej zmiennej o jeden bit w prawo
     // wartość na pozycji zerowego bitu (najbardziej na prawo)
     // wchodzi do flagi pożyczki (ang. carry flag)
     // dzięki temu wykonujemy dalsze przeskoki (ang. jumpy)
     
 jc multiply //jeżeli właśnie ustawiliśmy flagę pożyczki na 1
    //wykonaj przeskok do etykiety o nazwie multiply
    //jeżeli flaga pożyczki jest ustawiona na zero
    //to ta instrukcja nic nie robi
    
 jz end_multi //Jeżeli wyniku ciągłego przesuwania b wyzerowaliśmy b
        //to oznacza koniec mnożenia (nie ma już w b żadnych jedynek)
 
 jnc next_bit //To przypadek w którym nie wyzerowaliśmy b
     //oraz w bicie zerowym znajduje się zero
     //czyli przeskakujemy do next_bit

multiply:        
 mov al, a    //kopiujemy wartość a do rejestru al
 shl al, cl   //wykonujemy al=al*2^cl
 
 cbw          //abyśmy mogli przekazać wartość z rejestru 8 bitowego
     //do rejestru 16 bitowego musimy 'rozszerzyć' rejestr al
     //aby zajmował wielkość 16 bitową
     //do ax zostaje przypisana wartość al
    
 add dx, ax // wykonywanie dodawania jednego z czynników 
next_bit:
 inc cl     //zwiększamy o jeden wykładnik potęgi
 jmp multi_loop // wykonujemy bezwzględny skok do multi_loop
end_multi:
 mov wynik, dx //Przypisujemy wartość dx do wyniku
} //Kończymy algorytm.


Enhanced by Zemanta