Programowanie na wesoło

Na temat programistów stworzono już niejeden dowcip i w niejedną flanelową koszulę ich ubrano. Przedstawiciele innych zawodów potrafią się z nas śmiać, bo na widok programisty kobiety uciekają –  a błąd! Ostatnie badania udowodniły że nerdzi (geecy) są lepszymi kochankami!

Ha! Brawo Sheldon! Brawo Bing Bang Theory!

Ale dziś nie o tym. Natknąłem się na kolejny filmik związany z programistami, a że zabrało się już ich kilka, chciałbym Wam je zaprezentować ;]

  • Java 4-ever – film utrzymany w konwencji kinowego trailera. Historia chłopca, którego ojciec od dziecka uczył technologii Microsoftu, chłopca, który postawił się ojcu, chłopca, który został programistą Java ;]
  • And so you code – coś dla prawdziwych cowboy’ów klawiatury, ukryta reklama biblioteki do wszystkiego – uniPaaS. Film z podkładem muzycznym, który na pewno znacie :)
  • Ruby on Rails vs .NET #9 – pomysł na reklamówkę Ruby on Rails ściągnięty prosto od Apple’a – „I’m a Mac, and I’m a PC”, „I’m a Ruby on Rails, and I’m .NET”. Reklama numer 9. Chociaż śmieją się z mojego ulubionego środowiska, to i ten film uznaję za przedni. W pozostałych reklamówkach naśmiewają się także z Javy :)
  • Piosenka o smutnym programiście – HIT nad HITY!!! „Programuje w dotnecie już 3 stulecie…” Musicie tego posłuchać! „I zmierzam do celu z użyciem ‚siquelu’ pod Microsoft Windows Vista”.
  • Lady Java – GaGa spiewa o Javie? Si! Film dla fanów  j j j j j java zone ;] Naturalnie jest wrzuta na Billa i .NET

Na pewno możecie mnie zasypać innymi fajnymi numerami?

Promuj

Dwie świetne sesje o ASP.NET MVC 2

Na kanale 9 znalazłem dwie świetne sesje o ASP.NET MVC 2. Jeśli do tej pory nie miałeś okazji poznać tej technologii, to te dwa nagrania są właśnie dla Ciebie! Nie oznacza to, że bardziej wtajemniczeni nie znajdą tam czegoś dla siebie – znajdą! Gwarantuję.

Obydwie sesje prowadzi Scott Hanselman, najzabawniejszy prezenter jakiego miałem okazję oglądać. Nie używa PowerPointów i często zdarza mu się uciekać od tematu, ale spokojnie, po chwili do niego wraca, po prostu musi powiedzieć coś śmiesznego ;] To on stworzył NerdDinner – aplikacje, którą zna każdy programista ASP.NET MVC. Hanselman jest także współautorem książki Professional ASP.NET MVC 1MVC 2.

Te dwie sesje to:

  • ASP.NET MVC 2: Basics – całkowite podstawy, zaczynamy od File > New Project. Żadnej większej teorii czy rozwodzenia się na temat MVC – konkrety i jeszcze raz konkrety. Nie ma dużo kodowania, ale cały czas spędzimy w Visual Studio.
  • ASP.NET MVC 2: Ninja Black Belt Tips – triki Ninja mówią same za siebie ;] Hanselman pokazuje, jak działa T4 (narzędzie do generacji kodu z szablonów) w MVC, prezentuje różne silniki renderowania, a także nowości w MVC2 m.in. EditorFor, DsiplayFor.

Obydwie sesje zostały nagrane podczas holnderskiego DevDays w kwietniu tego roku.

Miłego oglądania ;]

Promuj

Pamięć Transakcyjna – Istniejące implementacje – cz.2

W poprzednim poście przedstawiłem Wam kilka istniejących implementacji STM, a dzisiaj chciałbym dopełnić tę listę o kilka równie ważnych rozwiązań.

NSTM [2] to .NETowe rozwiązanie Ralfa Sudelbuchera, który na swoim blogu w kilku wpisach [1] wyjaśnia dokładnie, w jaki sposób z niego korzystać.  Tak jak poprzednio opisywane rozwiązania, NSTM opakowuje obiekty, ale w inny sposób, niż robi to np. SXM – opakowując wskazane metody i właściwości obiektu. NSTM trzyma wewnątrz fasady obiekt danej klasy, może go nam zwrócić (zapisze to wtedy w logu) i wtedy mamy możliwość jego modyfikacji, ale nastepnie należy go znów w całości zapisać. Przykład ze strony Ralfa:

  1. INstmObject<double> myAccount;
  2. INstmObject<double> yourAccount;
  3.  
  4. myAccount = NstmMemory.CreateObject(1000);
  5. yourAccount = NstmMemory.CreateObject(500);
  6.  
  7. using (INstmTransaction tx = NstmMemory.BeginTransaction())
  8. {
  9.    double amountToTransfer = 150;
  10.    myAccount.Write(myAccount.Read() – amountToTransfer);
  11.    yourAccount.Write(yourAccount.Read() + amountToTransfer);
  12.    tx.Commit();
  13. }

Kolejnym rozwiązaniem autorstwa trochę większego producenta niż jednoosobowy zespół Ralfa jest Intel® C++ STM Compiler, Prototype Edition 3.0 [3]. Na początek zachęcam do obejrzenia Flashowej prezentacji omawiającej problem transakcji. Choć wszystkie napisy w owej prezentacji brzmią „undefined„, to animacja przedstawiona na rysunku obok doskonale tłumaczy zasady STM. Wracając jednak do samego rozwiązania. Środowisko to oczywiście C++. Odpowiednie metody klas (te, których chcemy używać w transakcji) należy opatrzyć atrybutem __declspec(tm_callable), samą transakcję deklarujemy przy pomocy bloku __declspec(tm_callable). Przykład ze strony producenta, w powiązaniu z OpenMP:

  1. include<stdio.h>
  2.  
  3. int xx = 0;
  4.  
  5. class Base {
  6.   public:
  7.   __declspec(tm_callable)
  8.   virtual void TxnAddOne() {
  9.     xx = xx + 1;
  10.   }
  11. };
  12.  
  13. class Virtual : public Base {
  14.   public:
  15.   __declspec(tm_callable)
  16.   void TxnAddOne() {
  17.     xx = xx + 1;
  18.   }
  19. };
  20.  
  21. int main() {
  22.   Base *x, *y;
  23.  
  24.   __tm_atomic {
  25.     x = new Base();
  26.     x->TxnAddOne();
  27.   }
  28.  
  29.   __tm_atomic {
  30.     y = new Virtual();
  31.     y->TxnAddOne();
  32.   }
  33. }

[Pobierz cały kod ze strony Intela]

Na rozwiązaniu Intela chciałbym zakończyć przedstawianie implementacji STM. Większość tych, które nie zostały omówione, nie była uaktualniana od kilku lat, a jak wiemy, w branży IT 2-3 lata to przepaść.

Był to ostatni wpis na temat Pamięci Transakcyjnej. W następnych postach z cyklu „Go Parallel, be Master” postaram się opisać kolejny sposób na tworzenie aplikacji równoległych, jednak tym razem z wykorzystaniem agentów oraz wiadomości. Zapraszam.

Źródła:

Promuj

Pamięć Transakcyjna – Istniejące implementacje – cz.1

Na rynku istnieje wiele rozwiązań implementująych STM – zdziwilibyście się, jak wiele. Są to rozszerzenia dla więkoszści języków: zaczynając od C, przez C++, C#, Java, Haskell, Perl. Dość pokaźna lista znajduje się w wikipedii. W tym poście chciałbym omówić jedynie kilka.

Rozwiązanie, którego wydajność opisywałem w poprzednim poście, jest modyfikacją maszyny wirtualnej Javy. Dokładny opis znajduje się w dokumencie [1] oraz na tej stronie. Można pobrać przykładowy kod i spróbować samemu uruchomić to rozwiązanie.

Drugie rozwiązanie, jakie chciałbym zaprezentować, zostało stworzone w laboratoriach Microsoft Research (prawdopodobnie przy pomocy Brown University), i nosi nazwę SXM (dokumentacja znajduje się tutaj [2]). Wersję 1.0 można pobrać tutaj [3], a wersję 1.1 tutaj [4]. Jest to implementacja na platformę .NET w postaci specjalnej biblioteki. Zamysł jest prosty: klasy, których chcemy używać równolegle, musimy zarejestrować w fabryce obiektów i dzięki tej fabryce musimy te obiekty tworzyć. Właściwości, których będziemy używać, należy dodatkowo opatrzyć specjalnym atrybutem. Fabryka dynamicznie tworzy podklasę i opakowuje atrybuty w specjalne wywołania – to są właśnie atonomiczne bloki. Dynamiczne tworzenie podklas możliwe jest dzięki mechanizmom z przestrzeni nazw System.Reflection.Emit.  Ponadto kod źródłowy SXM, która można pobrać z podanych linków [3,4], zorganizowany jest jako benchmark. Zawiera dwie różne implementacje fabryk, nakłaniając programistę do napisania swojej i sprawdzenia jej wydajności z istniejącymi.

Kolejne rozwiązanie, również na platformę microsoftu, to STM.NET. Można śmiało założyć, że SXM był pierwowzorem, na którym bazowali inżynierowie tworzący STM.NET. Historia tego produktu jest jednak o wiele bardziej ciekawa. STM.NET funkcjonował od jakiegoś czasu jako projekt na DevLab’ach, czyli wyżej w hierarchii niż MS Research. Blog zespołu tworzącego można śledzić tutaj nadal, mimo tego, że projekt został zakończony – tak można przeczytać na oficjalnej stronie rozwiązania – dnia 13 maja br. Dla programisty zostawiono jedynie podręcznik użytkownika. Rozwiązanie to nie było biblioteką, a zmodyfikowaną wersją platformy .NET 4 beta 1. Jak wiemy, mechanizm transakcji najlepiej sprawdzi się wtedy, kiedy będzie na stałe zintegrowany z platformą, na jaką został napisany – tak właśnie uczynili inżynierowie.

Według mnie projektu nie wycofano, bo był on mało przydatny. Myślę, że wejdzie on w skład Parallel Extensions w następnej wersji platformy – ale to tylko moje domysły. Dlaczego tak uważam? Wiadomo dokładnie, jak nazywał się plik, który był do pobrania w czasie trwania projektu (dotNetFx40_STMNet_10_x86.exe). Na zagranicznych portalach, na których był udostępniany, została po nim tylko notka, że usunięto zasób ze względu na prawa autorskie (zobacz). Ktoś się natrudził, aby to uczynić. Nie ustrzeżono się jednak błędów. Mimo usunięcia strony pobierania archiwa z przykładami i dokumentacją bezpośredni link do pliku działał jeszcze przez ponad miesiąc. Spragniony tego rozwiązania nadal szukam w czeluściach Internetu pliku ze zmodyfikowaną wersją platformy…

W następnym poście opiszę kolejne implementacje. Zapraszam.

Źródła:

Update, godz 14:30:

Z nieznanych mi przyczyn, podany link do zmodyfikowanej platformy, w serwisie depositfiles, zaczął nagle działać.

Promuj

Go Parallel, Be Master

Jeśli widzieliście moją prezentację o Programowaniu Równoległym, wiecie, że nie jest mi obcy temat równoległości, wielowątkowości i wieloprocesorowości, uff…. Teraz ta znajomość wchodzi na inny poziom. Moja praca magisterska, której obrona planowana jest na luty 2011 r., będzie ściśle powiązana z tym zagadnieniem. Tematem jest paralelizm aplikacji oraz jego weryfikacja. W skrócie: mam wymyślić, jak w możliwie automatyczny sposób zrównoleglić aplikację oraz w jaki sposób zweryfikować takie zrównoleglenie.

Pierwsza część polega na zbudowaniu narzędzia (prawdopodobnie pluginu do Visual Studio), który będzie podpowiadał programiście, które elementy kodu można zrównoleglić oraz jak to zrobić, używając znanych metod i rozwiązań. Druga część, ściśle powiązana z pierwszą, ma na celu zweryfikowanie, czy podział aplikacji na niezależne, równoległe ciągi instrukcji nie zmieni jego zachowania w każdym możliwym przypadku szeregowania; ma być to dowód formalny.

Jak widać, zagadnienie nie jest trywialne, więc na początek będę musiał się troszkę podszkolić, przekopać przez tony literatury i kodu źródłowego. W cyklu notek opatrzonych tagiem „magister” będę na bieżąco raportował moje postępy. Zatem zaczynajmy…

Jeśli chodzi o programowanie równoległe (używając tej nazwy, będą odnosił się jednocześnie do programowania wielowątkowego i wieloprocesorowego), to na samym początku należy opanować podstawy. Czym jest wątek, proces, deadlock, mutex, monitor? Nie będę tego opisywał, ale proponuję samodzielnie poczytać i pomyśleć. Dodatkowo polecam serię artykułów o wielowątkowości na blogu Piotra Zielińskiego. Zostały tam opisane wspomniane elementy oraz ich zastosowanie w środowisku .NET.

Celem pierwszego etapu mojej pracy jest zapoznanie się z możliwie jak największa liczbą zaawansowanych rozwiązań do kontroli/wprowadzania równoległości. Przez zaawansowane mam na myśli wszystko poza klasycznym mutexem, semaforem czy monitorem. Oczywiście w tych rozwiązaniach takie właśnie mechanizmy zostały użyte, ale głęboko, głęboko, pod maską. Programiście zostaje za to udostępniony zupełnie inny, bardziej przyjazny interfejs. Na początek Parallel Extensions…

Nie będę się powtarzał i odsyłam zainteresowanych do mojego artykułu na CodeGuru (część 1, bo 2 nigdy nie powstała – mój błąd). Opisuję tam podstawy tego rozwiązania, wyjaśniam, jak to naprawdę działa, i kiedy należy takie mechanizmy stosować. Dodatkowo zachęcam do subskrypcji blogu zespołu rozwijającego ten produkt – PFX Team. Przynajmniej raz na tydzień pojawia się nowa notka opisująca pewną funkcjonalność produktu. Wspomnieć należy również o Parallel Computing Developer Center w strukturach portalu MSDN. Zebrano tam dziesiątki artykułów, przykładów, screencastów i wywiadów z osobami odpowiedzialnymi za projekt. Polecam!

Na koniec warto wspomnieć o konkurencyjnym rozwiązaniu dla języków C/C++  – OpenMP.

Promuj

.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

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