Strona główna Blog Strona 12

The Art of Unit Testing & TDD Master Class in .NET – moje wrażenia

0

Zgodnie z zapowiedzią z ostatniego postu podzielę się wrażeniami z kursu.

Na chwilę obecną promocja się skończyła i w/w kurs zamiast wcześniejszych 25$ kosztuje 129$ (sic!).

Kurs składa się ze zbioru nagranych szkoleń prowadzonych przez Roy’a dla jednej z firm oraz z kilku filmów będących nagraniami bez „publiczności”. Tematycznie i chronologicznie kurs pokrywa się z materiałem z rewelacyjnej książki Roy’a „The art of unit testing” – wszystko co zobaczymy na nagraniach to właśnie nieco okrojony materiał z książki uzupełniony o interakcję ze słuchaczami (zadającymi często całkiem ciekawe pytania) i kodzenie „na żywo”.

Kurs jest fajnym suplementem do książki (jeżeli się ją posiada) i całkiem nieźle sprawdzi się jako „utrwalacz” wiedzy – chociaż nie pisząc samemu testów i nie próbując metodyk i rozwiązań zaproponowanych przez Roy’a trudno powiedzieć, że się tą wiedzę przyswoiło. Nie wyobrażam sobie natomiast, aby sam kurs potraktować jako jedyne źródło wiedzy na temat testów i TDD w .Net.

Podsumowując. Czy warto skorzystać z tego kursu ? IMO przy jego obecnej cenie zdecydowanie lepiej kupić książkę Roy’a (kupując wersję papierową, dostajemy również od wydawnictwa Manning wersję elektroniczną). Natomiast jeżeli książkę już się posiada – to przy kolejnej promocji kurs zdecydowanie polecam jako suplement – przy obecnej cenie jest zdecydowanie zbyt drogi w stosunku do wartości, którą ze sobą niesie.

Promocja u Roy’a Osherove

0

Wczoraj na Twitterze Roy ogłosił promocję na kursy online, które oferuje na swojej stronie. Promocja jest dość konkretna – większość kursów kosztujących wcześniej 99$ obecnie kosztuje 25$. Jakiś czas temu kupiłem książkę Roy’a „The art of unit testing”, którą uważam za doskonały podręcznik do nauki tworzenia i stosowania testów jednostkowych.

Ja skusiłem się na kursy „Unit Testing and TDD” oraz „Legacy Code Hero” – jak skończę oglądać, podzielę się wrażeniami.

Link do strony z kursami: http://courses.osherove.com/

NDC Oslo 2014 – sesje online

NDC Oslo to niewątpliwie największa i najciekawsza konferencja soft-dev i to nie tylko dla programistów .Net .Nagrania z tegorocznych sesji pojawiły się praktycznie natychmiast po zakończeniu konferencji – jest tego naprawdę duuużo i sporo bardzo ciekawych tematów. Udało mi się już oglądnąć kilka ciekawych dla mnie sesji – poniżej moja krótka recenzja tego co już obejrzałem.

Hybrid vs Native: Choosing a mobile strategy – link 
Sesja zaczyna się „od końca” stwierdzeniem, że (jak się zresztą spodziewałem) Hybrid is the way to go. Szczerze mówiąc nic ciekawego w tej prelekcji nie ma. Większość to frazesy gloryfikujące rozwiązania typu phonegap ze wskazaniem na zalety ich stosowania (oczywiście wspomniano, że nie da się w ten sposób zrobić wszystkiego – ale to raczej też oczywiste). Brak ciekawych przykładów i rzeczywistych porównań obu rozwiązań na konkretnych przykładach.
Moja ocena: 1/10

Pharo: playing with live objects – link
Prelekcja o Pharo, który jest swego rodzaju implementacją Smalltalk-a. Nigdy nie miałem styczności ze Smalltalk więc obejrzałem z czystej ciekawości. Wszystko zaczyna się od dość efektownego bug-a. Środowisko w którym mamy możliwość interaktywnego dialogu z obiektami w pełnym online wykrzaczyło się po prostu w trakcie wykonania prostej operacji na obiekcie. Dalej jest na szczęście lepiej – prelegent się zdecydowanie rozkręca. Sama prelekcja jest stosunkowo krótka, jest natomiast sporo ciekawych pytań na które prelegent odpowiada. Muszę przyznać, że sesja jest mocno interesująca a samo Pharo na tyle ciekawe, że pomimo tego, iż prawdopodobnie nigdy tego nie wykorzystam w praktyce, ściągnąłem sobie środowisko i manual i w wolnej chwili się tym pobawię.
Moja ocena: 7/10

Strangling the legacy out of an Application – link
Całkiem ciekawa sesja o tym jak radzić sobie z legacy code i jak w ogóle podejść do tego tematu. Autor analizuje przykład starej aplikacji webowej (.Net 1.0) opisując jak wykonać analizę problemu oraz skategoryzować elementy wymagające zmiany a następnie przeprowadzić modyfikację. Strasznie szkoda, że czas nie został podzielony równo na aplikacje webowe i desktop. O aplikacjach desktopowych (VB6) jest tylko krótka wzmianka – prelegent sugeruje włączanie działających elementów przez COM – i to wszystko.
Moja ocena: 6/10

Banish your Inner Critic – link
Prelekcja zdecydowanie w stylu productivity tips, a można nawet zaryzykować stwierdzenie, że lekko psychologiczna. Nie mniej jednak ogląda się bardzo przyjemnie – prelegentka nie pozwala się zbytnio nudzić – a i treść jest całkiem interesująca. Wydaje mi się, że sesja warta obejrzenia – chociażby jako przerywnik pomiędzy prelekcjami stricte technicznymi.
Moja ocena: 8/10

TCP Servers in .NET done rigth – link
Prelekcja w stylu, który cenię najbardziej. W zasadzie ciągle kod na ekranie dobrze objaśniony i skomentowany przez prelegenta. Ciekawa tematyka, z którą mam dużo do czynienia. Spokojnie mogę powiedzieć, że zdecydowanie polecam osobom zainteresowanym tą tematyką. Do tego nagrania z pewnością wrócę jeszcze nie raz – szkoda tylko, że nie ma możliwości ściągnięcia kodu źródłowego prezentowanych przykładów.
Moja ocena: 9/10

Making 3D games with MonoGame – link
To jedna z dwóch prelekcji związanych z GameDev na tegorocznym NDC. Xna a teraz MonoGame to temat który mnie dość mocno interesuje – w końcu w dzieciństwie bardzo chciałem być programistą właśnie po to, żeby tworzyć gry. Ta prelekcja przypomina jednak bardziej marketing gry stworzonej przez prelegenta – mało jest w niej ciekawych rzeczy i jeżeli ktoś miał już jakąkolwiek styczność z MonoGame czy Xna nie znajdzie tu nic ciekawego. Prelegent używa MonoGame w Xamarin studio na Mac -u. Rzeczywiście tandem Xamarin – MonoGame miałby szanse na doskonałe środowisko do GameDev gdyby nie cena Xamarin-a. Wersja starter ze względu na ograniczenia nie pozwala na korzystanie z MonoGame – a za wszystko inne trzeba słono płacić. Chodzą co prawda słuchy jakoby MonoGame miało być wyłączone spod ograniczeń wersji starter – ale póki co to tylko plotki.
Moja ocena 2/10

HP 8510w i wentylator

0

Jakiś czas temu w moim starym wiernym HP nx7300 umarł układ ładowania baterii. Jako że w naprawy płyty głównej nie bardzo wierzę, a zakup nowej płyty niemal przekracza wartość komputera stwierdziłem, że zrobię mały upgrade.

Kupiłem po leasingowego HP 8510w, który w czasach gdy kupowałem nowego nx7300 kosztował worek pieniędzy i był naprawdę wypasiony. Na dzisiejsze standardy nie są to już takie fajerwerki, ale jest też kilka zalet (GPU – nVidia Quadro FX5 70M i matryca 1980×1200).

Jak się okazuje komputer ten posiada jedną wadę  (o której wcześniej nie wiedziałem, a warto było jednak zasięgnąć języka przeglądając chociażby fora) niemiłosiernie rzeźbi wiatrakiem (żeby nie powiedzieć że nap…dala) i to na dość konkretnych obrotach pomimo tego, że temperatury są całkiem przyzwoite i nie ma takiej potrzeby. Niestety softy w stylu HWInfo, które mają moduł do sterowania prędkościami wiatraka nie obsługują tego sprzętu. Udało mi się jednak znaleźć w sieci rozwiązanie.

Rozwiązaniem jest edycja tablicy DSDT, która to zawiera procentowe prędkości wiatraka dla 5 różnych zakresów temperatur. Oryginalny post opisujący procedurę jest TU. Niestety link do programu zrzucającego DSDT do pliku nie żyje, trzeba to więc zrobić na piechotę. Konieczne jest ściągnięcie kompilatora ASL oraz iASL w wersji binarnej dla Windows.

Żeby odczytać DSDT trzeba najpierw zrobić jego dump za pomocą acpidump a następnie skonwertować otrzymany plik za pomocą acpixtract.
Teraz za pomocą polecenia asl /u <plik_ze_skonwertowanym_zrzutem>  otrzymujemy kod źródłowy, który można poddać modyfikacjom.
Fragment, który należy edytować wygląda tak:
Name(C358, Package(0x6)
{
0x64,
0x4b,
0x3c,
0x32,
0x1e,
0x0
})

Wartości przedstawiają procentowe prędkości wentylatora dla różnych zakresów temepratur. Ja zmodyfikowałem mój plik tak:
Name(C358, Package(0x6)
{
0x64,
0x37,
0x2d,
0x1e,
0x14,
0x0
})

Po zakończeniu modyfikacji plik trzeba skompilować: asl <plik_źródłowy>.
Podczas kompilacji prawdopodobnie pojawią się błędy, warning – ami się nie przejmujemy. Błąd związany z brakiem nawiasu naprawiamy dopisując () na końcu błędnej linii wskazanej przez kompliator. Gdy już uda się skompilować bez błędów ładujemy nową tabelę (command – line należy uruchomić jako adminstrator)
asl /loadtable <skomplikowany_plik>

Po restarcie komputera wentylator zacznie się już zachowywać według nowych wytycznych.
Parametry można oczywiście dowolnie zmieniać – warto jednak monitorować temperatury CPU i GPU.

Qt okiem programisty .Net

0

Jakiś czas temu sporo walczyłem z pewnym napisanym przez siebie w C# softem, gdzie niemal w 100% byłem pewien obecności memory leak. Aplikacja to stosunkowo nieskomplikowany klient/serwer Modbus TCP odczytujący dane z kilku urządzeń i udostępniejący je klientom odpytującym w odpowiednich rejestrach dla każdego z klientow. Architektura stosunkowo prosta. Niestety sprzęt, na którym ów soft musi pracować to nieco leciwy komputer przemysłowy Advantech-a z 1Ghz Atom-em i 1GB Ramu pracujacy pod Win 7 32 bit. Po kilkudniowej walce z problemem i analizowaniem sytuacji za pomocą różnych profilerów nie udało mi się znaleść rozwiązania problemu. Garbage Collector co prawda działa i nie pojawia się „out of memory exception”, ale program zużywa niemal 75% dostępnej pamięci powodując konieczność częstego korzystania przez system z pliku wymiany i przy okazji dużego spadku wydajności pracy systemu a co za tym idzie i samej aplikacji.
Z jednej strony brak konieczności zarządzania pamięcia w .NET jest bardzo wygodny – z drugiej niemalże zerowa kontrola nad gargabe collector-em jest dość frustrująca.

Cała ta sytuacja była bodźcem do poszukiwań rozwiązania alternatywnego. Idealne wydaje się w tej sytuacji skorzystanie z C++, gdzie mam pełną kontrolę nad pamięcią i przy okazji tego typu aplikację mogę IMO lepiej zoptymalizować niż w środowisku zarządzanym. Problem w tym, że C++ (którego nota bene ostatni raz używałem dość dawno temu pisząc magisterkę – skryptowe dialekty c i c++ występujące w różnych narzędziach i urządzeniach automatyki przemysłowej do tego nie zaliczam) nawet z wykorzystaniem biblioteki standardowej jest duuuużo mniej wygodny w użytkowaniu niż C#.

Poszukując wygodnej biblioteki i środowiska trafiłem (po raz kolejny) na Qt. Do Qt miałem już kilka podejść przez kilka lat w ramach eksplorowania nowych technik i środowisk, ale nigdy jakoś nie wgryzłem się w temat – może po prostu brakowało mi odpowiedniej motywacji. Jak się okazuje był to spory błąd – gdyż Qt jest doskonałym i szeroko stosowanym, wieloplatformowym projektem.
Szczerze mówiąc jestem wprost oczarowany wygodą i (po opanowaniu pewnych charakterystycznych dla Qt – i IMO genialnych – koncepcji) łatwością użytkowania, mając nadal całą moc C++. Osoby znające Qt już od dawna pewnie teraz uśmiechają się pod nosem – „Amerykę odkrył” – ale przyznaję, ze jest to dla mnie spore odkrycie.

Z Qt (na chwilę obecną 5.3) otrzymujemy też świetne IDE – Qt Creator, z którego możemy skorzystać pod Win, Linuxem i Mac OSX. Na wszystkie te platformy możemy również targetować nasz kod. Poza świetnymi Widgetami, które oferuje Qt mamy również oparty na języku QML (coś pomiędzy XML a XAML znanym z WPF) Qt Quick, w którym możemy stworzyć pełną aplikację wykorzystując JavaScript lub połączyć Qt Quick z kodem C++. Aplikacje Qt Widgets jak i Qt Quick możemy również targetować naAndroida jak i na iOS, a w ostatniej wersji jest też działające wsparcie dla WinRT.
Jedyne czego brakuje, to możliwość stworzenia pełnej architektury sieciowej, w której Qt Quick wykorzystamy jako warstwę prezentacji danych w przeglądarce a po stronie serwerowej wkorzystamy kod C++ – ale nie wykluczone, że takie rozwiązanie w przyszłości powstanie.

W ramach testu, „przepisałem” z wykorzystaniem Qt aplikację odczytującą dane ze sterownika (przez libnodave) i rejestrującą do PostgreSQL. Stosując w zasadzie identyczną architekturę, udało mi się zejść z ok 1,1 sekundy jakiej potrzebowała oryginalna aplikacja w C# do odczytania danych i zapisania ich do bazy – do ok. 70 mS w przypadku wersji w Qt. Bez problemu udało mi się też uruchomić napisany kod pod Ubuntu.

Qt otrzymujemy na licencji LGPL. Oznacza to, że możemy stosować jedynie dynamiczne linkowanie i nie możemy (poza pewnym ograniczonym zakresem – szczegóły do znalezienia w sieci) wprowadzać zmian do samego Qt bez opublikowania kodu źródłowego owych zmian. Konieczna jest również wzmianka w dowolnym miejscu (chociażby w ReadMe) na temat wykorzystania Qt i licencji na jakiej jest oparte. Nasz soft wykorzystujący Qt nie musi oczywiście mieć otwartego kodu, może być też rzecz jasna w pełni komercyjny. Istnieje również mozliwość wykupienia od obecnego właściciela (Digia) wersji komercyjnej – ale ceny mocno odstraszają, visual Studio jest przy nich tanie jak barszcz.
W tej chwili rodzi się pytanie – „a co będzie, jak Digia, czy też ewentualny kolejny właściciel Qt, zrezygnuje z dalszego udostępniania Qt na LGPL”. Otóż twórcy Qt pozbywając się swoich praw do kodu podpisali umowę, na mocy której w momencie zakończenia przez właściciela biblioteki jej dystrybucji na licencji LGPL – zostanie ona opublikowana na licencji BSD.

Czy przesiądę się całkowicie z .Net na Qt ? – nie. Nadal większość naszych klientów używa Windowsa a wygoda programowania i znajomość .NET pozwala mi napisać soft sprawniej i szybciej. Wykorzystanie .NET jest też u niektórych klientów wymagane. Qt nie nadaje się również IMO na chwilę obecną do aplikacji webowych. Napewno jednak użyję Qt, jeżeli zajdzie potrzeba napisania wydajnej aplikacji, która będzie wymagała bardzo szybkiej i niezawodnej komunikacji. Zaletą Qt jest również pełna kompilowalność, a co za tym idzie nie ma potrzeby specjalnego zabezpieczania kodu – nada się więc bardzo do desktopowych aplikacji, które chcielibysmy zabezpieczyć i sprzedać masowemu klientowi.