Archive for the 'C#' Category

Niesforny statyczny konstruktor w C#

Wpis bardziej ‘ku pamięci’, ale może komuś zaoszczędzić kłopotów ;-)

Załóżmy, że mamy taki oto kod:

    class First
    {
        static First()
        {
            Console.WriteLine("First static constructor");
        }

        public static void DoSth()
        {
            Console.WriteLine("Let's do sth");
        }
    }

    class Second : First
    {
        static Second()
        {
            Console.WriteLine("Second static constructor");
        }
    }

Jeśli wywołamy metodę First.DoSth() w outpucie otrzymamy:

First static constructor
Let's do sth

Jeśli jednak spróbujemy z Second.DoSth() otrzymamy… to samo?! A gdzie wykonanie statycznego konstruktora klasy Second? Wszak w dokumentacji MSDN możemy przeczytać:

A static constructor is called automatically to initialize the class before the first instance is created or any static members are referenced.

I… to się zgadza! Podejrzyjmy Reflectorem jak kompilator zbudował aplikację:

W związku z tym, iż metoda DoSth() jest w klasie First, kompilator ‘olewa’ nasze wywołanie przez klasę Second, przez co statyczny konstruktor tej drugiej się nie wykona. Jest to o tyle niebezpieczne (co sam w swoim kodzie ‘przetestowałem’), że jeśli metoda DoSth() jest w jakikolwiek sposób zależna od wyniku statycznego konstruktora (a wcześniej nic i nikt nie odwoływał się do Second), to możemy spędzić trochę czasu na szukaniu błędu…

Klient REST w WCF

Jak już się napisało, że kiedyś opiszę się tworzenie klienta RESTa w .Necie, to słowa trzeba dotrzymać. Postaram się jak najzwięźlej opisać w jak dość prosty sposób można otrzymać taką funkcjonalność. Przykładem będzie właśnie API dla Blipa, bowiem to przy nim “wypłynęło” kilka ciekawych zagadnień.
Continue reading ‘Klient REST w WCF’

WCF + Blip = WcfBlip

Wyszło jak zawsze – przypadkiem. Wśród napisanych blipowych bibliotek znalazła się jedna dla .neta. Niestety, nie jest już rozwijana w związku z czym spróbowałem napisać swoją. Po kilku godzinach surfowania w Sieci udało mi się zdobyć na tyle dużo wiedzy nt. WCF by to właśnie w tej technologi wykonać bibliotekę. I myślę, że udało się, choć nie cała funkcjonalność API Blipa się w niej znajduje.

Pliki
kod źródłowy (Visual Studio 2008)
UPDATE [01.01.2010]
projekt na GitHub

Wymagania
.Net Framework 3.5

Użycie

Generalnie wszystkie wywołania metod znajdują się we właściwości Api klasy Blip. Jest tak dlatego, że podczas pobierania owej właściwości tworzony jest kontekst z wymaganymi przez API nagłówkami HTTP. Jeśli aplikacja, która piszesz łączy się z innymi źródłami danych przez HTTP, warto dla bezpieczeństwa wywoływać metodę Blip.Dispose() lub używać klauzuli using(), by usunąć kontekst.

Parametry przekazywane do wywołań niestety mogą być tylko typu string (wymóg WCF UPDATE: cóż, w innym kontekście może i można, ale ja dostaje wyjątek) i nie są w żaden sposób sprawdzane.

using (WcfBlip.Blip blip = new WcfBlip.Blip(“uzytkownik”, “haslo”)) // logujemy się
{
Updates[] updates = blip.Api.GetUpdates(); // pobiera ostatnie statusy użytkownika
Updates[] updates2 = blip.Api.GetUpdates(“10″, “5″); // pobiera 10 ostatnich statusów zaczynając od 5
User user = blip.Api.GetUser(“jack”); // pobiera dane nt. użytkownika “jack”
}

Trochę więcej przykładów znajduje się WcfBlipTest

Choć według opisu API jest podział na update’y, statusy, prywatne wiadomości i uwagi, to zdecydowałem się na jedną klasę Update, która to posiada właściwość Type, po której to można rozpoznawać typ wiadomości.

Do poprawki

  • uzupełnić brakujące metody (upload obrazków, avatarów, backgroundów)
  • dodać komentarze do kodu
  • dodać do klas encji właściwości zwracające nazwy użytkowników (a nie jak teraz – tylko ich URL)
  • wprowadzić obsługę błędów (na razie nie ma żadnej)

Licencja
MIT

Wszelkie komentarze i uwagi mile widziane :-)

P.S. W najbliższym czasie postaram się napisać o tworzeniu klientów REST w .Necie za pomocą WCF.

Mp3Arranger

Przetrząsając swój dysk w poszukiwaniu zaginionych plików muzycznych, zachciało mi się programu, który to zrobiłby porządek w katalogach układając je wg nazwy artysty i albumu. Nie doszukałem się takiej funkcjonalności w Winampie, a w Googlach nawet nie szukałem. W ramach poświątecznego ruszania mózgiem postanowiłem napisać sobie coś takiego samemu. Wybór padł oczywiście na C#.

Założenie było proste: na podstawie tagów w plikach muzycznych program ma pozakładać katalogi z nazwą artysty i podkatalogi z nazwami albumów oraz przenieść tam pliki.

Na oficjalnej stronie ID3 znalazłem odpowiednie implementacje dla C#. Wybrałem TagLib# ponieważ obsługiwał nie tylko Mp3, ale również Ogg i WMA (oraz jeszcze kilka innych formatów, których nawet nie używam). I tu chciałem zamieścić krótką informację. Skompilowana dll’ka, która jest tam dostępna ma problemy z innymi formatami niż mp3 – należy pobrać najświeższy kod z ichniego svna, wtedy wszystko działa.

Pliki:

Wymagany jest .Net 3.5 (nie chciało mi się zmieniać projektu na dwójkę… ;-) )

Features:

  • obsługa Mp3, Ogg i WMA
  • możliwość wprowadzenia własnych wzorców nazw katalogów
  • ubogi design ;-)

Known bugs:

  • niestety, TagLib# ma problemy z polskimi literami w tagach ID3v1 – rozwiązaniem jest używanie tylko IDv2 lub przymknięcie oka na “krzaczki” w nazwach katalogów ;-)

Licencja: WTFPL