poniedziałek, 22 czerwca 2009

MTS 2009 – zostało coraz mniej czasu..

Zostało już tylko kilka dni, aby zarejestrować się na konferencję MTS2009 w promocyjnej cenie 450 PLN. Od pierwszego lipca 2009 uczestnictwo w niej będzie kosztować 650 PLN, a po 1 września 1500 PLN.


Dodatkowo do 30 czerwca obowiązuje specjalna promocja dla członków społeczności codeguru.pl (http://www.codeguru.pl/fullnews-4183.aspx ) i WSS.pl (http://wss.pl/NewsList/1,10929.aspx ). Cena dla tych osób to stówa mniej, czyli 350 PLN.

Link do rejestracji: https://mts2009.pl/rejestracja/

Speaker Idol

Korzystając z okazji, chciałem również przypomnieć o odbywającym się w czasie konferencji konkursie Speaker Idol. Zwycięzca otrzyma możliwość prowadzenia własnej prezentacji za rok oraz chwałę na wieki! Link do szczegółów wydarzenia: http://www.mts2009.pl/agenda/speaker-idol

---

Ja będę, a ty?

Jacek Ciereszko

poniedziałek, 1 czerwca 2009

C2C potrzebuje wsparcia

Wspomóż C2C!

Pamiętasz konferencję C2C? Popierasz idee i życzysz dla konferencji jak najlepiej? To koniecznie przeczytaj poniższą wiadomość od organizatorów:

" Przygotowania do konferencji C2C 2009 rozpoczęły się w październiku 2008 roku. Od strony finansowej całe przedsięwzięcie obsługiwać miało stowarzyszenie PDG, które rozliczało również C2C 2008. Na początku 2009 roku PDG zrezygnowało ze współpracy z grupami off-line. Dla organizatorów C2C 2009 oznaczało to brak możliwości zgodnego z prawem rozliczenia konferencji C2C. Na szczęście, dzięki uprzejmości fundacji PROIDEA, stan taki nie trwał długo. Konferencja szczęśliwie została zorganizowana.

Niestety stowarzyszenie PDG do dnia dzisiejszego nie przelało wszystkich środków C2C na konto fundacji PROIDEI. Z tego powodu budżet całego przedsięwzięcia posiada niedobór środków na kwotę ponad 6 000 PLN. Dlatego też zwracamy się do wszystkich osób, którym idea konferencji jest bliska o pomoc.

Jednocześnie chcielibyśmy poinformować, iż organizatorzy C2C 2009 wystąpią na drogę sądową przeciwko stowarzyszeniu PDG w celu odzyskania nieprzekazanych pieniędzy. "

Źródło wiadomości oraz oficjalna treść pod adresem: http://communities2communities.org.pl/pl/News/09-05-31/Finanse_C2C_2009.aspx

Wszelka pomoc finansowa (nawet drobna) będzie mile widziana.

EDIT:

Numer konta oraz aktualny stan zebranej kwoty podany jest na stronie http://zine.net.pl/

Pozdrawiam,

Jacek Ciereszko

poniedziałek, 25 maja 2009

Silverlight 3.0 + Out Of Browser = RDA?

W końcu, kiedy ogarnąłem się z dodatkowych zadań (Imagine Cup 2009 oraz kwietniowy numer SDJ) mogę zabrać się za opisywanie wszystkich nowinek Silverlighta 3.0!!! Trochę tego jest, w związku z tym zacznę od tych (moim zdaniem) najciekawszych :)

Out Of Browser

Pierwszą nowinką nad która chciałby się skupić jest Out Of Browser (OOB), czyli możliwości instalacji aplikacji RIA na lokalnym komputerze. Tym którzy jeszcze o tym nie słyszeli, przypomnę że od wersji Silverlight 3.0 istnieje możliwość stworzenia aplikacji którą będzie można instalować lokalnie na komputerze i korzystać z niej bez uruchamiania przeglądarki, taki OneClick (dla niektórych Java WebStart). Stąd też przyszedł mi do głowy tytułowy skrót RDA -> Rich Desktop Application ;)

Opcja ta jest skierowana przed wszystkim do aplikacji które działają w środowisku bez stałego dostępu do Internetu (z ang. Occasionally Connected). W ten sposób możemy używać aplikacji przez cały czas, nawet gdy chwilowo nie mam dostępu do sieci i otworzenie programu w przeglądarce było by nie możliwe.

Demo

Zaczniemy z grubej rury czyli od istniejącej aplikacji – Run DEMO - Chess!!

Aplikacja ta to szachy stworzone na potrzeby konferencji MIX09, które po zainstalowaniu pozwalają na grę w trybie lokalnym. Aby móc ją zobaczyć i zagrać musimy mieć zainstalowany plugin Silverlight 3.0 SDK (w obecnej wersji jest to Beta 1 spod adresu link).

Grę możemy zainstalować klikać w przycisk "Install Chess Now" lub klikając prawym przyciskiem myszki w aplikacje i wybranie opcji instalacji. W czasie instalacji w systemie operacyjnym Windows mamy do wyboru umieszczenie skrótu do gry na pulpicie lub/i w menu start, natomiast w MACu user ma większą dowolność i może instalować aplikację (skrót) gdzie mu się podoba. W Windows nikt nie zabroni tam także przenieść skrótu do aplikacji w inne miejsce ale nie jest to coś co możemy wybrać podczas instalacji. Jeśli wszystko się uda, to możemy zamknąć przeglądarkę i uruchomić grę z umieszczonego skrótu.

Jak zauważyliście w przykładzie, instalacja nie jest tak dowolna jak w przypadku zwykłych aplikacji, a więc do wyboru mamy tylko miejsce wskazania skrótu do aplikacji. Cała reszta jest schowana przed użytkownikiem i nie pozwala na modyfikację.

Warto wspomnieć, że zainstalowana aplikacja może działać bez dostępu do Internetu i synchronizować swoje dane jak tylko taki dostęp otrzyma. Za przestrzeń do przechowywanie danych możemy wykorzystywać Isolated Storage, który po instalacji aplikacji pozwala na przechowywanie aż 25MB danych bez pytania o zgodę użytkownika, co w przeciwieństwie do 1MB gdy uruchamiamy aplikację w przeglądarce, robi różnicę. Pamiętajmy że zawsze możemy zwiększyć tą przestrzeń, o ile użytkownik wyrazi zgodę. (patrz artykuł o Isolated Storage).

Z poziomu aplikacji bardzo szybko możemy także odinstalować grę, klikamy prawym myszki i wybieramy opcję "Remove this application..". Całość jest dość wygodna w użytkowaniu i nie sprawia większych problemów.

Zróbmy swoją aplikację

W celu demonstracji jak łatwe jest włączenie opcji instalacji RIA na komputerze lokalnym, stworzymy prostą aplikację "Witaj Świecie" która oprócz przywitania się będzie pokazywać czy jest uruchamiana w przeglądarce oraz czy ma dostęp do Internetu.

I. Podstawowa instalacja

Pierwszym krokiem jest otwarcie Visual Studio oraz wybranie nowego projektu SilverlightApplication (może to być także inny typ projektu Silverlight, ale to akurat nie ma znaczenia).

Aby aplikacja mogą być instalowana, program musi być do tego specjalnie stworzony dlatego też otwieramy plik "AppManifest.xaml" z katalogu "Properties". Jeśli mamy zainstalowaną wersję Silverlight 3.0, powinniśmy zobaczyć w środku trochę wykomentowanego kodu.


<Deployment.ApplicationIdentity>
<ApplicationIdentity
ShortName="Out of Browser Silverlight Application"
Title="Window Title of Your Silverlight Application">
<ApplicationIdentity.Blurb>Description of your Silverlight application</ApplicationIdentity.Blurb>
</ApplicationIdentity>
</Deployment.ApplicationIdentity>

Kod ten odpowiada właśnie za włączenie opcji instalacji aplikacji RIA. Wystarczy że odkomentujemy go i nasza aplikacja może być od tej pory instalowana na lokalnym komputerze.

Zanim uruchomimy po raz pierwszy program, dodajmy prosty TextBlock w pliku MainPage.xaml, tak abyśmy widzieli że aplikacja działa.

<UserControl x:Class="SilverlightOOBApplication.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="300">
<Grid x:Name="LayoutRoot" Background="White">
<TextBlock Text="Witaj Świecie" />
</Grid>
</UserControl>

Teraz możemy uruchomić program. Klikamy prawym przyciskiem myszki w aplikacji i wybieramy "Install Out of Browser Silverlight … onto this computer"

Następnie wybieramy gdzie chcemy aby pojawił się skrót do zainstalowanej aplikacji, czy ma być to pasek menu czy skrót na pulpicie i zatwierdzamy.

W tym momencie powinien pojawić się nasz HelloWorld w okienku. Jeśli zamkniemy program i udamy się na pulpit lub menu start, znajdziemy tam skrót do naszej aplikacji. Wystarczy odpalić go jak zwykły program aby zobaczyć że nasz program działa tak samo ale bez uruchamiania przeglądarki.

II. Dostosujmy instalacje do naszych potrzeb

Przede wszystkim możemy dostosować takie parametry jak krótki opis aplikacji (ShortName) który używany jest chociażby do podpisania skrótu na pulpicie do aplikacji. Tytuł aplikacji (Title) pojawiający się miedzy innymi w oknie aplikacji którą uruchamiamy offline lub podczas instalacji oraz parametr większego opisu (ApplicationIdentity.Blurb) używany jako treść tooltipów.

W celu przetestowania ustawmy ShortName na np. "Welcome App", tytuł na "Witam w aplikacji powitalnej" oraz ApplicationIdentity.Blurb na "To jest aplikacja powitalna", tak jak w zamieszczonym przykładzie poniżej.

AppManifest.xaml:

<Deployment.ApplicationIdentity>
<ApplicationIdentity
ShortName="Welcome App"
Title="Witam w aplikacji powitalnej">
<ApplicationIdentity.Blurb>To jest aplikacja powitalna</ApplicationIdentity.Blurb>
</ApplicationIdentity>
</Deployment.ApplicationIdentity>

Dodatkowo warto pokusić się o własne ikonki. Wstawianie ich jest banalnie proste i jedyne co musimy dostarczyć to obrazki oraz odpowiednie wpisy w pliku AppManifest.xaml. Dostarczane obrazki mogą być typu png i wystarczy je umieścić w projekcie oraz dołączyć w pliku xml. Uwaga, dodane ikonki należy ustawić jako "Content" w projekcie, a nie "Resource". Aby to zmienić, klikamy prawym myszki na ikonce w Visual Studio i przestawiamy wartość "Build Action" na "Content".


Ikonki dodajemy w 4 różnych rozmiarach w celu dostarczenia odpowiednich obrazków dla okna instalacji, skrótu na pulpicie, w menu start itd. W pełni zmodyfikowany kod pliku AppManifest.xaml może wyglądać np. tak:

<Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Deployment.Parts> </Deployment.Parts>

<Deployment.ApplicationIdentity>
<ApplicationIdentity ShortName="Welcome App" Title="Witam w aplikacji powitalnej">
<ApplicationIdentity.Blurb>To jest aplikacja powitalna</ApplicationIdentity.Blurb>
<ApplicationIdentity.Icons>
<Icon Size="16x16">images/icons/user-16.png</Icon>
<Icon Size="32x32">images/icons/user-32.png</Icon>
<Icon Size="48x48">images/icons/user-48.png</Icon>
<Icon Size="128x128">images/icons/user-128.png</Icon>
</ApplicationIdentity.Icons>
</ApplicationIdentity>

</Deployment.ApplicationIdentity>

</Deployment>

III. Świadomość aplikacji o aktualnym stanie instalacji

W celu wykrycia czy aplikacja została uruchomiona lokalnie, wystarczy w pliku App.xaml.cs w metodzie obsługi eventu "Startup" dodać sprawdzenie na zmiennej "

Application.Current.RunningOffline
".
public partial class App : Application
{
public App()
{
this.Startup += this.Application_Startup;
...
}

private void Application_Startup(object sender, StartupEventArgs e)
{
if (Application.Current.RunningOffline)
{
this.RootVisual = new OfflinePage();
}
else
{
this.RootVisual = new MainPage();
}
}
}

A więc zmienna "RunningOffline" dostarczy nam informacji o trybie pracy aplikacji i np. jak w powyższym przykładzie pozwoli na wybranie odpowiedniego wygląda aplikacji.

IV. Świadomość aplikacji o aktualnym stanie połączenia z Internetem

Aby pozyskać informację o tym czy aplikacja ma podłączenie do Internetu, wykorzystamy klasę "NetworkInterface", a dokładnie jej metodę "NetworkInterface.GetIsNetworkAvailable()". Metoda ta zwraca wartość typu bool która informuje nas o tym czy połączenie do Internetu jest możliwe.

Dodatkowo możemy chcieć żeby aplikacja wykonała powyższe sprawdzenie w momencie gdy dostęp do Internetu się pojawia lub znika. W tym celu możemy wykorzystać event z klasy "NetworkChange.NetworkAddressChanged". Obie powyższe klasy są zadeklarowane w namespace "System.Net.NetworkInformation".

Spójrzmy na przykładowy kod który możemy umieścić np. w klasie MainPage.xaml.cs:

public MainPage()
{
InitializeComponent();
NetworkChange.NetworkAddressChanged += new NetworkAddressChangedEventHandler(OnNetworkChange);
}

void OnNetworkChange(object sender, EventArgs e)
{
if (NetworkInterface.GetIsNetworkAvailable())
{
// połączenie instnieje...
}
else
{
// brak połączenia
}
}

W konstruktorze dodajemy obsługę eventu zmiany połączenia, a w metodzie "OnNetworkChange" obsługujemy to zdarzenie. Aplikacja sprawdza czy istnieje połączenie i według tego podejmuje odpowiedni kroki.

Warto zwrócić tutaj uwagę na sytuację gdy mamy dwa dostępne połączenia. Gdy jedno "padnie" to w/w event zostanie wywołany ale metoda "NetworkInterface.GetIsNetworkAvailable()" wciąż zwróci true ze względu na to że istnieje wciąż inne połączenie. W związku z tym wszelkie przełączanie dostępności według np. flagi nie ma tutaj sensu i może powodować niepotrzebne błędy w działaniu programów.

Dodatkowo połączenie do sieci w której nie ma Internetu to także połączenie. Jest to ogromna wada całego tego rozwiązania ale może w kolejnych wersjach będzie to poprawione.

V. Automatyczne aktualizacje aplikacji

Pewnie część z Was zastanawia się już co z aktualizacją wersji aplikacji, w jaki sposób poradzić sobie z aktualizacją programów. Otóż OOB w Silverlight załatwia nam to z automatu, kiedy pojawia się nowsza wersja, zostaje ona pobrana i zainstalowana przy kolejnym uruchomieniu. Taki mechanizm jest bardzo wygodny i zapewnia spójność wersji programów zainstalowanych lokalnie oraz tych działających online. Dodatkowo możemy poinformować użytkownika o nowych wersjach poprzez skorzystanie z eventu

ExecutionStateChanged i App.Current.ExecutionState
.

App.xaml.cs:

public App()
{
..
this.ExecutionStateChanged += new EventHandler(App_ExecutionStateChanged);
..
}

void App_ExecutionStateChanged(object sender, EventArgs e)
{
if (App.Current.ExecutionState == ExecutionStates.DetachedUpdatesAvailable)
{
MessageBox.Show("Ukazała się nowsza wersja programu. Proszę zrestartować aplikację.");
}
}

"ExecutionStateChanged" zostaje wywołany zawsze gdy stan aplikacji się zmienia. Warto zwrócić uwagę że "ExecutionStates" posiada także atrybuty takie jak "Detached", "DetachFailed", "Detaching" oraz "RunningOnline" które możemy sprawdzić gdy stan aplikacji się zmieni i wykonać odpowiednie operację. Np. gdy instalacja aplikacji lokalnie się nie powiedzie, metoda "ExecutionStateChanged" zostanie wywołana, a stan "ExecutionState" zostanie ustawiony na "DetachFailed". W tym momencie możemy wykonać dowolną operację która rozwiąże problem lub zasugeruje użytkownikowi inne rozwiązanie. To samo tyczy się pozostałych stanów.

Jak widzimy, taki typ obsługi daje nam skuteczny mechanizm zarządzania instalacją aplikacji i przełączania jej trybów działania.

Online Sample

Powyższą aplikację możemy zobaczyć pod adresem: (wymagany Silverlight 3.0 Beta 1) Live DEMO

Kod źródłowy dostępny jest pod adresem: link

Wnętrze

Od strony zaplecza, cały mechanizm działa na zasadzie zrzutu aplikacji Silverlight do przestrzenie użytkownika i nadaniu mu unikatowego numeru. Numer ten jest wykorzystywany do uruchamiania aplikacji. Sam proces uruchamiania odbywa się za pomocą pliku sllauncher.exe znajdującego się w plikach zainstalowanego plug-ina Silverlighta (zwykle jest to katalog: C:\Program Files\Microsoft Silverlight\3.0.40307.0\sllauncher.exe).

Jeśli przyjrzymy się na przykład skrótowi z pulpitu do aplikacji, zobaczymy coś w stylu:

C:\Program Files\Microsoft Silverlight\<wersja>\sllauncher.exe <adres.id>

Gdzie "wersja" to numer aktualnej wersji Silverlighta (w chwili pisania tego artykułu jest to 3.0.40307.0), a numer "adres.id" to adres strony i numer nadany dla aplikacji. Taki skrót może wyglądać np. tak:

"C:\Program Files\Microsoft Silverlight\3.0.40307.0\sllauncher.exe" localhost.4

lub

"C:\Program Files\Microsoft Silverlight\3.0.40307.0\sllauncher.exe" www.jacekciereszko.pl.2

W Windows Vista naszą zapisaną aplikację możemy znaleźć na przykład pod adresem

"C:\Users\<nazwa użytkownika>\AppData\LocalLow\Microsoft\Silverlight\Offline\<adres.id>"

gdzie mechanizmy Silverlighta przechowują pliki xap, html i jeszcze kilka plików. W innych systemach operacyjnych adres ten zapewne będzie inny, ale w żaden sposób nie będzie nam potrzebny do pracy z programem, a więc nie martwcie się jeśli nie dogrzebiecie się do swojego repozytorium.

Należy pamiętać że aplikacja przez cały czas pozostaje uruchomiona w sandbox-się, a więc po instalacji na komputerze nie otrzymuje żadnych dodatkowych uprawnień i jest traktowana tak samo jak ta uruchamiana w przeglądarce. Zaletą tego rozwiązania jest to, że użytkownik nie potrzebuje praw administratora do instalacji aplikacji.

Tak jak wspomniałem powyżej, zainstalowana aplikacja może mieć świadomość tego czy komputer jest podłączony do Internetu, działać gdy takiego połączenia nie ma oraz być powiadamiana o zmianie jego statusu. To ostatnie wydaje się szczególnie ważne, gdy tworzymy aplikację która będzie gromadzić dane i synchronizować je okazjonalnie (tzw. emisariusze). Mechanizm ten jest także wykorzystywany do update-ów aplikacji i obsługiwany automatycznie przez mechanizmy Silverlighta. Tak jak wspominałem powyżej, aplikacja która wykryła nowszą wersję, pobiera ją i instaluje przy kolejnym uruchomieniu aplikacji.

Wygląd

Aby wyjść naprzeciw oczekiwaniom użytkownika, Microsoft pozwoli nam customizować nasze aplikację w zależności od tego czy jest ona zainstalowana czy uruchamiana z przeglądarki. A więc na przykład w wersje uruchamianej w przeglądarce, umieścić tylko przycisk instalacji, a w wersji zainstalowanej całą aplikację, tak jak to widzieliśmy na przykładzie gry w szachy.

W tej wersji Silverlighta, okno uruchomieniowe programów zainstalowanych lokalnie pozwala tylko na ustawienie ikonki, tytułu oraz pozycji na ekranie. Jak podaje Microsoft, więcej opcji dostosowywania wyglądu okna pojawi się w kolejnych wersjach.

Debuger

Pierwszym poważnym problemem na który natknąłem się był brak debuggera. News o tym znalazłem na stronie transcriptu z jednej z sesji MIX09. Szybko jednak doinformowano mnie o zapomnianym "Attach Process" z VS który prawie idealnie rozwiązuje problem. Prawie, ponieważ nie jest to wygodne i trochę utrudnia pracę (np. podłączenie aplikacji do procesu).

Ograniczenia

Ponieważ w planie miałem stworzenie aplikacji która instaluje się lokalnie na komputerze klienta, oraz obsługuje Silverlight Navigation i kontrolkę Silverlight Virtual Earth Map Control, szybko przekonałem się że nie wszystko będzie działać. Należy pamiętać, że po instalacji aplikacji na komputerze lokalnym trochę rzeczy jednak się zmienia i np. komunikowanie się z mapą staje się niemożliwe ze względu na brak "współpracy" z HTML DOM. Sugerował bym najpierw upewnić czy to co chcemy zrobić zadziała (małe PoC) zanim zaplanujemy całe rozwiązanie.

Resources

  • Wspaniały screencast Tim Heuera pokazujący krok po korku jak stworzyć aplikacje OOB – link,
  • Strona z szachami - link,
  • Szereg artykułów na temat OOB – link.

Live demo stworzonej aplikacji: link

Kod źródłowy dostępny jest pod adresem: link

Pozdrawiam
Jacek Ciereszko

czwartek, 21 maja 2009

VS 2010, a wybór używanej wersji Silverlighta

Wreszcie od wersji Visual Studio 2010 mamy wybór w której wersji SDK chcemy tworzyć aplikację! Co nam to daje? Chociażby jednoczesną możliwość pracy z wersjami Beta oraz wersjami stabilnymi, bez konieczności stawiania oddzielnego środowiska czy tez deinstalacji którejś z wersji.

Ponieważ VS 2010 to jeszcze wersja beta, instalacja jest trochę utrudniona. Otóż należy:

  1. Przede wszystkim zainstalować Visual Studio 2010 (obecnie Beta 1)
  2. Następnie instalujemy SDK dla Silverlight 2.0 (Silverlight 2 SDK). Tu ważne żeby nie pomylić instalacji z wersją "toolsów" ponieważ możemy otrzymać błędy.
  3. Kolejnym krokiem jest instalacja SDK dla wersji 3.0 (Silverlight 3 Beta SDK). Tu także uwaga na wersję "toolsów" (Silverlight 3 Beta Tools for Visual Studio) - nie pomylić.
  4. I na końcu instalujemy Runtime (Silverlight 3 Beta Developer Runtime).

Po tak przeprowadzonej instalacji powinniśmy mieć możliwość wyboru SDK podczas tworzenia projektu. Co więcej, nowy Visual Studio 2010 pozwala także na zmianę wersję w trakcie tworzenia aplikacji. Wystarczy przełączyć tą opcję w ustawieniach projektu.

Aby sprawdzić że wszystko działa, uruchommy nowego Visual Studio 2010 Beta 1 i wybierzmy nowy projekt "Silverlight Application".

Jeśli rozwiniemy listę wersji w oknie wyboru (patrz screen) zobaczymy że możemy wskazać tą która nam najbardziej pasuje w danym momencie.

Podsumowując

Jeśli chodzi o ogólne wrażenie nowego VS 2010 to jest przyjemny i wygodny, jednak braki związane z Silverlightem + wersją Beta 1 wciąż skłaniają mnie do używania VS 2008, przynajmniej dopóki oficjalna wersja VS 2010 nie będzie dostępna.

Resources


Pozdrawiam,

Jacek Ciereszko

poniedziałek, 18 maja 2009

Imagine Cup 2009 – relacja uczestnika

W tym roku po raz pierwszy zdecydowałem się wziąć udział w konkursie ImagineCup 2009 w kategorii "Projektowanie oprogramowania". Konkurs w Polsce dobiegł końca, nagrody rozdane, zwycięzcy wybrani, w związku z tym czas na małe podsumowanie całej imprezy.

Mówiąc w skrócie, konkurs polega na stworzeniu ciekawej aplikacji która oprócz swojej innowacyjności ma uratować świat - przynajmniej takie jest założenie :). Uczestnicy mieli za zadanie zmierzyć się z celami ustalonymi przez ONZ, a było to 8 celów milenijnych (Milenijne Cele Rozwoju), a hasło przewodnie konkursu brzmiało "Wyobraź sobie świat, w którym technologia pomaga rozwiązać najtrudniejsze problemy ludzkości".

Nie chciałbym opisywać idei imprezy ponieważ więcej i lepiej możemy znaleźć w Internecie, dlatego po więcej szczegółów odsyłam na strony: imaginecup.pl, imaginecup.com, Interia, WSS, IWP, IWP2 , a sam skupie się na własnej relacji :]

Zmagania drużyny RHEA

Jak się zapewne domyślanie, drużyna do której mam zaszczyt należeć nazywa się RHEA i reprezentuje Politechnikę Białostocką. W skład drużyny wchodzą:

Agata Grzybek, Joanna Wacław, Arkadiusz Kondratiuk oraz ja – Jacek Ciereszko.

Naszym mentorem był Marcin Bartoszuk, a super grafikiem Krystian Karpiuk.

Nasza przygoda z imagine cup rozpoczęła się w listopadzie gdzie przypadkowy pomysł przeniesienia siatek centylowych do sprawdzania stanu rozwoju dziecka do świata elektronicznego, stał się czymś więcej niż tylko pomysłem i zwykłym projektem na uczelni. Do początku grudnia skompletowaliśmy drużynę, mentora oraz grafika i maszyna ruszyła!

Na początku, gdy terminy były jeszcze bardzo daleko, robota szła bardzo powoli, a leniwe święta wcale nam nie pomagały. Na szczęście pierwszy termin oddania zarysu pomysły na tworzoną aplikację mijał 19 stycznia, co zmusiło nas już do mobilizacji. W tym momencie mieliśmy także zrobiony klikalny prototyp aplikacji desktopowej z ustaloną zawartością ekranów oraz ich kolejnością.

Po 19 stycznia

Mimo wykorzystywania oszacowań na podstawie liczby i stopnia skomplikowalności przypadków użycia (tak tak, robiliśmy doce!) mieliśmy już bardzo mało czasu, a przerwa wymuszona przez sesje na studiach przerwała nam prace na kolejne 2 tygodnie.

Po sesji i feriach, wreszcie udało się zorganizować repozytorium kodu w postaci TFS, zakończyć wszystkie wymagane PoC (Proof Of Concept) i rozpocząć implementowanie! W sumie kodowanie według ustalonego harmonogramu oraz sporządzonych ekranów rozpoczęliśmy od początku marca. Prace developerski staraliśmy się prowadzić według założeń SCRUMa, organizując co dzienne spotkania (scrum meeting) późno wieczorem, które raczej kończyły się wymianą emaila, niż rozmową, jednak mimo to bardzo dobrze się sprawdzały.

Marzec osobiście wspominam jako wyjęty z życia, wszyscy wyrabialiśmy drugi etat (niektórzy po pracy). Ja osobiście zerwałem wszystkie nocki od początku marca aż do 8 kwietnia, z wyjątkiem 13.05 kiedy miałem imprezę ;) .

To czym mogę pochwalić się w przy okazji developmentu, to że mieliśmy przygotowaną dobrą architekturę w postaci prostego rozwarstwienia oraz użytego patternu MVVM. Napisałem dobrą, ponieważ ten zestaw doskonale się sprawdził do naszych potrzeb. Szybka rzeźba w kodzie utrudniała by nam pracę w późniejszych etapach, a z drugiej strony rzucenie się na np. PRISM było by czymś na wyrost.

Warstwę dostępu do danych załatwiliśmy prawie w 100% poprzez LINQtoSQL, a prezentacji przy użyciu MVVM. To co mogę powiedzieć na temat tego ostatniego, to jedno wielkie POLECAM! Pomimo dodatkowego narzutu pracy, zyski w postaci separacji "logiki widoku" od samego widoku są niesamowite. Ułatwiły stworzenie testów, wprowadzanie zmian w kodzie oraz reużywalność niektórych elementów, po prostu cudo! :)

Tak stworzona architektura oraz wcześniej zaplanowane ekrany, usystematyzowały naszą pracę i pozwoliły szacować potrzebny czas. Ten model pracy okazał się skuteczny i godny polecenia.

Działającą aplikację wraz ze screencastem oddaliśmy 8 kwietnia, czyli w dzień deadline-u. Sam screencast nagrywaliśmy 2 dni, a ostatnie zmiany w aplikacji były robione jeszcze rano ;)

Ponieważ 28 kwietnia było dopiero ogłoszenie listy finalistów, wszyscy zrobiliśmy sobie przerwę. Dziewczyny z drużyny spędziły je na nadgonieniu zaległych projektów, a ja wyczekiwałem wyników.

Po 28 kwietnia

Rezultat był niespodziewany, ponieważ dostaliśmy się do pierwszej dziesiątki!! Maszyna znowu ruszyła. Odgrzebaliśmy kod w którym na szczęście oprócz kliku drobiazgów nie musieliśmy za dużo zmieniać. Kod trafił na nasz wewnętrzny UAT oraz testy HCI. W miedzy czasie przygotowywaliśmy się do sesji plakatowej i ewentualnej prezentacji. Swoją drogą jest to duży minus całego konkursu że wszyscy przygotowują prezentację ale tylko połowa ma później szanse ją wygłosić. Trochę to nie w porządku że ludzie uczą się czegoś na marne.

12 maj - półfinały

To już dziś, dzień sesji plakatowej. Specjalnie na tą okazję udało nam się wypożyczyć od firmy Hewlett-Packard specjalny komputer HP TouchSmart IQ500 z ekranem dotykowym za co bardzo dziękujemy!!

Spakowaliśmy cały sprzęt i przybyliśmy na finały. Sędziowie chodzili po stoiskach od 14:00, dlatego też wszyscy zjawili się około 12:00 żeby się przygotować. Nasze stoisko oprócz zgromadzonego sprzętu oraz kilku rekwizytów nie miało żadnych rzutników, plakatów i innych urządzeń ale mimo to chyba nie wyglądało źle :)

Sędziowie chodzili w grupach po 2 i 3 osoby i dla każdej drużyny mieli max 30 minut na zapoznanie się z systemem. W tym czasie każda z drużyn bombardowała ich przemówieniami, pokazami, ulotkami, a nawet słodyczami :P

My osobiście wszystkich sędziów wspominamy bardzo dobrze, żaden nie powiedział nam żeby coś mu się nie spodobało, panowała pełna kultura i w żaden sposób nie przypomniało to telewizyjnych programów "IDOL" czy też "Mam Talent".

Całość zakończyła się lekko po 19:00, kiedy to spakowaliśmy nasze rzeczy i udaliśmy się czym prędzej do domu w celu przygotowań do ewentualnej prezentacji. Tu kluczowy okazał się TIGER który po całym dniu wrażeń i stresu postawił nas na nogi.

13 maj –finały imagine cup 2009

Ten dzień zapamiętałem jako wyjątkowo nerwowy. Rano szybko powtórzyliśmy prezentację i udaliśmy się na ogłoszenie wyników. Na miejscu było już dużo ludzi więc po cichu usiedliśmy sobie gdzieś z brzegu i czekaliśmy na wyniki.

Po krótkim wstępie wyczytano 5 finałowych drużyn: Demoscene Spirit, FTeamS, kAMUflage, NosoiFighters oraz naszą RHEA.

Radość była ogromna. Nie wiedzieliśmy czego się spodziewać, więc wynik był bardzo miłą niespodzianką.

Po chwili niepewności związanej z kolejnością prezentacji, udaliśmy się na dalsze przygotowania. Jak się okazało, mamy numer 4 i będziemy mieli swój pokaz od razu po przerwie kawowej. Pozostały czas przeznaczyliśmy na kolejne przygotowania.

Wybiła 12:45, czyli czas występu. Oczywiście jak na złość Internet nie działał, ale mieliśmy plan B na takie okoliczności w postaci komórki :] Kiedy wszyscy goście wrócili z przerwy, rozpoczęliśmy. Pomimo tremy i małej wpadki w tekście, prezentacja przebiegła raczej pomyślnie (czekamy na nagranie z IPW). Po prezentacji było forum przedsiębiorczości, a myśmy udali się na mały obiadek.

Wyniki! Wyniki były ogłaszane powoli, co dodatkowo zwiększyło stres. No i stało się, zostaliśmy wyczytani jako drużyna która zajmie 4 miejsce razem z drużyną FTeams. Trzecie miejsce zajęła drużyna NosoiFighters, drugie Kamuflage, a pierwsze DemoScene. Jak to mówią "Winner Take All" i także tym razem tak było, jednak mimo to nie zabrało nam to radości z tego co udało nam się dokonać do tej pory. Dostarczone aplikację były na bardzo wysokim poziomie i mam nadzieję że DemoScene w tym roku sięgnie także pierwszego miejsca w Egipcie! Był by to bardzo miły akcent przed przyszłorocznymi światowymi finałami ImagineCup 2010 które mają odbyć się właśnie w Polsce.

Wieczorem Microsoft ugościł wszystkich miłą imprezką integracyjną na której to rzeczywiście poznałem mnóstwo ludzi oraz miałem okazję porozmawiać z tymi których widuje na co dzień na forach codeguru itp.

Podsumowanie

Podsumowując, cieszę się że wziąłem udział w tym konkursie. Może i nie zajęliśmy miejsca na podium ale tworząc nasz system, w bardzo krótkim czasie przerobiliśmy tyle technologii i nauczyliśmy się tak wiele, że zdobyta wiedza jest bezcenna, a korzyści z jej płynące będą długotrwałe. Sam bardzo chciałem zrobić coś większego w WPF, tutaj miałem doskonałą motywację i się udało. Oprócz tego, używaliśmy między innymi: Silverlight 3.0 Beta 1, PEX, MVVM, LINQtoSQL, MS SQL Server, TFS, Windows Mobile, WCF, Silverlight Virtual Earth Map Control, Mashup, czytniki linii papilarnych itd., wszystkie te i nie tylko technologie otrzymaliśmy w skondensowanej dawce w ciągu kilku miesięcy i mogę się założyć że gdyby nie ImagineCup, zapewne nie sięgnęlibyśmy po nie jeszcze długo (no może oprócz Silverlight 3 :P ).

Chciałem także tak na samym końcu pogratulować organizatorom ImaineCup 2009. To nie był mój pierwszy konkurs w którym brałem udział, ale na pewno był to konkurs najlepiej zorganizowany. Zarówna cała impreza jak i wsparcie było bardzo dobrze przemyślane. Organizatorzy, tu szczególnie należy wymienić Piotra Kramka, odpowiadali na każde zapytanie, bardzo często wieczorami i w weekendy, w godzinach w których powinni mieć wolne, oni czuwali aby każdy był poinformowany i każdy wiedział co się dzieje. Liczne spotkania, livemeeting-i oraz emaile usprawniły cały proces, za co należy się duże podziękowanie organizatorom!


Wybrane linki o ImagineCup

Pozdrawiam,

Jacek Ciereszko

niedziela, 26 kwietnia 2009

Silverlight Count Down Control – Wasze dni są policzone

Jakiś czas temu wymyśliłem sobie malutki programik który będzie odliczał ustawiony czas. Ktoś by zapytał: po co to komu? Jednak jak się dobrze zastanowić, to taki "counter" czasu może być bardzo fajnym dodatkiem do wielu stron. Na pewno fajnie przypomni o nadchodzącej konferencji czy też spotkaniu, chociaż jestem przekonany że znajdzie się dla niego wiele innych ciekawych zastosowań :)

Wychodząc naprzeciw oczekiwaniom stworzyłem taki programik i umieściłem wraz z kodem źródłowym na codeplex-sie pod adresem: http://silverlightgadgets.codeplex.com/ (mam nadzieję że uda mi się tam także umieścić wiele innych "gadgetów")

Demo znajdziecie pod adresem (tak wiem, grafika wygląda tragicznie ;)):

http://wpierdalaj.pl/SWG/SilverlightCountDown/Run/SilverlightCountDownTimerExampleTestPage.html

Jak go użyć

Counter został stworzony tak aby był łatwo konfigurowalny i zgodny z wymaganiami wzorca Model-View-ViewModel (MVVM). Najłatwiej jest zwyczajnie:

  1. Pobrać bibliotekę kontrolki (SilverlightCountDownTimer.dll) ze strony http://silverlightgadgets.codeplex.com/,
  2. Dołączyć ją do rozwijanego projektu (Add References),
  3. Umieścić w kodzie:
<UserControl x:Class="SilverlightCountDownTimerExample.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:timeCounter="clr-namespace:SilverlightTimer assembly=SilverlightCountDownTimer"
Width="200" Height="100">
<Grid x:Name="LayoutRoot" Background="Transparent">
<timeCounter:SilverlightTimerControl EventDescription="Time to New Year Party"
EventTime="2010-01-01 00:00" />
</Grid>
</UserControl>

Tak jak widzimy w przykładzie, wystarczy wstawić kontrolkę i ustawić podstawowe parametry aby odliczanie ruszyło.

Parametry

Do dyspozycji mamy następujące parametry konfiguracji kontrolki:

  • EventDescription – Tekst który wyświetli się pod odliczanym czasem. W tej wersji istnieje ograniczenie długości pola tekstowego jakie może pomieścić textbox.
  • EventTime – Data do której będzie odliczany czas.
  • EventTimeUrl – Adres pliku tekstowego który zawiera datę. Ten parametr umożliwia dynamiczne modyfikowanie daty bez ingerencji w kod aplikacji. Wystarczy że zmienimy datę w pliku, a counter zacznie odliczać czas do nowej daty. Przykładowy plik z datą: http://wpierdalaj.pl/SWG/date.txt. Uwaga, jeśli ustawimy także parametr "EventTime", "EventTimeUrl" zostanie pominięty. Parametr"EventTime" ma pierwszeństwo przed "EventTimeUrl". Należy także zwrócić uwagę czy plik z datą jest dostępny dla odwołań z zewnątrz (patrz ustawienia Client Access Policy na blogu Tim Heuera)
  • CounterFinish – Event który zostanie wywołany gdy counter skończy odliczanie. W ten sposób możemy zainicjalizować jakąś akcję w aplikacji gdy upłynie ustawion czas.
  • EventTimeCache – Ten parametr uruchamia funkcję cache'owania daty. Ma to zapobiec sytuacji nadmiernego odpytywania serwera (poprzez parametr EventTimeUrl) o datę do odliczania. Odpytanie jest mało kosztowne, a sama data to kilka bajtów, ale jeśli można odciążyć serwer, to warto skorzystać z tej możliwości. Domyślnie cache jest wyłączony, a jego czas ważności ustawiony na jeden dzień, po tym terminie counter sprawdzi czy ma aktualne dane.
  • EventTimeCacheDuration – Ta opcja zmienia domyślny czas cachowania daty. Jednostką jest dzień, a więc ustawienie tego parametru na wartość 40, sprawi że aplikacja przez 40 dni nie będzie aktualizować odliczanej daty.

Wszystkie wyżej wymienione parametry możemy także ustawiać bezpośrednio w kodzie i zmieniać w czasie działania kontrolki. Np.:

.XAML:

<timeCounter:SilverlightTimerControl x:Name="myCounter" />

.CS (C#):

myCounter.EventTime = new DateTime(1983, 12, 14, 0, 0, 0);
myCounter.EventDescription = "Moje Urodziny";

Ponieważ aplikacja wspiera pattern Model-View-ViewModel (MVVM), możliwe jest także ustawienie binding-u na w/w paramentry. Np.:

<timeCounter:SilverlightTimerControl x:Name="myCounter" EventTime="{Binding Path=EventTime}" />

Podłączenie aplikacji bez dotykania kodu i Visual Studio

Dla tych którzy nie mają ochoty na zabawę z Visual Studio, dostępna jest także opcja gotowej aplikacji konfigurowanej z poziomu kodu html. W pliku "HtmlVersion" znajduje się kompletny przykład takiej konfiguracji, a poniżej wycinek z pliku SilverlightCountDownTimerExampleTestPage.html:

<object data="data:application/x-silverlight-2,"
type="application/x-silverlight-2" width="100%" height="100%">
<param name="source" value="ClientBin/SilverlightCountDownTimerExample.xap"/>
<param name="onerror" value="onSilverlightError" />
<param name="background" value="white" />
<param name="minRuntimeVersion" value="3.0.40307.0" />
<param name="autoUpgrade" value="true" />

<!--// EventTimeUrl will be ignored because EventTime is set-->
<param name="initParams"
value="EventDescription=Time to MIX 2010,
EventTime=2010-03-15 08:00,
EventTimeUrl=http://wpierdalaj.pl/SWG/date.txt,
EventTimeCache=True,
EventTimeCacheDuration=40"
/>

</object>

Aby uruchomić counter, nie musimy ustawiać wszystkich w/w parametrów. Jeśli coś nie działa, sprawdźcie czy nie zrobiliście błędu w zapisie. Niestety opcja "initParams" jest bardzo czuła na dodatkowe znaki oraz nie pozwala na znaki specjalne, np. cudzysłowy czy przecinki w ustawianych wartościach.

Dodatki

Jeśli chcemy aby counter był klikalny i np. przekierował osobę na inną stronę, wystarczy otoczyć go prostym Hiperlinkiem w kodzie XAML:

<HyperlinkButton NavigateUri="http://jacekciereszko.pl" TargetName="_blank" >
<timeCounter:SilverlightTimerControl x:Name="myControl" />
</HyperlinkButton>

Wygląd

Na ten moment nie przewiduje dla "countera" skinsów ani wsparcia na zmianę grafiki. Powodem tego jest brak jakichkolwiek umiejętności graficznych, w związku z tym zakładam że każdy będzie sam w stanie korzystając z kodu źródłowego dostosować wygląd aplikacji do swoich potrzeb.

Jeśli znajdzie się ktoś kto chciałbym coś ładnego namalować i się tym podzielić, chętnie dodam to do projektu.

Podsumowanie

Proszę piszcie jeśli macie jakieś propozycje lub zastrzeżenia, będę starał się ulepszać na bierząco "odliczacza" czasu :) Na razie planowany jest downgrade do wersji Silverlight 2.0.

Strona projektu: http://silverlightgadgets.codeplex.com/

Pozdrawiam,

Jacek Ciereszko

wtorek, 14 kwietnia 2009

IT Academic Day w PJWSTK

W imieniu organizatorów chciałbym serdecznie zaprosić wszystkich studentów na konferencję IT Academic Day dnia 23 kwietnia 2009 w siedzibie uczelni przy ul.Koszykowej 86.


W czasie spotkania będziecie mogli zapoznać się z nowościami w Silverlight 3 i IE8 - obydwie prezentacje poprowadzi Bartłomiej Zass z firmy Microsoft. Grzegorz Niemirowski zaprezentuje system operacyjny Microsoftu w całości oparty na kodzie zarządzanym. Robert Kapuściński natomiast opowie o tym jak radzić sobie z wirusami tylko i wyłącznie za pomocą narzędzi dostępnych w Windows.

sobota, 21 marca 2009

Silverlight 3 na IT Academic Day w Warszawskiej Wyższej Szkole Informatyki

W imieniu organizatorów chciałbym serdecznie zaprosić wszystkich studentów na konferencję IT Academic Day dnia 2 kwietnia 2009 w siedzibie uczelni przy ul.Lewartowskiego 17.

W czasie spotkania możecie zobaczyć między innymi akademicką premierę Silverlighta 3, którą poprowadzi Bartłomiej Zass z firmy Microsoft. Krótko omówione zostaną także nowości w IE8, proste metody unieszkodliwiania wirusów komputerowych, przyszłość aplikacji Web oraz nowości w SQL Server 2008.

Zapraszam w imieniu organizatorów do zapoznania się ze szczegółami na stronie: http://dotnet.wwsi.edu.pl/itad

--
Jacek Ciereszko

niedziela, 15 marca 2009

[C2C 2009] Rozwiązanie konkursu kartkowego

Konferencja C2C 2009 dobiegła końca, zdobyliśmy trochę wiedzy i poznaliśmy nowych ludzi. Zostały miłe wspomnienia i odliczanie do C2C 2010. Zanim przejdę do rozwiązań konkursu "kartkowego", chciałbym podziękować jeszcze raz wszystkim uczestnikom za przybycie (ze wszystkich zarejestrowanych na ścieżkę .NET nie stawiły się mniej więcej tylko 2 osoby!), sponsorom za wsparcie i pozostałym organizatorom za poświęcenie swojego czasu dla stworzenia tak wspaniałego wydarzenia (szczególnie tym najbardziej zasłużonym – będą wiedzieć którzy to :) ).

Konkurs jak przypomnę składał się z 5 pytań i miał naturę "haczykowatą" oraz miał za zadanie być jak najtrudniejszy. Jak wyszło oraz czy zadania były fajne, okaże się w komentarzach :]

Zadanie 1

class A
{
protected int i = 2;
}

class B : A
{
private int i;

public B() {
i = 2009;
}
}

class C : B
{
public int GetNumber()
{
return i;
}
}
Wywołanie:
C c = new C();
int result = c.GetNumber();
Jaki będzie wynik wykonania programu:
1. Zmienna „result” będzie równa 2,
2. Zmienna „result” będzie równa 2009,
3. Zmienna „result” będzie równa 0,
4. Kod się nie skompiluje,
5. Wystąpi błąd w czasie działania aplikacji.

Prawidłowa odpowiedź to oczywiście 1.

Podczas inicjalizacji konstruktora w klasie B, "i" zmieni się tylko lokalnie, ponieważ jest private. W klasie C, zmienna "i" będzie pobrana z klasy A, gdzie wynosi 2.

Zadanie 2

       byte a = 10;
byte b = 01;
byte c = a + b;
Jaki będzie wynik wykonania programu:
1. Zmienna „c” będzie zawierać liczbę 1001,
2. Zmienna „c” będzie zawierać liczbę 11,
3. Zmienna „c” będzie zawierać liczbę 3,
4. Kod się nie skompiluje,
5. Wystąpi błąd w czasie działania aplikacji.

Prawidłowa odpowiedź to 4.

Kod się nie skompiluje, ponieważ domyślnym typem wartości z dodawania jest integer (int), a przypisanie byte c = integer; - bez rzutowania, rozpoznawane jest jako błąd (integer może nie zmieścić się w byte i mogą zostać utracone dane).

Zadanie 3

class A
{
public A(int number)
{
number = number;
}
public int number = 2;
}

class B : A
{
public B(int number)
{
number = new A(number).number;
}
}

class C : B
{
public C(int number)
: base(number)
{

}
}
Wywołanie:
C c = new C(2009);
int result = c.number;
Jaki będzie wynik wykonania programu:
1. Zmienna „result” będzie zawierać liczbę 2,
2. Zmienna „result” będzie zawierać liczbę 2009,
3. Zmienna „result” będzie zawierać liczbę 0,
4. Kod się nie skompiluje,
5. Wystąpi błąd w czasie działania aplikacji.

Prawidłowa odpowiedź to 4.

To zadanie polegało na wykryciu braku konstruktora bezparametrowego w klasie A. Jak zapewne każdy z nas wie, gdy w klasie istnieje jakikolwiek inny konstruktor, to kompilator nie generuje tego domyślnego bez parametru. W tym zadaniu w klasie B, poszukiwany jest domyślny bezparametrowy konstruktor z klasy A, który nie istnieje i kod w związku z tym się nie kompiluje.

Zadanie 4

Dana jest następująca tablica:
string[] imiona = { "Adam", "Ala", "Michał" };
Który fragment kodu poprawnie wyświetli imiona na konsoli?
1. foreach (var imie in imiona.Where(imie => imie.IndexOfAny(new char[] { 'a' }) > 0)) {
Console.WriteLine(imie ?? String.Empty.ToString()); }
2. foreach (int imie in imiona.SingleOrDefault(imiona => imiona.Length)) {Console.WriteLine(imiona[i]);}
3. Array.ForEach((from imie in imiona select imie.ToString()), imie => Console.WriteLine(imie));
4. foreach (string imie in imiona) { Console.WriteLine(imiona[imie.IndexOf(0)]); }
5. foreach (string imie in imiona) { Console.WriteLine(imiona); }

Prawidłowa odpowiedź to 1.

Trochę LINQu pomieszane z czym się dało. Szacunek dla tych którzy potrafili przeanalizować ten kod. :]

Zadanie 5

class Parent
{
static Parent()
{
_message = "Hello!";
}

static public string Message
{
get { return _message; }
}

static protected string _message;
}

class Child : Parent
{
static Child()
{
_message = "Hello, World!";
}
}
Wywołanie:
Console.WriteLine(Child.Message);
new Child();
Console.WriteLine(Child.Message);
Jaki będzie wynik wykonania programu:
1. Na konsole zostaną wypisane znaki: "Hello!", "Hello!",
2. Na konsole zostaną wypisane znaki: "Hello!", "Hello, World!",
3. Na konsole zostaną wypisane znaki: "Hello, World!", "Hello, World!",
4. Na konsole zostaną wypisane znaki: "Hello, World!", "Hello!",
5. Kod się nie skompiluje.

Prawidłowa odpowiedź to 2.

Ostatnie zadanie i chyba najtrudniejsze ze wszystkich, wymagało bardzo dobrej znajomości kompilatora C#. Niektórzy nazywają to zachowanie Bugiem kompilatora. Wartość _message nie zostanie ustawiona dopóki nie było pierwszego odwołania do konstruktora Child. Pierwsze odwołanie new Child() ustawia nową wartość zmiennej _message. Stąd też najpierw tekst "Hello!" a później "Hello, World!".

Podsumowanie

Dziękuje wszystkim którzy wzięli udział w konkursie, mam nadzieje że podobał się Wam i gratuluje wygranych!


Pozdrawia,

Jacek Ciereszko

środa, 4 lutego 2009

Silverlight 3.0 już 18-20 marca?

Wszyscy szczęściarze którzy będą mieli okazje pojechać na konferencję Mix 2009, zapewne pierwsi zobaczą nową wersję Silverlighta 3!!! Jak piszą Jesse Liberty oraz Scott Guthrie na swoich blogach, możemy spodziewać się ogłoszenia wydania nowej wersji już nie długo.

Natomiast jeśli przyjrzymy się agendzie konferencji MIX 2009, to wszystko wskazuje że to tam pierwszy raz zobaczymy nowego Silverlighta w wersji 3! Jeśli sięgniemy pamięcią do roku poprzedniego, zobaczymy że także w trakcie MIX 2008, pojawił się Silverlight 2.0 w wersji Beta 1.

Wybrane sesje z MIX2009:

  • What's New in Silverlight 3. Learn about the new experience-oriented Silverlight 3 features, and see how to build Silverlight 3 applications using Expression Blend and Visual Studio.
  • What's New in Silverlight 3 Media. Learn about the latest media features available with Silverilght 3.
  • Deep Dive into Silverlight Graphics. Hear about the Silverlight 3 rendering pipeline, and learn how to enhance your application experience with the latest additions to the Silverlight graphics APIs.

Pozostało tylko czekać i liczyć na to, że będziemy mogli obejrzeć nagrania z sesji :)

A co nowego w Silverlight 3? Scott Guthrie na swoim blogu wspomina że nowy Silverlight 3 będzie zawierać wsparcie dla plików kompresji wideo H.264. Wprowadzi zmiany w grafice, w tym grafikę 3D oraz wykorzystanie akceleracji sprzętowej kart graficznych. Rozbudowane zostaną mechanizmy bindowania danych, dodane będą nowe kontrolki, a designer do Visual Studio i Visual Web Developer Express będzie umożliwiać pełną edycję GUI i wsparcie bindowania danych.

Warto zwrócić uwagę, że Scott wymieniając te nowości, pisze że jest to tylko mała część zmian które nastąpią w nowym Silverlight 3 :)

Biorąc pod uwagę liczbę prezentacji poświęconych Silverlightowi na MIX 2009 (według agendy na 38 sesji, aż 12 dotyczy bezpośrednio tej technologii) można wnioskować, że Microsoft wciąż bardzo mocno wspiera jej rozwój i jest to zdecydowanie technologia w którą możemy inwestować swój czas i pieniądze.

Resources