Friday, 3 February 2006

Singleton w C#

Chyba najczęściej stosowany wzorzec projektowy. Bardzo często też implementowany błędnie - większość przykładów dostępnych w sieci nie bierze zupełnie pod uwagę wielowątkowości. Przykład na MSDN też nie jest idealny. Dobra, najpierw działający kod:


/// <summary></summary>
public sealed class Singleton
{
#region Singleton
/// <summary>ukryty konstruktor</summary>
private Singleton()
{}

/// <value>Dostep do instancji singletona</value>
public static Singleton Instance
{ get { return InstaceHolder.instance; } }

/// <summary>klasa wewnętrzna przechowująca instancję</summary>
class InstaceHolder
{
/// <summary>konstruktor statyczny,
/// by kompilator NIE oznaczyl klasy jako BeforeFieldInit</summary>
static InstaceHolder() {}

/// <summary>instancja singletona</summary>
internal static readonly Singleton instance = new Singleton();
}
#endregion
}

I po kolei, o co w tym chodzi. Sama klasa oznaczona jako sealed, czyli nie można z niej dziedziczyć. Nie chcemy, by ktos stworzył klasę potomną, która będzie pozwalała na utworzenie wielu instancji. Funkcjonalność zbliżoną do polimorfizmu może nam łatwo dostarczyć np. wzorzec State.


Konstruktor prywatny, żeby nikt nam "na boku" nie utworzył instancji klasy.


Własność publiczna Instance - jedyny dostęp do singletona. Metody niestatyczne będzie się w nim wywoływać przez Singleton.Instance.MojaMetoda();


Klasa wewnętrza pozwala nam na leniwe, czyli opóźnione utworzenie instancji. Dopiero pierwsze odwołanie do Singleton.Instance utworzy obiekt. Kostruktor statyczny w InstanceHolder wymusza na kompilatorze, by nie oznaczał klasy jako BeforeFieldInit. To znaczy, że pola statyczne zostaną zainicjowane dopiero przy pierwszym odwołaniu do klasy (dostęp do statycznego pola/metody lub utworzenie instancji), a nie "na zapas". Uwaga - chodzi o pola/metody klasy InstanceHolder, dostęp do statycznych pól czy metod Singletona nie spowoduje zainicjalizowania go.


Inicjalizacja singletona powinna trafić do prywatnego konstruktora, a nie statycznego. W ogóle - ze statycznymi konstruktorami lepiej ostrożnie. InstanceHolder.instance mógłbym zainicjalizować w static InstaceHolder(), ne? Haczyk znajduje się w specyfikacji języka C#.

The static constructor for a class executes at most once in a given application domain.

Najwyżej raz oznacza, że może nie zostać wykonany ani razu. Tak się dzieje np. w niektórych wersjach Mono.



Kod pochodzi z yoda.arachsys.com



UPDATE: na MSDN znalazłem poprawny i elegancki kod singletona, z innym podejściem niż pokazane powyżej.

Monday, 30 January 2006

Kanji, katakana etc.

Z zupełnie nieznanych dla mnie przyczyn, spora część moich najbliższych znajomych zanieczyszcza swoje przemyślenia dużą ilością znaczków spoza alfabetu łacińskiego. Jeszcze żeby ograniczali się do względnie małej (kilkadziesiąt glifów, jeśli się nie mylę) katakany. Ale jest pełen przekrój przez alfabety japońskie, znaki chińskie, niedługo pewnie ktoś zacznie dla sportu pisać po koreańsku…


Na pytanie jakiej czcionki potrzebuję, by nie widzieć wielokrotnych '?' w tekście ich stron otrzymałem standardową odpowiedź WFM. No tak, jak komuś system instalował informatyk w Chinach, to nie ma problemu z chińskimi czcionkami. Potem pojawiła się propozycja, abym z 'Panelu Sterowania -> Opcje Regionalne -> Języki' doinstalował obsługę języków wschodnioazjatyckich… Miałem mały problem - pod KDE nie ma Panelu Sterowania ;-) . A w Windows taka instalka waży dodatkowe 230MB. I u mnie, z nieznanych mi przyczyn, nie działa.


Na szczęscie Microsoft przygotował czcionkę Arial Unicode, dołączaną do Windows XP oraz Office'a 2000. Zaraz, u mnie znów jej nie ma. W legalnym Windows... chyba zbyt mocno "zoptymalizowałem" płytę instalacyjną. Dla podobnie zagubionych, którym Arial Unicode prawnie się należy, podpowiedź: plik nazywa się arialuni.ttf, waży ok. 23MB, i jest łatwy do znalezienia w sieci. Czcionka zawiera glify dla całej tablicy Unicode, pełen zestaw znaków chińskich, japońskich, koreańskich etc. Zainstalować i zapomnieć.


Jeśli używasz linux'a, pewnie nie będziesz kupować Windows XP tylko by dostać czcionki. Alternatywy OS pod gentoo pojawią się w systemie po wykonaniu polecenia


emerge media-fonts/kochi-substitute media-fonts/arphicfonts media-fonts/baekmuk-fonts

Pierwsza czcionka to znaki japońskie, druga chińskie a trzecia koreańskie. [info znalezione na Gentoo Forums]

Saturday, 28 January 2006

Microsoft - Plays For Sure?

Kupiłem w piątek czwarty odtwarzacz mp3. Pierwszy, jeszcze przed letnimi wakacjami, był Creative MuVo V200 512MB . Wybrany, ponieważ:

  • Creative ma reputację firmy znającej się na dźwięku komputerowym
  • flash (mały, lekki, dłużej działa na bateriach, jak spadnie nic mu się nie stanie, nie szkodzi mu bieganie/podskakiwanie/jazda na rowerze)
  • wpina się jako pendrive do dowolnego komputera z USB

Creative po dwóch miesiącach zaczął się wieszać. Odtwarzał, nagle przestawał, nie reagował na nic i pomagał mu tylko format. Serwis nic nie wymyślił, dostałem pieniądze z powrotem. Na całe szczęście. Shin'a MuVo, kupiony miesiąc wcześniej, działa, ale ze względu na nieprzemyślaną konstrukcję wtyczki USB - trzeba go było skleić taśmą, bo po prostu się rozpadł.

Kolejny zakup był przemyślany dokładniej. Do Creative'a nie miałem większych zastrzeżeń, ale po przebiciu się przez sporo recenzji na różnych stronach - wybór padł na iAudio. Snobizm trochę ;-) , ale iAudio i iRiver wszędzie chwalone są za najlepszą jakość dźwięku wśród odtwarzaczy. Oczywiście, kryteria stare nadal obowiązywały, a że pieniędzy miałem nieco więcej, zdecydowałem się na iAudio 5 1GB. Dodatkowo, nagrywając dźwięk (mikrofon "zbiera" jak porządny dyktafon) potrafi go w czasie rzeczywistym kompresować do mp3. Zastanawiałem się też nad iAudio U2 1GB, z tą samą elektroniką, ale akumulatorem wewnętrznym (odtwarzacz jest dzięki temu mniejszy), jednak przeważyła wygoda - wychodząc z domu mogę zabrać ze sobą dodatkowe baterie i wymienić, kiedy stare się wyczerpią. A odtwarza na jednej baterii jakieś 20 godzin.

Na gwiazdkę brat chciał tez odtwarzacz. Dostał taki sam, wersja 512MB. No i jeszcze siostra...

Siostra wymyśliła sobie czerwony. Koniecznie, żaden inny, nie metaliczny czerwony, wiśniowy, koniecznie musi być czerwony. Ugh... iRiver T10 512MB spodobał się. Wczoraj odebrałem go w sklepie, przyniosłem do domu... Działa. Dźwięk jak to iRiver - jakość bardzo dobra, nieco lepiej niż moje iAudio - ale to kwestia słuchawek, na takich samych - jakość jak dla mnie identyczna. Zdecydowanie lepsza, niż z wieży stojącej w pokoju ;-) Jest jeden haczyk, dla mojej siostry (na razie) niezauważalny.

iRiver T10 ze znaczkiem "Microsoft Plays For Sure" wymaga Windows Media Player'a 10. Koniec. Nie da się go podpiąć do komputera z Windows 98, nie ma mowy o żadnym Linuksie czy MacOS (chociaż podobno jakiś soft do obsługi aparatów fotograficznych potrafi wgrać na niego pliki). Nie jest też widoczny jako dysk, tylko jako MTP Device. Można, niby, wgrywać muzykę przez Explorer'a - ale nie np. Total Commander'em, bo nie odtwarzacz nie jest rozpoznawany jako napęd! Co więcej - jedyną zalecaną metoda wgrywania muzyki jest przenoszenie jej poprzez WMP 10. I to nie żart, mp3 wgrywane inaczej potrafią np. skakać przy odtwarzaniu czy się zacinać.

Jest wersja T10 oznaczana jako UMS, widoczna po wpięciu jako normalny napęd. Niestety, do kupienia tylko w Korei i okolicach. Na forum Mystic River jest sporo tematów z pytaniami o możliwość podmiany firmware'u wersji MTP na UMS. Jak na razie bez efektów.

Konkluzje? Unikać jak ognia odtwarzaczy z logo "Microsoft Plays For Sure". Ponieważ na pewno NIE działają bez Windows Media Player 10.

PlaysForSure logo

Thursday, 26 January 2006

Access Point

Planuję wyprowadzkę komputera z jego leża w piwnicy na górę, do mieszkania. Problem w tym, że o ile rodzinka nie miała nic przeciwko wierceniu dziur wielkości kciuka w ścianach w piwnicy (musiała przejść wtyczka RJ-11 :-) ), to raczej nie zgodzą się na robienie takich dziur w mieszkaniu, przez dwa piętra. No cóż, skoro nie można położyć przewodów, pozostaje łączność bezprzewodowa :-]

Zacząłem od sprawdzenia na pożyczonym sprzęcie, czy będzie wszystko działać na potrzebną mi odległość. Styka. Krok kolejny: do sklepu, wybrać jakiś sensowny AP z modemem DSL. I tutaj pojawił się problem. W interesującym mnie przedziale cenowym wybór jest dość spory - jak dla mnie zbyt spory ;-)

Po wstępnym przesiewie zostały

Wszystkie w tej samej cenie (380 złotych brutto), właściwe te same możliwości. D-Link polecany przez znajomego, który już ma sprzęt tej firmy. Linksys ma z kolei bardzo dobre recenzje w sklepie komputronika, i ku niemu bym się skłaniał. Edimax, dla mnie zupełny noname, interesujący jest ze względu na obsługę standardu 802.11g+, czyli transfer (teoretycznie) rzędu 108Mbps oraz WPA oprócz złamanego już WEP. I masz babo placek. Co do cholery wybrać?

Po fakcie: niestety, kupiłem D-Link'a G604T

Wednesday, 25 January 2006

Toshiba Satellite 2140 - tam i z powrotem

Znajoma narzekała ostatnio na problemy z laptopem. Że hałasuje, grzeje się i wygląda, jakby miał wybuchnąć. Na słuch - rozwalone chłodzenie? Dziś po zajęciach miałem ją odwiedzić i obejrzeć. Zabrałem mój uniwersalny śrubokręt™ i byłem gotów. Całe szczęście, że podczepił się jeszcze PiBis, zaopatrzony w zestaw wkrętaków zegarmistrzowskich, wielgachnym śrubokrętem wiele bym nie zdziałał. Ale na usprawiedliwienie - pozwala zrobić wszystko przy kompie stacjonarnym. Moja wina, że laptopy takie małe?


Na miejscu - Toshiba nie hałasuje. Oczywiście, przyszedł serwis ;-) to wszystko działa. Ale nie odpuściliśmy, żaden z nas jeszcze laptopa nie rozkręcał, mieliśmy taką okazję przepuścić? Po wykręceniu wszystkich widocznych (i nie - 4 były chowane pod akumulatorem) śrubek obudowa nadal nie dawała się otworzyć. Ja poszedłem zasięgnąć rady wyroczni, PiBis kombinbował. Był szybszy - ostatnie dwie śrubki okazały się ukryte pod płytką z przyciskiem 'Power'. Potem nastąpiła chwila wahania - czy po odczepieniu kabli łączących monitor/klawiaturę z resztą wnętrzności damy radę je zmonotowac ponownie? Zaryzykowaliśmy, płyta główna na wierzchu. Jeszcze tylko wymontować elegancki heatpipe i wentylator dał się wyjąć do czyszczenia. Wtedy w końcu ktoś zasugerował, że gdyby od początku robić zdjęcia, to potem byłoby łatwiej złożyć całość z powrotem :-] No, mądry Polak po szkodzie. Całe szczęście, że w Satellite każdy slot na śrubkę był elegancko opisany - bardzo dobry pomysł. Ale przynajmniej mamy dokumentację techniczną jak złożyć Toshibę Satellite 2140 z części :-D


Wymontowany monitor
Wymontowany monitor


Obudowa od spodu
Obudowa od spodu


Wszystkie wykręcone śrubki
Wszystkie wykręcone śrubki


Płyta główna bez wentylatora
Płyta główna bez wentylatora


Klawiatura, monitor, wentylator i heatpipe
Klawiatura, monitor, wentylator i heatpipe


Precyzyjne narzędzie każdego zegarmistrza
Precyzyjne narzędzie każdego zegarmistrza


Przedmuchiwanie wentylatora za pomocą odkurzacza
Przedmuchiwanie wentylatora za pomocą odkurzacza


Wentylator wraca na miejsce
Wentylator wraca na miejsce


Osłonka na CPU...
Osłonka na CPU...


Jeszcze tylko klawiatura
Jeszcze tylko klawiatura


Już wszystko podłączone
Już wszystko podłączone


Cztery połączenia, których się baliśmy
Cztery połączenia, których się baliśmy


Przed skręceniem warto sprawdzić, czy wszystko działa
Przed skręceniem warto sprawdzić, czy wszystko działa


To są właśnie te ukryte mocowania
To są właśnie te ukryte mocowania


A tak się je odczepia
A tak się je odczepia


Wkręcenie ostatniej śrubki
Wkręcenie ostatniej śrubki


Obudowa montowana jest 20 śrubkami!
Obudowa montowana jest 20 śrubkami!


Jeśli ktoś wie, co to za złącze, proszę o info...
Jeśli ktoś wie, co to za złącze, proszę o info...


I już po wszystkim.
I już po wszystkim.

Monday, 23 January 2006

Mmmm... upgrades.

Drobne poprawki na joggu. Po kolei:



  • Google Analytics, z hack'ami wziętymi od hao i riddle. Nareszcie koniec z moim pięknym inaczej licznikiem własnej roboty.

  • Feed RSS z newsami przez FeedBurner. Dalej w duchu zbierania statystyk. Korzystających z feed'a tutaj lub na uch0 proszę o uaktualnienie odnośników.

  • Ludzkie czcionki, w końcu miałem dość nieczytelnej Book Antiqua. Którą bardzo lubię - ale na papierze.


Za jakiś czas mam zamiar zrobić nowy layout, ten nie najlepiej świadczy o moich umiejętnościach :-/ No ale to po egzaminie inżynierskim.