Archive for the ‘Misc’ Category
Named Events - komunikacja między procesowa
czerwiec 27, 2008System Windows udostępnia nam mechanizm komunikacji między procesowej który wykorzystuje tzw. named events. Dzięki niemu możemy sygnalizować jak i monitorować, dowolnie utworzone przez nas zdarzenia np. pomiędzy dwoma różnymi programami, lub bądź chyba częściej spotykany, pomiędzy różnymi wątkami pracującymi w ramach jednej aplikacji. Ograniczeniem tego mechanizmu jest brak możliwości przekazywania danych, służy on jedynie do sygnalizacji.
Implementacja w .NET
Implementacją tego mechanizmu na platformie .NET jest klasa WaitHandle i jej pochodne jak np. EventWaitHandle. Jak to wszystko działa? Ano bardzo prosto, najpierw musimy niejako zarejestrować nasz event, przykładowo:
EventWaitHandle signal = new EventWaitHandle(false, EventResetMode.AutoReset, “UniqueSignalName”);
Określamy czy w momencie utworzenia zdarzenia, (jest to zdarzenie tyle, że nie w .NET’owym jego sensie), powinno być ono zasygnalizowane, parametr false. Następnie określamy za pomocą EventResetMode określamy sposób pracy. Do wyboru mamy AutoReset który zaraz po naszym sygnale przywróci poprzedni stan naszego zdarzenia i ManualReset który pracuje jak jak bramka, tzn. po włączeniu wysyła sygnał tak długo aż jej sami nie zresetujemy. Ostatni parametr jest domyślny i określamy w nim nazwę naszego eventu, szczególnie przydaje się gdy planujemy komunikację między procesami które nie będą miały dostępu do referencji naszego zdarzenia (np. pomiędzy różnymi aplikacjami). Nazwa jest globalnie widoczna w systemie i każdy proces może obserwować jej zmiany, (pomijam tu kwestie związane z uprawnieniami systemu Windows) .
Tak utworzonym obiektem możemy swobodnie operować. Aby dokonać sygnalizacji korzystamy z metody Set(). W przypadku gdy EventResetMode ustatiliśmy na ManualReset aby wyłączyć ’sygnał’ musimy skorzystać z metody Reset().
Przydatną metodą jest statyczną metoda OpenExisting klasy EventWaitHandle które umożliwia nam pobranie referencji do utworzonego przez nas zdarzenia, na podstawie jego nazwy np.:
EventWaitHandle signal =
EventWaitHandle.OpenExisting(“UniqueSignalName”);
Gdy kończymy korzystać z naszego obiektu EventWaitHandle zwalniamy jego zasobu przy pomocy metody Close().
Nasłuchiwanie zmian
Niestety mechanizm ten nie został zautomatyzowany i sami musimy sprawdzić czy aby nie zaszło któreś z interesujących nas zdarzeń. Pomogą nam w tym statyczne metody klasy WaitHandle: SignalAndWait(), WaitAll(), WaitAny(). Przykładowo poniższy kod oczekuje na któryś z dwóch sygnałów i dla każdego z nich wykonuje inną operację:
int ev = EventWaitHandle.WaitAny(new WaitHandle[] {signalA, signalB}); switch (ev) { case 0: Console.WriteLine(“Signal A …”); break; case 1: Console.WriteLine(“Signal B …”); break; }
Zwykle kod nasłuchujący warto jest umieścić w osobnym wątku aby nie blokować głównej pętli programu.
Przykład
Przykład składa się z dwóch prostych aplikacji konsolowych z których jedna tworzy zdarzenia (EventCreator) a druga ich nasłuchuje (EventSubscriber). Uruchamiając należy pamiętać o kolejności.
Implementacja w .NET CF
W najnowszej wersji .NET Compact Framework 3.5 pojawiła się implementacja klasy EventWaitHandle niestety pozostawia ona sporo do życzenia. Przede wszystkim nie umożliwia nadawania nazwy naszym zdarzeniom co ogranicza nas do komunikacji w ramach jednej aplikacji. Nie udało mi się również zmusić jej do współpracy z metodami natywnymi (P/Invoke). Nic jednak straconego, w książce ‘Mobile Development Handbook‘ autorzy zamieścili własną implementację, pracującą poprawnie jak i zawierającą kilka dodatkowych metod dostępnych w pełnej wersji .NET Framework’s. Kod źródłowy przykładów załączonych do książki można znaleźć tutaj.
Device Security Configuration
czerwiec 25, 2008Znacie to uczucie gdy czas was goni, a narzędzia które normalnie działają, postanawiają sobie zrobić wolne? Myślę, że tak. Pół biedy jeśli przyczyna niesprawności jest nam znana - wtedy możemy się zżymać na złośliwość rzeczy martwych. Jeśli jednak nie mamy pojęcia gdzie leży problem, nie pozostaje nam nic innego jak uzbroić się w cierpliwość i szukać rozwiązania.
Dzisiaj ni stad ni zowąd Device Emulator postanowił odmówić mi współpracy. Próby uruchomienia aplikacji z poziomu Visual Studio 2008 kończyły się następującym komunikatem:
“Error 82 The device security configuration disallowed the connection. Ensure that you have the appropriate certificates on your device for development. Review your SDK documentation for proper security settings for connecting to this device. Device Connectivity Component “
Jakimś trafem emulator zgubił moje certyfikaty SDK. Aby je przywrócić możemy skorzystać z Device Security Manager’a (VS 2008 menu Tools). Łączymy się do wybranego urządzenia a następnie wybieramy opcję Certificate Management. Zostaną nam wylistowane wszystkie dostępne certyfikaty danego urządzenia. Następnie Add Certificate:
![]()
i Manage Certificates:
![]()
Wybieramy przycisk Import i wskazujemy lokacje plików *.cer. Domyślnie dla Windows Mobile 6 SDK znajdują się one w katalogu: C:\Program Files\Windows Mobile 6 SDK\Tools\Security\SDK Development Certificates. Musimy zainstalować osobno trzy certyfikaty: FailsafeEmulator.cer, SamplePrivDeveloper.cer, SampleUnprivDeveloper.cer i gotowe.
Jedno mnie dziwi, zanim re-importowałem certyfikaty, powyższy problem występował niezależnie jakiego obrazu korzystałem. Jednak po ich zainstalowaniu, tylko na jednym ‘urządzeniu’, wszystkie inne również zaczęły działać.
HTC, Android i Windows Mobile 7
czerwiec 20, 2008HTC ogłosiła wprowadzenie nowych systemów operacyjnych do swoich urządzeń. Chodzi mianowicie o Windows Mobile 7 i bazujący na linuxie Google Android. O ile produkt Google’a jest gotowy i dostępny do pobrania, Windows Mobile 7 jest cały czas w fazie przygotowania.
Microsoft zapowiada, że nowy system wyeliminuje bolączki poprzedników szczególnie te związane z interfejsem użytkownika. Osobiście jestem trochę sceptyczny, pamiętam szumne zapowiedzi Windows Mobile 6. I co z nich wyszło - ano Windows Mobile 5 z kilkoma nowymi funkcjami i nieco zmienionym interfejsem. Kluczowe problemy jednak pozostały. Na obronę MS możemy powiedzieć, że wraz z wydaniem systemu WM6 narzędzia developerskie zostały znacząco ulepszone, jednak to, chyba nie interesuje użytkowników końcowych.
Ostatnio miałem okazję, wziąć w moje łapki nowość HTC Touch Diamond, pierwsze odczucia - super. Idealne urządzenie PDA o rozmiarach małego telefonu - albo właściwszym było by powiedzieć telefon z funkcjami PDA. Duży ekran, przyzwoity aparacik i mógłbym się na niego skusić, nawet pomimo tego, że wolę urządzenia z pełną klawiaturą (tutaj Sony Ericsson Xperia X1 wygląda interesująco). Jadnak IMHO urządzenie cierpi na tą samą bolączkę co jego pierwowzór HTC Touch - fajne UI sporo wodotrysków (nie mówię, że tego nie oczekuję) ale urządzenie pracuje jakoś tak … wolno. Co jak co, ale książka telefoniczna powinna działać szybko, funkcjonalność przede wszystkim.
Teraz jestem ciekaw czy główną przyczyna problemów z szybkością leży po stronie urządzenia czy systemu? Będziemy mogli sobie to porównać gdy np. HTC wprowadzi swojego Diamond’a z systemem Google Android. Cokolwiek by nie było, pojawienie się nowych systemów, to krok w dobrą stronę. Na pewno spowoduje sporo trudności z synchronizacją danych, kompatybilnością aplikacji myślę jednak, że wzmoże on konkurencję i przypomni gigantowi z Redmond, że niemożna zasypiać gruszek w popiele.
Update 23/06/2008:
Właśnie sobie czytam o poprawkach w TouchFLO 3D dla HTC Diamond’a. Widać nie tylko ja zwróciłem uwagę na jego powolne działanie.
Podcasty
maj 18, 2008Moja lista subskrybowanych podcast’ów wydłuża się. Właśnie ukazał się drugi odcinek, nowego show - ALT.NET Podcast. ALT.NET jest społecznością skupiająca deweloperów zainteresowanych technikami TDD & Agile - więcej można znaleźć tutaj.
Poniżej lista technicznych programów, których słucham:
- Hanselminutes - chyba każdy kojarzy Scott Hanselman’a.
- DNR TV - screncast’y obracające się wokół technologii .NET.
- .NET Rocks! - Carl Franklin & Richard Campbell prezentują.
- Polymorphic Podcast - technologia .NET z naciskiem na ASP.NET
- Dr. Dobb’s Ask Udi Podcast - programiści pytają Udi odpowiada.
- Agile Toolkit Podcast - jak sama nazwa wskazuje tematyka agile.
- Software Engineering Radio - generalnie o programowaniu.
- RunAs Radio - kolejna produkcja panów z PWOP Productions.
- Rubiverse Podcast - Ruby.
- Java Pose - wieści ze świata Javy.
- IT Conversations - generalnie świat i życie w kontekście IT.
- Geek Brief - videocasty, wiadomości, gadżety etc.
- Mondays - technicznie nie technicznie, ale całkiem niezła dawka humoru w amerykańskim wydaniu. Cóż śmiech jest zaraźliwy
To chyba wszystko. Jeśli ominąłem coś interesującego dajcie mi znać.
Pimp My IDE
maj 17, 2008“Pimp My IDE”: 101 Visual Studio tips, tricks, and add-ins - czyli wszystko, co najlepsze dla Visual Studio. Tak na marginesie to się zastanawiam, kiedy chłopaki z JetBrains w końcu wydadzą nowego ReSharper’a. Jak na razie można korzystać z 30 dniowych wersji Early Access Program (EAP), ale są to mniej lub bardziej działające, nocne build’y teamu deweloperskiego. Więcej informacji można znaleźć tutaj.
Code Camp w Krakowie
maj 17, 2008W czerwcu, w Krakowie będzie miał miejsce CodeCamp. Jeśli się nie mylę to pierwsza impreza pod tym szyldem w Polsce. Całość zapowiada się interesująco i mam nadzieję, że będę mógł w niej uczestniczyć. Trzymajcie kciuki!
Oszczędność nie popłaca
maj 14, 2008Jestem świeżo po sesji z debuggerem. Ostatnio aktualizowałem bazę danych SQL CE z wersji 3.1 do 3.5, w wyniku czego pojawiły się dziwne problemy z wstawianiem danych. Otóż raz na jakiś czas dane binarne dodawane do bazy były uszkodzone.
Gdzie tkwił problem? Ano w oszczędności znaków (czytaj: lenistwie). Przykładowo definiując parametr dla obiektu SqlCeCommand, w sposób:
cmd.Parameters.Add(new SqlCeParameter(“FileData”, question.FileData));
Nie określamy w sposób jawny jego typu. Silnik SQL CE musi niejako sam go sobie zgadnąć i akurat w tym przypadku robił to błędnie. Zamiast zdefiniowanego w tabeli typu Image stosował varbinary(8000). Dlatego też gdy rozmiar danych będzie mniejszy lub równy 8000 bajtów wszystko działa bez zarzutu. Jednak jeśli rozmiar przekroczy magiczną wartość 8000, dane zostaną, że tak się wyrażę ‘przycięte’ i w ten sam sposób uszkodzone. Rozwiązaniem oczywiście jest jawne zdefiniowanie parametru:
SqlCeParameter fileDataParameter = new SqlCeParamete(“FileData”, SqlDbType.Image);
cmd.Parameters.Add(fileDataParameter);
fileDataParameter.Value = question.FileData;
No to zaoszczędziłem sobie dwie linie kodu.
Compact Framework Profiler
maj 12, 2008Firma EQATEC wydała profiler przeznaczony dla aplikacji pisanych na .NET Compact Framework. Program umożliwia jedynie pomiar czasów wykonania poszczególnych procedur i nie podaje żadnych dodatkowych informacji jak np. stan pamięci.
Sama obsługa programu jest dziecinnie prosta, kompilujemy naszą aplikację a następnie wskazujemy profilerowi pliki które chcemy przebadać. Profiler dodaje co potrzebuje do naszych plików i możemy rozpocząć testowanie na naszym urządzeniu. Po zakończeniu, wyniki zapisywane są do pliku xml, którego zawartość możemy przeanalizować w specjalnej przeglądarce. Program udostępniany jest za darmo i dostępny jest tutaj.
Object Thinking
maj 7, 2008Będąc w Galway wysłuchałem prezentacji ‘Object Thinking’ Alan’a Deana. Początek prezentacji, trzeba to powiedzieć, był zniechęcający, pojawiło się sporo akademickich formalizmów, mających nikłe odzwierciedlenie w codziennym życiu. Przykładowo przydługawe, dywagacje o tym który z terminów jest właściwy: software developer czy software engineer? Dość mistrzu, nie po to tu przyszedłem, nawijaj o obiektach.
Jednak gdy doszliśmy do meritum prezentacji, przestałem ziewać i zacząłem słuchać . Otóż padła propozycja aby odrzucić dotychczasowy sposób myślenia o klasach jako o zbiorze pól i właściwości, no i metod ale o nich za chwilę, i zastąpić je koncepcją samo-opisywalności. Zgodnie z propozycją, najprostsza, definicja klasy wyglądała by następująco:
public class Customer : Dictionary<Uri, Object> {}
Ciekawe prawda, ot taki pojemnik na wszystko. Metody, rzecz jasna, pozostają a ich celem jest opisywanie intencji klasy.
Uzasadnieniem takiego podejścia do klas, jest twierdzenie, że zdecydowana większość modyfikacji jakie, jesteśmy zmuszeni wprowadzać, dotyczy właśnie sposobu reprezentacji danych. Oczywiście tego typu zmiany zwykle, powodują reakcję łańcuchową i pociąga modyfikacje w innych klasach. Więc po co się z tym męczyć? Umożliwmy przechowywanie dowolnych danych i wszyscy będą szczęśliwi.
No chyba niezupełnie. Nie twierdzę, że idea jest pozbawiona sensu, bo widzę logikę tego rozumowania, jednak dostrzegam również kilka potencjalnych problemów.
Przede wszystkim porzucamy strong typing, wszystko może być obiektem więc konieczna jest walidacja elementów przechowywanych w naszym pojemniku. Oczywiście bez jawnego określenia typów, intellisense Visual Studio, przestanie nas ostrzegać o potencjalnych problemach. Dalej z punktu widzenia bazy danych, tabele też miały by zostać tylko pojemnikami na dane? Żadnych kluczy, indeksów etc. ? Już widzę jak przystają na to administratorzy baz danych.
Kolejnym problemem może być czynnik ludzki i nie chodzi mi tu o mentalne reperkusje przestawienia się na nowy sposób myślenia, a czysto pragmatyczne podejście. Nie oszukujmy się większość ludzi jest leniwa, a programiści to już w szczególności
. Wcale nie jest takie nieprawdopodobne, że niektóre wartości mogą być przechowywane w klasie po kilka razy (szczególnie jeśli pracujemy w zespole). Co może prowadzić do wszelakiej maści problemów.
Jak na razie nie oceniam, czekam, aż tęższe głowy od mojej wypowiedzą się w tej sprawie. Może za jakiś czas pojawią się jakieś study case, projektów wykorzystujących to podejście. Poczekamy zobaczymy. Tymczasem dla zainteresowanych slajdy i przykłady z prezentacji są dostępne tutaj.