.NET w parze z PowerShellem

Jaki jest najszybszy sposób, aby sprawdzić, jak zbudowana jest dana klasa z BCL? Jakie ma metody, właściwości? Niektórzy z pewnością poproszą o pomoc wujka Google, który z chęcią przerzuci zainteresowanych na witrynę MSDN Library. Miejsce to oczywiście godne polecenia każdemu, bo jak mało która dokumentacja jest naprawdę szczegółowa. Ale co w sytuacji, gdy nie mamy dostępu do internetu? Najprostszym sposobem byłoby stworzenie na szybko jakiejś aplikacji, wpisanie nazwy klasy i IntelliSense powinien podpowiedzieć nam całą resztę. Sprytnie, ale trochę ciężko. Zaznajomieni ze środowiskiem Visual Studio wiedzą, że istnieje coś takiego, jak Object Browser dostępny z menu Tools. Narzędzie całkiem przydatne, a dodatkowo informuje, w jakim zestawie dostępna jest dana klasa. Ostatnim sposobem, na którym chciałbym się dziś skoncentrować, jest PowerShell. Jak prześwietlać klasy i jak ich używać w skryptach –  o tym w dalszej części. Spokojnie, znajomość super powłoki nie jest wymagana.

Aby zdobyć informację o danym typie, wystarczy wpisać jego pełną nazwę, tj. razem z namespacesem w nawiasach kwadratowych:

PS C:UsersWojtek [System.IO.DriveType]

IsPublic IsSerial Name      BaseType
-------- -------- ----      --------
True     True     DriveType System.Enum
 

Jak widać, nie dostaliśmy zbyt wielu cennych informacji . Do dyspozycji na szczęście mamy wszystkie metody, jakie udostępnia klasa System.Type. Np. GetConstructors(), GetMembers(), GetFileds() itp. W podanych zastosowaniach będę używał komendy Format-Table, która powoduje wyświetlenie tylko tych właściwości obiektów, jakie chcę zobaczyć.

PS C:UsersWojtek> [System.IO.DriveType].GetFields() | Format-Table Name

Name
----
value__
Unknown
NoRootDirectory
Removable
Fixed
Network
CDRom
Ram
 

Łatwo i szybko dostaliśmy wyliczenia danej enumeracji. Jeśli chcemy zobaczyć, w jaki sposób działa dana funkcja, możemy stworzyć obiekt dowolnej klasy, a następnie uruchamiać jego metody. Zobaczcie to na przykładzie StringBuildera:

PS C:UsersWojtek> $a = New-Object System.Text.StringBuilder
PS C:UsersWojtek> $a.Append("hej")

Capacity MaxCapacity Length
-------- ----------- ------
      16  2147483647      3

PS C:UsersWojtek> $a.Append(" ho")

Capacity MaxCapacity Length
-------- ----------- ------
      16  2147483647      6

PS C:UsersWojtek> $a.ToString()
hej ho
 

Po każdej zmianie obiektu wyświetlane są jego właściwości i jak na dłoni widać, co się zmieniło. Bardzo przydatna rzecz podczas poznawania nowych klas.

Możliwości PowerShella są naprawdę ogromne, sam z pewnością nie jestem świadomy istnienia połowy z nich. Niecierpliwych odsyłam do angielskiego bloga w którym znajdziecie mnóstwo przykładów wykorzystania PowerShella na platformie .NET, a ciekawskich zachęcam do eksperymentowania. Polecam PowerGUI jako podstawowy edytor PSa.

Promuj

Samsung i reklama 3D

Jako pracownik tak wspanialej firmy jaką jest Samsung Electronics ;], zapoznany z informacjami niedostępnymi dla innych, sam często bywam zaskakiwany rodzimymi produktami i reklamami. Przeglądając demotywatory (też to robicie, prawda?), natrafiłem na ogłoszenie, które widzicie w obrazku tego posta. Nie lubię reklam, ale za namową kolegi z pracy, niechętnie, ale wszedłem.

Wymagania: drukarka, kamera, głośniki i pewne zdolności manualne. Ściągamy i instalujemy aplikację (~24MB) oraz drukujemy znacznik (tzn. pilot).  Uruchamiamy program, wybieramy ustawienia, domyślne wystarczą, i na ekranie powinniśmy zobaczyć siebie. Prawda, że miły obraz? :] Bierzemy w rączki nasz znacznik i kierujemy go w stronę kamery. Na ekranie zamiast kartki pojawi się pseudotrójwymiarowa animacja, a z głośników usłyszymy głos przemiłej komentatorki. Po wstępie proszeni jesteśmy o naciśnięcie przycisku na pilocie, (tj. przykryj palcem mały czarny prostokącik). Nasza pani wyjdzie z telewizora :) Poruszając kartą manipulujemy animacją, oglądając ją z różnych stron. Efekt jest na prawdę imponujący. Jeśli moja instrukcja jest zbyt ogólna, obejrzyjcie specjalny film nagrany przez tę samą firmę reklamową.

Pomysł świetny – w końcu to moja firma :)

Google szepcze Ci do ucha…

Myśleliście, że Google brakuje pomysłów? Sprawdźcie to. Już niedługo Pan Android będzie podpowiadał nam w czasie zwykłej rozmowy telefonicznej.

Dla tych, którzy już obejrzeli…

[Caller]  I just… I dunno what happened. I just crashed my car.. I skidded off the road. Hello?
[Dispatcher] Sir? Hello? Sir? Sir? I’m sorry. I can’t understand you.
[GooglePhone] Need a new car? Toyota Tacoma starting at under $16,000.

[Caller] Hello? Can you hear me? My wife is here but she’s not moving.
[Dispatcher] Sir?
[GooglePhone] Take her on the vacation of her dreams. Romantic get-always at DreamResort.com

Bezcenne. Mam nadzieję, że to żart.

[Edit]
Film nagrała organizacja satyryczna The Onion.

Konfigurowalne obrazy z HTTP GETa

Temat postu z pewnością nie mówi Wam zbyt wiele, dlatego pozwolę sobie go wyjaśnić. W dzisiejszym wpisie chciałbym przedstawić Wam usługi, jakie zewnętrzne firmy dostarczają deweloperom aplikacji internetowych poprzez zwracanie obrazów z konfigurowalnych adresów URL. Mówiąc jaśniej, to, jaki obraz zostanie zwrócony, zależy od podanych w adresie parametrów.

Na samym początku przyjrzyjmy się usłudze mojego „ulubionego” dostawcy, wujka Google’a – Chart Tools. Jak sama nazwa wskazuje, na naszą stronę możemy wstawiać wszelkiego rodzaju wykresy. Dokładna dokumentacja znajduje się tutaj, a teraz krótki przykład:

http://chart.apis.google.com/chart?cht=p3&chd=s:Uf9a&chs=250x100&chl=January|February|March|April

Dla jasności pokolorowałem odpowiednie sekcje w adresie. Śmiało, skopiujcie go do swojej przeglądarki i zmieńcie np. nazwę miesiąca. Do dyspozycji mamy naprawdę szeroki wachlarz wykresów, ikon, a nawet możemy wstawiać równania matematyczne i kody QR.

http://chart.apis.google.com/chart?cht=tx&chl=x%20=%20%5Cfrac%7B-b%20%5Cpm%20%5Csqrt%20%7Bb%5E2-4ac%7D%7D%7B2a%7D

Tutaj jednak adres nie jest już tak oczywisty. Ze względu na ograniczenia w znakach adresu URL wymagane jest odpowiednie kodowanie. Google daje nam naturalnie pomocne narzędzie. Oprócz API do wykresów nasz potentat dostarcza również podobną funkcjonalność dla map – sprawdź Google Static Maps.

Drugi dostawca podobnych usług to yuml.me. W tym przypadku mamy możliwość generowania diagramów UML. Jak wiadomo, diagramy te mogą prezentować rożne rodzaje schematów, zatem dają się zastosować w naprawdę wielu sytuacjach. Popatrzmy na taki przykład:

http://yuml.me/diagram/scruffy/class/[Customer]-%3E[Billing%20Address]

Na stronie usługodawcy możecie zobaczyć kilkanaście innych, bardziej rozbudowanych przykładów. Możliwości są naprawdę spore.

Czy znacie więcej serwisów udostępniających podobne funkcjonalności? A może znacie nazwę tego rodzaju usług? Chętnie się o nich dowiem.

Promuj

Użytkownik wielokomputerowy

Czy korzystacie na co dzień z komputera? Pewnie tak, ale czy tylko z jednego? Raczej nie. W pracy stoi jedna maszyna, w domu kurzy się druga, a jeśli jesteście gadżetomaniakami, to z pewnością macie jeszcze netbooka i telefon z przeglądarką internetową. A co z maszynami wirtualnymi? Korzystacie z takowych?

W domu mam laptopa i netbooka, w pracy blaszaka i kilka maszyn wirtualnych, a daleko w rodzimym domku znajdzie się jeszcze komputer, z którego korzystam, jeśli nie zabiorę ze sobą żadnego sprzętu. Gdziekolwiek jestem i którejkolwiek maszyny używam, chciałbym mieć ten sam komfort pracy. Te same pliki i zakładki w przeglądarkach (nie używam jednej na co dzień)  oraz poczta – oto wszystko, czego mi potrzeba. Jestem mało wymagający, prawda?

Nie lubię narzędzi do synchronizacji – nigdy nie spełniały moich oczekiwań i często miałem z nimi problemy. Dlatego wszystkie moje pliki przechowuję na zewnętrznym 2,5 calowym dysku, który bez problemu mieści się w kieszeni, a dostępna przestrzeń (ja mam akurat 320 GB) stanowczo mi wystarcza. Odpinam go z jednej maszyn, dopinam do drugiej i nie odczuwam żadnej różnicy. Czy jest to dobre rozwiązanie? Pewnie nie, ale niezwykle wygodne. Owszem, dysk może mi zastrajkować i wszystko trafi szlag, owszem, ktoś może mi go ukraść i znów wszystko trafi szlag, ale nigdy nie przywiązywałem wagi do tego rodzaju zagrożeń, pewnie mój błąd.

Mam już pliki, teraz – co z zakładkami? Gdybym korzystał z Chrome’a i pozwolił Google na inwigilację, pewnie użyłbym dostępnej funkcji synchronizacji zakładek, ale tego nie zrobię. W sekundę w mojej głowie pojawił się pomysł na biznes, ale po upłynięciu kolejnych pięciu wiedziałem, że już coś takiego istnieje. Synchronizacja zakładek na wszystkie popularne przeglądarki: Internet Explorer, Firefox, Chrome oraz Safari. Szybko, miło i przyjemnie. Polecam Xmarks.com. W najmniej przyjazny sposób wspiera przeglądarkę z Microsoftu, instaluje się bowiem jako zewnętrzna aplikacja, ale w pozostałych przypadkach jako plugin. Konfiguracja jest prosta i intuicyjna, a dodatkowy moduł oceniania pozwala sprawdzać popularność poszczególnych stron, jakie dodali do ulubionych pozostali użytkownicy programu.

Jeśli chodzi o pocztę, to chyba nie ma już osób, które ściągają jeszcze całą skrzynkę do siebie. Dostawcy stanęli na wysokości zadania i do dyspozycji mamy kilka gigabajtów na skrzynkę online. Pierwsze takie konta w Polsce oferował serwis o2, za granicą triumfy święci gmail oraz hotmail.

Jeśli znacie inne, dobre sposoby na pracę z kilkoma komputerami, napiszcie, jestem bardzo ciekawy ;]

Testowanie metod asynchronicznych w Javie

Jeśli w swoim życiu napisaliście już setki klas i tysiące metod, a nie stworzyliście jeszcze żadnego testu, to marni z Was developerzy. Testy jednostkowe są naprawdę pożytecznym narzędziem, bo choć wydłużają proces produkcji, jednocześnie powodują, że wartość końcowego produktu jest wielokrotnie większa, a Wy jesteście pewni, że Wasz produkt działa. Pisanie testów metod pobierających argumenty i zwracających wyniki, które można na podstawie tych argumentów zweryfikować, to kaszka z mleczkiem. Znacznie trudniej testować metody, które uruchamiają zadania w tle, a wyniki zwracają przez tzw. callbacki. Pokaże Wam, jak uporałem się z tym problemem.

Z pewnością zetknęliście się kiedyś z modułem, który wystawiał dwa publiczne interfejsy. Jeden z nich służył do zarządzania komponentem, natomiast drugi implementowaliście w celu uzyskania informacji zwrotnych z tego modułu. Takie API można znaleźć w  kodzie C++ znacznie częściej, aniżeli w Javie czy C#. Metoda interfejsu zarządzającego często nic nie zwraca, a jeżeli już, to jedynie kod informacyjny np. ‚operacja zaplanowana do wykonania’, albo ‚nie można wykonać’. Po pewnym czasie przychodzi odpowiedź w formie wywołania metody z interfejsu notyfikacji, który uprzednio zaimplementowaliśmy i przekazaliśmy do modułu. Test takiej metody powinien sprawdzać zwracany kod, czekać (ale nie nieskończenie długo) na przyjście odpowiedzi oraz zweryfikować przysłane w notyfikacji dane.  Przykładowy projekt takich interfejsów możecie znaleźć w moim repozytorium w pakiecie pl.fones.blog.asynctest.

Klasa Engine to interfejs zarządzający, EngineNotifcations to, rzecz jasna, interfejs powiadomień, EngineTest to testy naszego komponentu, dziedziczą po AsyncBaseTestCase, a te z kolei po JUnitowych test case’ach. Będziemy testować metodę start(), która zwraca swój wynik w notyfikacji engineStarted().

Cała logika testowania asynchronicznych metod zawarta jest w klasie AsyncBaseTestCase. Metody notifyCallback() oraz waitForCallback() powinny być wołane w naszym teście, jedna w zaimplementowanym na rzecz testu interfejsie notyfikacji, a druga – w samej metodzie testującej. Ich działanie opiera się na obiekcie CountDownLunch.  Metoda waitForCallback() czeka, aż wartość licznika tego obiektu będzie równa zero, a metoda notifyCallback() zmniejsza jego wartość domyślnie ustawioną na 1. Dodatkowe struktury służą do przekazania parametrów notyfikacji i informacji, czy dany callback w ogóle nastąpił. W ten sposób możemy ustawić, jaki maksymalny czas dajemy komponentowi na odpowiedź. Poprzez tablicę flag sprawdzamy, czy dana notyfikacja nastąpiła, a przez kolekcję rezultatów dowiadujemy się o przekazanych parametrach. Wszystko w bezpieczny, wielowątkowy sposób, z wykorzystaniem dostępnych metod synchronizacji.

Jeśli znacie inny sposób, który usprawniłby moje rozwiązanie, chętnie go poznam.

Prezentacja o Programowaniu Równoległym

We wrześniu 2008 roku w naszym dotnetowym kole działającym przy Wydziale Elektroniki i Technik Informacyjnych Politechniki Warszawskiej ustalaliśmy szczegóły organizacji wydarzenia IT Academic Day na naszej uczelni. Rafał Maciąg, przewodniczący koła, zaproponował, aby ktoś z nas przygotował coś na tę okazję. Oprócz prezentacji takich firm jak ABC Data, Kasperksy, K2, miała mieć miejsce jeszcze jedna, studencka.  Nie zgłosił się żaden chętny, a i mi trudno było wyobrazić siebie w takiej roli. Jedynym argumentem był fakt, że interesowałem się wtedy jeszcze dość egzotycznym zagadnieniem, jakim jest Programowanie Równoległe. Temat pasował idealnie. Decyzja zapadła.

Do dyspozycji miałem bardzo wczesną wersję biblioteki Parallel Extensions (Lipiec 2008), tworzonej jeszcze w ramach Microsoft Research. Przygotowałem prezentacje, dema, pytania (były nagrody), no i oczywiście przemowę. Tydzień przed wydarzeniem Microsoft wypuścił CTP (Community Technology Preview) środowiska Visual Studio 2010. Upieczemy dwie pieczenie na jednym ogniu, pomyślałem. Pierwsza publiczna demonstracja Visual Studio 2010 w Polsce przypadła właśnie mnie (nie słyszałem, żeby ktoś pokazał to środowisko wcześniej, w końcu ja zrobiłem to kilka dni po premierze, wybaczcie mi skromność). Na wydziałowym, 4 rdzeniowym serwerze, zamontowaliśmy wspólnie z Rafałem obraz, wykorzystując technologię Hyper-V, i wypuściliśmy zdalny pulpit na świat. Wszystko dopięliśmy na ostatni guzik. W dniu konferencji tłumów nie było, co nie zmniejszyło jednak stresu. Moja prezentacja była przedostatnia, za to poprzednie wystarczająco wysoko podniosły poprzeczkę. 3.. 2… 1… Start!

Jeden slajd, drugi… ani się obejrzałem, a zaczęło brakować mi czasu, miałem tylko godzinę. Ostatecznie nie pokazałem wszystkich dem, za to wszystkie dostępne nagrody (książki i office’y) rozdałem w mig! Kurcze, naprawdę mnie słuchali i znali odpowiedzi na podchwytliwe pytania, a myślałem, że zostanie coś dla mnie… Żartuję! Dzisiaj, ponad 1,5 roku po tym wydarzeniu, żałuję, że nie zagłębiłem się w temat programowania równoległego jeszcze bardziej. W tym momencie wiem niewiele więcej, a temat poszerzył się n-krotnie. Moja praca inżynierska była, rzecz jasna, ważniejsza. Ale uwaga… moja praca magisterska będzie się bardzo wiązać z tym zagadnieniem, a dokładnie, z weryfikacją aplikacji równoległych.

Z wydarzenia, oprócz doświadczenia w prezentacjach, został mi jeszcze power point, artykuł na codeguru (pierwsza część) oraz źródła przedstawianych aplikacji. Jeśli ktoś nie miał przyjemności pracować z biblioteką ParallelFX, myślę, że będzie to dobra lektura. Dodatkowo w prezentacji zawarłem animacje przedstawiające prace menadżera zadań TPL (Task Parallel Library). Polecam!

Załączniki:

Pamięć Transakcyjna - STM [502.94 kB]
Parallel Extensions Presentation [3.21 MB]

Promuj