Wakacji początek i... koniecPrzez cały ostatni miesiąc miałem sporo roboty -- koniec semestru, projekty zaliczeniowe, egzaminy. Dzisiaj pojawiły się wyniki ostatniego z nich, więc oficjalnie można powiedzieć, że mam (zasłużone) wakacje :).
Skoro, jak głosił napis z plakatu pewnego filmu (ciekawe czy ktoś go jeszcze pamięta), everything that has a beginning has an end, moje wakacje właśnie dobiegły końca. Jutro zaczynam pracę w Nokia Siemens Networks i mam nadzieję, że będzie ciekawie.
Powinienem znaleźć też trochę czasu na napisanie ciekawszych wpisów, które od jakiegoś czasu czekają w kolejce ;). Czas też zabrać się za pisanie projektu związanego z pracą magisterską, żeby nie robić tego na ostatnią chwilę. Nie będzie to nic bezpośrednio związanego z gamedevem, a coś więcej na ten temat napiszę tu pewnie w sierpniu.
Extension methods w C#W prawie każdym projekcie można znaleźć statyczną klasę/klasy pomocnicze, które zawierają operacje na jakiś danych, ale nie są obiektem w klasycznym sensie. Przykład takiej klasy:
static class Helper
{
public static string SHA1(string text)
{
byte[] buffer = Encoding.UTF8.GetBytes(text);
SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();
string hash = BitConverter.ToString(sha1.ComputeHash(buffer));
return hash.Replace("-", "");
}
}
Używamy tego tak:
string sha1 = Helper.SHA1(password);
Jak zrobić, żeby pisać mniej kodu i było wygodniej i czytelniej? W C# 3.0 zostały wprowadzone Extension methods, które nam w tym pomogą.
AJAXowe ikonkiW dzisiejszych czasach, tworząc jakąkolwiek stronę internetową nie wypada zapominać o użyciu AJAXa -- nie dość, że zmniejsza to ilość przesyłanych danych, to polepsza użyteczność.
Dopiero od niedawna zacząłem poznawać tę technologię i trzeba przyznać, że nie gryzie. Można nawet powiedzieć, że jest całkiem przyjemna w użyciu, zwłaszcza z biblioteką jQuery, której używam.
Strona, którą teraz tworzę wymagała różnych animowanych ikonek podczas ładowania. W jaki sposób najprościej je zdobyć? Wystarczy skorzystać z serwisu ajaxload, który pozwala na wygenerowanie ikonki dostosowanej do naszych potrzeb.
Windows 7, Notepad++ i polskie znakiOd jakiegoś czasu używam Windows 7 RC zamiast Windows Vista na laptopie, jako podstawowego systemu. Powodów ku temu jest kilka -- główne to większa wydajność, lepsze zarządzanie energią i zmiany w UI. Niestety pojawiają się mniejsze lub większe problemy, ale moim zdaniem warto się przemęczyć ;)
Jednym z problemów było to, że Notepad++ nie pozwalał na wprowadzanie polskich znaków, niezależnie od wybranej czcionki. Jako, że jest to jeden z podstawowych edytorów, których używam (właściwie do wszystkiego związanego z webdevem), to był to spory problem. Chwilę poszukałem rozwiązania dla tego problemu i okazało się to bardzo proste -- wystarczy ustawić kompatybilność ze starszą wersją systemu we właściwościach programu. Dokładniejsze informacje w dalszej części.
Kiedy mam się spodziewać przelewu?Trochę nietypowy wpis jak na ten blog, ale uważam, że warto się tym podzielić. Na pewno każdemu zdarzyło się czekać na to aż przyjdą pieniądze na konto i nerwowo odświeżać stronę internetową banku. Wychodzi na to, że jest to jedna z tych rzeczy, które nie mają większego sensu.
Przelewy między bankami realizowane są podczas sesji ELIXIR. Każdy bank ma indywidualnie ustawione godziny, o których realizuje transakcje przychodzące i wychodzące. Informacje o tym jakie to są godziny można znaleźć w tabelce na stronie money.pl.
Znając banki między którymi realizowana jest transakcja, można łatwo oszacować o której pieniądze znajdą się na naszym koncie ;)
Skróty w Visual C# 2008Potrzebowałem przed chwilą znaleźć kilka skrótów w Visual C# 2008 i okazało się, że nie jest to wcale takie proste. Większość elementów menu nie ma pokazanych skrótów, mimo, że takie istnieją, a obsługa listy w opcjach jest uciążliwa.
Okazuje się jednak, że przyswojenie skrótów może być prostsze niż się wydaje. Wystarczy pobrać i wydrukować... plakat ze strony Microsoftu. Dostępne są też dla innych wersji i narzędzi.
Skróty znacznie przyspieszają pracę, dlatego warto poznać kolejną ich garść. Plakat wiszący obok monitora wydaje się być idealnym rozwiązaniem :)
Radix sortDawno, dawno temu na slashdot pojawił się wpis Sort Linked Lists 10X Faster Than MergeSort. Okazało się, że twórca algorytmu wykazał się brakiem wiedzy i zaproponował algorytm Radix Sort.
Dzisiaj sam zaimplementowałem ten algorytm (okazało się to prostsze niż się spodziewałem) chcąc sprawdzić jak wypada w porównaniu do qsort z cstdlib i sort z STL.
Zrobiłem testy losując sporą ilość intów, a następnie sortując je każdym z algorytmów. Na koniec sprawdzam czy wynik działania wszystkich algorytmów jest taki sam. Wyniki okazały się zaskakujące -- nie spodziewałem się aż tak dużych różnic czasu. Wyniki poniżej.
Compo 3hW poprzedni weekend na warsztacie zostało zorganizowane trzygodzinne compo.
Jeszcze nigdy nie brałem udziału w tak krótkim pisaniu gry na czas, ale postanowiłem, że zobaczę co z tego wyjdzie. Ostatecznie zająłem 2 miejsce i jestem z tego zadowolony.
Gra (oczywiście niedokończona ;)), którą pisałem była klonem crimson landa i wypadła nienajgorzej. Całkiem ciekawe wydają mi się szczegóły techniczne, bo jadąc do domu na święta nie miałem dostępu do swojego kodu i pisałem kompletnie od zera:
Ciekawostką jest też to, że na procesorze C2D 1.8 GHz, użycie procesora według Menadżera zadań Windows nie przekracza 2%. Jak widać proste gry można spokojnie robić bez jakiejkowiek akceleracji ;)
Grę można zobaczyć tutaj.
Wynalazek zwany PIMPLPisząc biblioteki w C++ często można natrafić na problem wytworzenia wystarczająco dobrej enkapsulacji. Definicje klas, znajdujące się w plikach nagłówkowych, często pokazują za wiele: wszystkie prywatne pola i metody, które moglibyśmy chcieć ukryć. Dodatkowym problemem jest to, że praktycznie każda zmiana w implementacji wymaga zmiany definicji klasy, a to często przekłada się na konieczność ponownej kompilacji całego projektu.
Okazuje się, że istnieje bardzo proste rozwiązanie tego problemu -- PIMPL (private implementation):
// plik object.h
class ObjectImpl;
class Object
{
ObjectImpl* impl;
public:
Object();
~Object();
int SampleMethod(int x);
};
// plik object.cpp
class ObjectImpl
{
// Właściwa implementacja
};
Object::Object()
{
impl = new ObjectImpl();
}
Object::~Object()
{
delete impl;
}
int Object::SampleMethod(int x)
{
return impl->SampleMethod(x);
}
Oczywiście wypdałoby jeszcze dopisać konstruktor kopiujący i operator przypisania jeśli to konieczne.
Dodatkowo, można zmienić całkowicie implementację, a dla użytkowników klasy wszystko będzie wyglądać dokładnie tak samo. Jako lekturę uzupełniającą polecam to i stary wątek na forum gamedev.pl.
SVNLudzie mają wiele powodów, dla których nie używają systemów kontroli wersji. Najpopularniejsze z nich to chyba 'bo pracuję sam' i 'nie potrzeba mi tego' -- nie mam zamiaru tłumaczyć dlaczego te osoby są w błędzie ;) Ja osobiście miałem trochę inny powód -- nie chciało mi się z tym bawić.
Jestem jedną z tych osób, które nie do końca ufają serwisom zapewniającym hosting repozytoriów svn, ponieważ nie są one w żaden sposób szyfrowane. Dlatego jedynym rozwiązaniem, które mnie satysfakcjonuje, jest trzymanie repozytorium na prywatnym komputerze.