Konkurs „Daj się poznać” – podsumowanie

Czas szybko leci, nie tak dawno Procent ogłosił swój konkurs „Daj się poznać”, konkurs miał trwać aż 15 tygodni. W zeszły poniedziałek konkurs się zakończył. Czas jednak szybko mija. W tym czasie ilość czytelników mojego bloga wzrosła na tyle dużo, że była zauważalna w statystykach – dziękuję wszystkim nowym czytelnikom. Jeśli chodzi o aplikację Desktop Info to wreszcie udało mi się zrobić mechanizm dynamicznie ładowanych pluginów (przy pomocy MEF) oraz obsłużyć mapy Google wraz z rozpoznawaniem pozycji. To czego bardzo brakuje aplikacji w obecnym stanie to możliwość przesuwania gadżetów oraz brak integracji z flickr-em co miałem zamiar zorbić. Po drodze jednak rozpoznałem kilka narzędzi (jak PEX i kilka nowych „ficzerów” samego Visual Studio 2010). Powstał również całkiem spory kawał tekstu na temat aplikacji NDepend oraz NCover – które już w krótce będą dostępne na blogu.

Co dalej z aplikacją Desktop Info? Mam zamiar dalej ją rozwijać, tak aby doprowadzić do stanu używalności – obecnie jest to coś czego nie nazwał bym jeszcze wczesną alfą 🙂 a co się zaś tyczy dalszych wpisów z tematyki .net oraz około .net to tak jak wcześniej napisałem, w niedalekiej przyszłości przeczytacie o rewelacyjnym narzędziu NDepend oraz NCover (w ramach uzupełnienia wpisu o testach jednostkowych oraz TDD – test driven development).

 

Dwuwymiarowe kody QR – generator

Wszyscy znamy kody kreskowe, są bardzo popularne. Praktycznie każdy produkt jest nimi opatrzony. Problem jaki mają tradycyjne kody kreskowe to praktycznie brak mechanizmu korekcji błędów, który powoduje, że zniszczenie części kodu powoduje jego całkowitą nieczytelność. Dzięki temu możemy dłużej postać w kasach sklepowych. W tych samych kasach można zauważyć, że czasem ciężko odczytać kod, gdy jest pomięty. To wszystko powoduje, że już jakiś czas temu powstała alternatywa w postaci kodów 2D – kodów QR – czy kodów kropkowych (jak czasem się je nazywa). Sam pisałem już o kodach 2d ponad 2 lata temu tutaj. Temat ten (patrząc na statystyki oglądalności) ciągle jest popularny i wiele osób poszukuje informacji na temat samych kodów jak i sposobu generowania ich.

Wyższość kodów 2D polega na tym, że są skonstruowane w sposób pozwalający odczytać je prawidłowo pomimo częściowego uszkodzenia. Co więcej, ilość znaków, które możemy zapisać za ich pomocą jest teoretycznie nieograniczona (w niektórych formatach oczywiście). Same kody pozwalają zapisywać zarówno cyfry jak i znaki alfanumeryczne (oraz kilka innych) dzięki czemu za ich pomocą możemy zapisywać adresy stron WWW co oczywiście jest często wykorzystywane. Praktycznie każdy telefon ma obecnie aparat (nazwijmy to) fotograficzny. To znowu pozwala aby robić zdjęcia kodów i odczytywać je w telefonie. To jest idealny sposób, aby przepisać adres strony czy coś innego do komórki. Dzisiejszy wpis poświęcony będzie zatem małemu narzędziu, które pozwoli na wygenerowanie kodu QR, oczywiście w postaci dodatku do DesktopInfo.

Na pomoc w generowaniu kodów QR przychodzi biblioteka messagingtoolkit, która jest odpowiedzialna za stworzenie odpowiedniej bitmapy. Biblioteka upraszcza proces generowania kodów QR jest uproszczona do bólu.


var qrGenerator = new QRCodeEncoder{
 QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE,
QRCodeScale = 4,
 QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M,
 QRCodeVersion=4
 };

var image = qrGenerator.Encode((String)textBox.Text);

Ot cała filozofia. Potrzebujemy ustawić 4 zmienne. QRCodeEncodeMode pozwala określić czy chcemy kodować tekst, cyfry czy wszystko inne. Nas interesuje byte – czyli wszystko inne – co pozwala na kodowanie wszystkiego tego co chcemy (adresów internetowych przede wszystkim) z zachowaniem wielkości znaków. QRCodeScale pozwala określić rozmiar, QRCodeErrorCorrection określa tryb korekcji błędów co jednoznacznie przekłada się na nadmiarowość powodującą zwiększenie rozmiaru kodu przy jednoczesnym zwiększeniu jego odporności na błędy odczytu oraz uszkodzenia samego kodu. Ostatnia zmienna QRCodeVersion pozwala określić ilość znaków jakie możemy zakodować. Praktycznie wartość ta może wynosić od 1 do 40. Co daje zmiana tej wartości można sprawdzić na tej tabeli.

Generalnie zwiększając QRCodeVersion zwiększamy ilość znaków, które możemy zakodować, zwiększając QRCodeErrorCorrect zmniejszamy ilość znaków jakie możemy zakodować ale zwiększamy odporność (CodeErrorCorrect może przyjmować wartości L,M,Q,H – od najsłabszej do najsilniejszej korekcji błędu).

Wracając do samej biblioteki, w zmiennej image otrzymujemy Bitmap zwierający nasz obraz. Ponieważ aplikacja działa w WPF to aby wyświetlić ją w Image należy przekonwertować Bitmap do ImageSource (tutaj dziękuję za pomoc Piotrowi)

 
ImageSource TransformBitmap(Bitmap bmp){
 var bi = new BitmapImage();
 bi.BeginInit();
 bi.StreamSource = ConvertImageToMemoryStream(bmp);
 bi.EndInit();
 return bi;
}

private static Stream ConvertImageToMemoryStream(Bitmap bmp){
 var result = new MemoryStream();
 bmp.Save(result, ImageFormat.Bmp);
 return result;
} 

Synchronizacja z kalendarzem Google-a

Chcę, aby aplikacja DesktopInfo pokazywała wydarzenia z kalendarza Google-a na moim pulpicie. Dzięki temu będę miał listę pod ręką. Jak przygotować odpowiedni kawałek kodu? Wykorzystamy tutaj oficjalne, przygotowane przez firmę Google biblioteki dla .net-a (do pobrania tutaj). To co będzie potrzebne do projektu to dodanie referencji:

Google.GData.AccessControl
Google.GData.Calendar
Google.GData.Client
Google.GData.Extensions

Tworzymy CalendarService – obiekt odpowiedzialny za połączenie (jako parametr konstruktora podajemy nazwę aplikacji – zupełna dowolność).

 

CalendarService calService = new CalendarService(„Calendar Reader”);

 

To co należy ustawić teraz to użytkownik, hasło i adres do usługi.

 

calService.Credentials = new GDataCredentials(„moje.konto@gmail.com”„moje.tajne.haslo”);
Uri postUri = new Uri(„http://www.google.com/calendar/feeds/default/private/full”);

 

oraz stworzyć zapytanie, które będzie wysłane do Google-a

 

EventQuery query = new EventQuery();
query.Uri = calendarUri;
query.StartTime = DateTime.Now.AddMonths(-1);
query.EndTime = DateTime.Now.AddMonths(12);

To co tutaj jest ciekawe, to możliwość ustawienia zakresu dat, jakie nas interesują. Im szerszy zakres, tym potencjalnie więcej wyników będzie trzeba przesłać przez sieć. Warto o tym pamiętać, bo aplikacja może być uruchamiana na powolnych połączeniach. Po ustawieniu parametrów pozostaje pobrać wyniki

EventFeed calFeed = calService.Query(query) as EventFeed;

I coś z nimi zrobić 🙂

foreach (EventEntry gcalEntry in calFeed.Entries) {
Console.WriteLine(gcalEntry.Times[0].StartTime);
Console.WriteLine(gcalEntry.Times[0].EndTime);
Console.WriteLine(gcalEntry.SelfUri.Content);

}

Jak wydać, przygotowana przez firmę Google udostępnia dane w sposób łatwy i przyjemny. Podobne API dostępne jest do innych usług jednak to czego mi brakuje to brak api do dostępu do listy zadań. Lista zadań dostępna jest w kalendarzu i poczcie Google-owej od dawna. Usługa ta powstała w ramach 20% wolnego czasu programistów i szybko okazało się, że jej lekkość i nieprzeładowana funkcjonalność zaskarbiła sobie wielu fanów – szkoda że nie doczekała się do dnia dzisiejszego swojego API.

Testy jednostkowe oraz TDD – test driven development.

Testy jednostkowe to proste testy pozwalające na sprawdzanie działania aplikacji na poziomie klas i metod. Ich celem jest wspomaganie pracy programisty. Testów jednostkowych nie należy traktować jak testów aplikacji, które należą do zupełnie innej kategorii.

Ciekawą koncepcją jest TDD czyli test driven development. Wg. niej najpierw tworzone zostają testy aby dopiero później stworzyć kod. Dzięki takiemu podejściu zmuszamy umysł do przemyślenia kodu zanim ten zostanie stworzony. Największa moc drzemiąca w testach jednostkowych pojawia się przy wprowadzaniu zmian do wcześniej napisanego kodu. Pilnują one czy logika aplikacji nie zmieniła się w sposób przypadkowy. Więcej na temat testów jednostkowych można znaleźć w sieci, a dla fanów TDD można znaleźć w sieci kubki, koszulki, czapki i przypinki.

To że testy jednostkowe stają się coraz bardziej popularne i coraz chętniej wykorzystywane niech świadczy fakt, że firma Microsoft wypuściła bibliotekę PEX, która generuje testy jednostkowe na podstawie kodu. Co prawda dla TDD takie narzędzie nie wydaje się przydatne, ponieważ wg. tej metodyki należy najpierw stworzyć testy a później kod, to warto wykorzystać je do wyszukania ewentualnych braków i/lub niedopatrzeń. I tak, na stronie Microsoft Research znajdziemy bibliotekę PEX. Po instalacji w menu podręcznym mamy możliwość automatycznego wygenerowania testów dla metod publicznych

Pex sam wygeneruje testy i jeśli już wcześniej stworzyliśmy testy, możemy poszukać takie, które uzupełnią nasze.

A jeśli rzeczywiście znajdziemy test, który uzupełni te nasze, wówczas pozostaje jedynie dodać automatycznie wygenerowany test – promować.

W najbliższym czasie dla aplikacji DesktopInfo stworzony zostanie mechanizm zapisywania ustawień użytkownika dla gadżetów. Ten mechanizm zostanie stworzony w podejściu TDD. Już teraz zachęcam do pisania propozycji testów – słownie, co takie testy mogły by zawierać.

A w najbliższym czasie pojawi się więcej szczegółów na temat PEX-a oraz Molex – kolejny bardzo dobrze zapowiadający się wynalazek firmy Microsoft.

Architektura aplikacji w sposób łatwy i przyjemny

Każda bardziej skomplikowana (niż „hello word”) aplikacja posiada jakąś architekturę. Chyba najbardziej popularna wśród początkujących to spaghetti. Architektura spaghetti charakteryzuje się tym, że różne kawałki kodu są po prostu przemieszane ze sobą. Czasem tak dobrze, że w jednej procedurze i/lub funkcji znajdziemy wszystkie składniki. Na szczęście kilka programów później, prawie każdy zaczyna coraz bardziej myśleć o architekturze. O tym, jak poszczególne elementy aplikacji będą poskładane i jak będą współpracowały między sobą. Nie będę tutaj jednak prowadził dywagacji na temat prawidłowej architektury – są od tego odpowiednie książki.

Co jednak warto opisać to jak powstał załączony do wpisu diagram.

Visual Studio 2010 (niestety dopiero w wersji Ultimate) pozwala na rysowanie takich ładnych diagramów. W dodatku na podstawie projektu. Jak to zrobić?

Do solution należy dodać nowy projekt – Modeling Project:

A następnie dodajemy w tak stworzonym projekcie diagram warstw.

Otwierając teraz Architecture Explorer możemy dodawać do diagramu poszczególne klasy, namespace-y, projekty etc. I łączymy elementy pomiędzy sobą.

Powyższy zrzut z ekranu pokazuje, jak może wyglądać przykładowa architektura.

Teraz rozpoczyna się magia,

Wybierając Validate Architecture możemy szybko sprawdzić czy nasz projekt jest zgodny z zaprojektowaną architekturą – jeśli nie, otrzymamy listę błędów. Jeżeli jesteśmy pewni, że nasz projekt trzyma się założonej architektury to możemy wygenerować zależności pomiędzy elementami diagramu na podstawie solution.

Wisienką na torcie jest opcja w menu Create/Link Work Item. Pozwala ona na związanie work itemów z konkretną częścią architektury – jeśli oczywiście korzystamy z TFS-a.