Extension methods w C#

04.06.2009 @ 20:20:42 by Rafał Kozik | C# .NET

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 ikonki

30.05.2009 @ 14:57:38 by Rafał Kozik | webdev ajax

W 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 znaki

20.05.2009 @ 14:04:03 by Rafał Kozik | narzędzia

Od 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?

09.05.2009 @ 11:19:01 by Rafał Kozik | z życia

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# 2008

04.05.2009 @ 20:54:49 by Rafał Kozik | C# narzędzia

Potrzebował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 sort

01.05.2009 @ 01:50:08 by Rafał Kozik | programowanie C++

Dawno, 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 3h

15.04.2009 @ 22:39:12 by Rafał Kozik | .NET C# gamedev warsztat programowanie

W 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:

  • całość pisana w C# i GDI+ (standardowe rysowanie obiektem Graphics)
  • litery w 'intro' i 'outro' są zapisywane podczas preprocessingu do osobnych bitmap
  • podczas gry nie jest używana rotacja (która to byłaby dość wolna), ale podczas wczytywania danych generuję sporą ilość obróconych wersji robotów i pocisków
  • gdy robot jest niszczony, śmieci po nim pozostające zostają wkomponowane w bitmapę tła

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 PIMPL

06.04.2009 @ 23:04:34 by Rafał Kozik | programowanie C++

Piszą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.


SVN

27.03.2009 @ 10:47:04 by Rafał Kozik | programowanie narzędzia

Ludzie 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.


Aktualizacja freedoku

19.03.2009 @ 00:15:27 by Rafał Kozik | gamedev freedoku

Jest to pierwszy z wpisów o freedoku na moim blogu. Z czasem pojawi się tu ich więcej i choć głównie będą informować o aktualizacjach, pojawią się też takie, które będą opisywać rzeczy dziejące się pod maską.

  • można grać po popełnieniu 3 błędów, jednak licznik czasu staje się czerwony i nie pokazuje się okienko z gratulacjami
  • można klikać na paskach z ilością poszczególnych cyfr, żeby je podświetlić na planszy
  • w końcu zrobiłem sitemapę, co powinno z czasem przełożyć się na zwiększenie odwiedzalności
  • dodałem link do tego bloga (do taga freedoku)

Jeżeli ktoś znajdzie jakieś błędy, to proszę o napisanie w komentarzu lub na e-mail. Miłego grania.


  ... 2 3 [4] 5