czwartek, 26 czerwca 2008

Materiały z sesji „Nowości w Silverlight 2.0” na wg-net (www.wg.net.pl)

W dniu 26-06-2008 miałem zaszczyt poprowadzić wykład na temat Silverlight-a 2.0. Wykład trwał około godziny i (mam nadzieje) zawarł podstawowe informacje o używanych narzędziach do pracy z Silverlightem oraz krótkie demo bazujące na znanym przykładzie aplikacji "Hello World". Głównym celem sesji, było zapoznanie słuchaczy z tematyką Silverlight-a i pokazanie kilka "bajerów", które zachęcą ich do samodzielnego zapoznania się z tą technologią.



Czy się udało oraz czy poprowadzona sesja spodobała się Wam, okaże się w ankiecie ;) A teraz czas na materiały z wykładu.

Sesja składała się z kilku slajdów i dwóch dem:

Slajdy w postaci Deep Zoom Composera


Prezentacja (odpalać w IE, w pełnym ekranie od wersji SL 2.0 Beta 2 nie działa Mouse Whell ;) )

Demo 1

Pierwsze demo


Demo 2

Drugie demo

Filmik nagrany w trakcie spotkania


Download

Zapraszam do wypełnienia ankiety ze spotkania link. Wyniki jej, pozwolą określić, jakie błędy robię oraz czy chcecie abym w przyszłości "wystąpił" przed wami ponownie.



p.s. a Ci co wyszli z mojej prezentacji na mecz i tak w pierwszej połowie bramki nie zobaczyli (Hiszpania poczekała ) :P

p.s.2 kto robił zdjęcia? Jak fajne to proszę o podesłanie, załączę do wpisu no i chciałbym mieć sobie na pamiątkę :)

Pozdrawiam i dziękuje wszystkim przybyłym,
Jacek Ciereszko

wtorek, 10 czerwca 2008

Full Screen aplikacji w Silverlight 2.0 RTW

Jak zrobić full screen w Silverlight 2.0 RTW chyba każdy już wie, gdyż rozwiązanie nie różni się niczym od poprzednich wersji. Jednak samo wprowadzenie aplikacji w stan pełnego ekranu nie daje nam powiększenia aplikacji, tylko schowanie ramki przeglądarki oraz paska stanu. Nasza aplikacja jak była, tak i dalej ma ten sam rozmiar.

No wiec jak zmienić rozmiar aplikacji, aby powiększała się wraz z oknem przeglądarki? Rozwiązanie jest dość proste, wystarczy wykorzystać możliwości, jakie dają nam transformacje oraz grafika wektorowa.

Zacznijmy jednak od prostego full screena. Aby przełączyć aplikację w stan pełnego ekranu, wystarczy ze wywołamy:


Application.Current.Host.Content.IsFullScreen = !Application.Current.Host.Content.IsFullScreen;


Teraz dodamy do aplikacji przycisk oraz w metodzie click wywołamy w/w linie kodu.

Page.xaml:

<Button Content="Full Screen" Click="Button_Click" />

Page.xaml.cs:

 private void Button_Click(object sender, RoutedEventArgs e)

{
Application.Current.Host.Content.IsFullScreen = !Application.Current.Host.Content.IsFullScreen;

}

Odpalamy aplikacje i "włala"! Full Screen działa, czas na resize aplikacji. Aby wykonać poprawnie resize i móc wrócić do poprzedniego stanu, musimy dodać zmienną transformacji do głównej canvy/grida aplikacji.


<Grid.RenderTransform>

<ScaleTransform ScaleX="1" ScaleY="1" x:Name="RootLayoutScaleTransform" />

</Grid.RenderTransform>

Należy także pamiętać o oryginalnym rozmiarze aplikacji

_oldHeight = this.Height;

_oldWidth = this.Width;

oraz dodać obsługę eventu zmiany rozmiaru aplikacji oraz full screenu, w których to funkcjach robimy wszystkie przekształcenia:

Application.Current.Host.Content.Resized += new EventHandler(Content_Resized);

Application.Current.Host.Content.FullScreenChanged += new EventHandler(Content_Resized);


void Content_Resized(object sender, EventArgs e)

{

double currentWidth = Application.Current.Host.Content.ActualWidth;

double currentHeight = Application.Current.Host.Content.ActualHeight;


double uniformScaleAmount = Math.Min((currentWidth / _oldWidth), (currentHeight / _oldHeight));

RootLayoutScaleTransform.ScaleX = uniformScaleAmount;

RootLayoutScaleTransform.ScaleY = uniformScaleAmount;

}

Jeśli używamy myszki i zczytujemy jej współrzędne w aplikacji, np. do przeciągania obiektów itd. wtedy należy pamiętać o przeliczaniu wartości współrzędnych przez naszą zmienną transformacji uniformScaleAmount.

double currentY = e.GetPosition(null).Y / uniformScaleAmount;

double currentX = e.GetPosition(null).X / uniformScaleAmount;


Ograniczenia

Chciałem jeszcze tylko dodać, że aby zmień tryb aplikacji na pełny ekran, powyższe komendy należy wykonać z metody obsługi eventa. Powodem takich ograniczeń jest nasze bezpieczeństwo. Chyba nikt nie chce widzieć Silverlightowych banerów, które otwierają się same na pełny ekran i nie chcą się schować ;)

Kolejnym ograniczeniem w stanie full screen jest używanie klawiatury oraz myszki. W trybie pełnego ekranu, mamy tylko dostęp do:

  • strzałek oraz spacji na klawiaturze

  • przycisków myszki (kólko, tzw. mouse wheel, nie działa w trybie pełnego ekranu)
Co do tego ostatniego, to mam tylko uwagi pod kątem Deep Zoom Composera, gdzie mouse wheel jest używana i bez kółeczka to już nie ta sama zabawa!!!

Więcej na temat ograniczeń znajdziecie w MSDNie link.


To wszystko co do full screen-a oraz resize okna w Silverlight 2.0 RTW. Rozwiązanie jest proste i łatwo jest je wstawić do większości aplikacji. Zajmie nam to chwile, a otrzymujemy nową i ciekawą funkcjonalność.


Source code aplikacji:

source code

Działające demo:

Wciśnij przycisk żeby przejść w tryb pełnego ekranu. Rozciągnij okno, żeby zobaczyć resize aplikacji.

play demo

Resources

  • Blog Mike-a Snows-a link
  • Blog Jeffa Blankenburga link

english version -> link

Pozdrawiam,
Jacek Ciereszko

poniedziałek, 9 czerwca 2008

Problem z Web Services w Silverlight 2.0 Beta 2

Kolejny dzień i kolejne problemy z nową wersją Silverlighta. Tym razem 'web serwisy'. Ponieważ troszkę się naszukałem, to postanowiłem podzielić się z Wami znalezionym rozwiązaniem.

Problem

Problem pojawia się, gdy chcemy użyć web serwisa (WCF, ASMX, etc.) w projekcie z nową wersją Silverlighta 2 Beta 2.0, a objawia się takim oto komunikatem:

Error "Object reference not set to an instance of an object"

Z tego, co ludzie piszą, nie u każdego się pojawił, więc nie musi akurat Was to dotyczyć.

Powód

Powodem dlaczego się tak dzieje jest plik Microsoft.VisualStudio.ServicesProxy.dll, który podczas instalacji nie zostaje nadpisany przez instalkę "Microsoft Silverlight Tools Beta 2 for Visual Studio 2008" (link). W efekcie, Visual Studio 2008 używa własnej, starej i nienadpisanej wersji pliku.

Rozwiązanie

Rozwiązaniem jest ręczne przeniesienie pliku Microsoft.VisualStudio.ServicesProxy.dll z katalogu (Wasza ścieżka do Visual Studio) ..\Microsoft Visual Studio 9.0\Common7\IDE\do jakiegoś dowolnego innego katalogu (nie kasować, tylko przenieść – bezpieczniej jest = backup).

Następnie w Control Panel - > Programs and Features znajdujemy wpis "Microsoft Silverlight Tools Beta 2 for Visual Studio 2008" i sprawdzamy rozmiar. Jeśli zamiast 1.17MB lub 1.18MB widzimy 1.14MB, no to pewno mamy do czynienia z w/w problemem i musimy odinstalować Microsoft Silverlight Tools Beta 2 for Visual Studio 2008" i zainstalować je ponownie.

Tym razem, gdy w Visual Studio 2008 nie będzie już pliku Microsoft.VisualStudio.ServicesProxy.dll, instalacja wgra swój własny, prawidłowy plik.


Resources

  • Tim Anderson's blog link
  • Forum silverlight.net link


Pozdrawiam,
Jacek Ciereszko

Problem z instalacją „Microsoft Silverlight Tools Beta 2 for Visual Studio 2008”

Wraz z nową wersją Silverlight 2.0 Beta 2, pojawiły się nowe problemy. Oprócz wielu zmian (link), możemy natknąć się także na problemy z instalacją toolsów do Visual Studio 2008.

Jeśli podczas instalacji, mimo że usunęliście wszystkie stare wersje programów, otrzymujecie błąd, sprawdźcie czy otrzymujecie taki ekran:

oraz czy plik z logami (log file) zawiera taki wpis (lub podobny :P)?

(IronSpigot::ExeInstallerBase::PerformAction) PerformOperation on exe returned exit code 1603 (translates to HRESULT = 0x80070643)

Jeśli Twoja odpowiedź brzmi TAK! To znaczy, że należy usunąć zainstalowany update dla Visual Studio 2008.

Zanim przystąpicie do odinstalowania, upewnijcie się że odinstalowaliście poprzednie wersje programów: Blend, Deep Zoom Composer, poprzednie toolsy do Visual Studio oraz Silverlight Beta 1 runtime oraz macie przy sobie płytki instalacyjne Visual Studio 2008.

Aby usunąć dodatek, należy przejść do listy updatetów (Windows Vista) Start -> Control Panel -> Programs and Features i po lewej stronie wybrać "View Installed Updates".

Z listy która się wyświetli, wybieramy pozycję "Update for Microsoft Visual Studio 2008… (KB949325)". Czyli tą, oznaczoną numerem KB949325.

Po udanym odinstalowaniu, problem nie powinien się powtórzyć i wreszcie będziecie mogli przystąpić do przerabiania swoich aplikacji z wersji Beta 1 do wersji Beta 2. I kiedy już nie będziecie wiedzieć czemu Wasz kod się kompiluje, a mimo to nie działa i wyrzuca błędy podczas uruchamiania, zajrzyjcie na stronę What's Different in Beta 2.

Resources


Pozdrawiam,
Jacek Ciereszko

środa, 4 czerwca 2008

Silverlight 2.0 Beta 2 już jest!

Właśnie ukazała się nowa wersja Silverlighta 2.0, czyli Beta 2! Nowszą wersję zapowiedział Bill Gates na konferencji Tech•Ed North America 2008 w ostatni wtorek (03.06.2008) i słowa dotrzymał.



Razem, z Silverlightem 2.0 Beat 2, ukazał się Expression Blend 2.5 June 2008 oraz Microsoft Silverlight Tools Beta 2 for Visual Studio 2008. Wszystkie w/w dostępne są na stronie http://silverlight.net/GetStarted/. Instalacja wciąż zajmuje tylko 4.6MB i trwa nie dłużej niż 10 sekund.

Jedną z największych nowości w Silverlight 2.0 Beta 2 jest Visual State Manager. Visual State Manager pozwala na bardzo łatwe tworzenie własnych skinsów dla kontrolek. Ci, którzy próbowali pisać własne w wersje Beta 1, na pewno pamiętają żmudne zmiany w stylach i nadpisywanie podstawowych stanów kontrolek. Teraz swój własny styl możemy definiować za pomocą nowego Blenda!

Wystarczy kilka ustawień w Blendzie i wywołanie Visual State Manager-a




VisualStateManager.GoToState(foo, "MouseOver", true);


Oprócz nowego Blenda oraz wspaniałego Visual State Managera-a, ujrzymy także:

  • Zmiany w UI Framework, czyli większe wsparcie dla animacji oraz obsługi błedów. Rozwiązał się także problem obsługi klawiatury.
  • Pojawiły się także nowe kontrolki. Wśród nich zobaczymy między innymi TabControl z panelami oraz zmiany w już istniejących. TextBox otrzymał scrollbary oraz text wrapping. DatagGrid poszerzył swoje funkcjonalności o Autosize, Reorder oraz Sort.
  • Mamy także zmiany w networkingu. Tej zmiany oczekiwałem od dawna, po kilku walkach stoczonych z WCF Services i Silverlightem jestem niezmiernie szcześliwy, że wprowadzono ułątwienia. A do tych ułatwień, należą miedzy innymi: wspardzie dla "cross domain policy" (pamiętacie pliczki xml-owe z uprawnieniami?), rozszerzenie 'działki' security, zmiany w WebClicent (w szczególności upload) oraz połączenia duplex, czyli z serwera do Silverlight-a.
  • Kolejna nowość to LINQ- to-JSON (coś dla pasjonatów drzewek i javayscripta), wielowątkowość oraz ADO.NET Data Services i SOAP.
  • No i na końcu wiadomość, która mnie najbardziej ucieszyła, to zmiany dla Deep Zoom Composera. W nowym Silverlightcie, możemy generować galerie prosto z bazy danych obrazków, łątwiej zarządzać obrazkami w galerii oraz zapisywać ustawienia fotek w nowym formacie xml. Więcej napisze na ten temat w ciągu najbliższych dni.

Warto także podkreślić, że wraz z nową wersją beta, Silverlighta można używać, także do celów komercyjnych!

Ostateczna wersja Silverlight 2.0 RTM (Released To Web) planowana jest na okres wakacji 2008.

Resources


Jednym z głównych założeń było, aby Silverlight był bliższy WPF-owi, no i najnowsza wersja założenie to spełnia. Choć ja mam nadzieje, że już niedługo to WPF będzie starał się być bliższy Silverlightowi, a nie na odwrót :)


Pozdrawiam,
Jacek Ciereszko

poniedziałek, 2 czerwca 2008

Javowe Igraszki z kodem

W ramach opanowania swoich wrażeń po konferencji Javarsovia 2008 i konkursowego testu, postanowiłem zamieścić kilka javowych zagadek. Zapewne programiści Javy poradzą sobie z nimi od razu, ale "kropki" mogą mieć już więcej problemów. ;)

Na początku będą zagadki, pod nimi znajdziecie odpowiedzi, a na końcu ankietę, w które wstawcie swój wynik (tylko bez oszukiwania i kompilacji kodu! :P ). W przykładach używałem javy 1.5.

No więc zapraszam do kombinowania :)

Zagadki

1. Co wypisze się na ekran?




Odpowiedzi:

  1. Zmienna "i" będzie równa 0,
  2. Zmienna "i" będzie równa 69,
  3. Kod się nie skompiluje,
  4. Wystąpi błąd podczas działania aplikacji (RuntimeException).


2. Co wypisze się na ekran?



Odpowiedzi:

  1. 4,
  2. 127,
  3. Kod się nie skompiluje,
  4. Wystąpi błąd podczas działania aplikacji (RuntimeException).

3. Co wypisze się na ekran?



Odpowiedzi:

  1. here1 here2,
  2. here1 here2 here3 here4,
  3. here1 here2 here4,
  4. here2 here3 here4,
  5. here2 here4,
  6. Kod się nie skompiluje,
  7. Wystąpi błąd podczas działania aplikacji (RuntimeException).


4. Co wypisze się na ekran?



Odpowiedzi:

  1. pre b1 b2 r3 r2 hawk,
  2. pre b1 b2 r3 r2 hawk,
  3. pre b2 b1 r2 r3 hawk r1 r4,
  4. r1 r4 pre b1 b2 r3 r2 hawk,
  5. r1 r4 pre b2 b1 r2 r3 hawk,
  6. pre r1 r4 b1 b2 r3 r2 hawk,
  7. pre r1 r4 b2 b1 r2 r3 hawk ,
  8. Kod się nie skompiluje,
  9. Nie można określić poprawnej kolejności.
5. Co wypisze się na ekran?



Odpowiedzi:

  1. Jacek,
  2. Jacek is,
  3. Jacek is …,
  4. Jacek is stupid,
  5. Jacek is great,
  6. Jacek is stupid and great,
  7. Jacek is
    … stupid and great,
  8. Jacek is and,
  9. Kod się nie skompiluje,
  10. Nie można określić poprawnej kolejności.


Pokaż odpowiedzi



Odpowiedzi


Schowaj odpowiedzi

1.

Prawidłowa odpowiedź to 3. Klasa dziedziczy stan z klasy powyżej, a w klasie wyżej zmienna "i" ma private. Kod się oczywiście nie kompiluje.

2.

Poprawna odpowiedź to numer 3. Kod się nie kompiluje, ponieważ domyślnym wynikiem z operacji arytmetycznych jest int, a więc otrzymujemy przypisanie "byte c = jakiś wynik typu int". Aby kod się kompilował, niezbędne jest rzutowanie na int -> byte c = (byte) a + b.

3.

Prawidłowa odpowiedź to 2. Java dla niskich wartość (char <0, 127>, Boolean oraz int/double <-127, 128>) trzyma obiekty na stałe. Związane jest to z oszczędnością pamięci, która doprowadza do tego, że takie absurdalne przykłady w kodzie mają miejsce ;) (w Javie 1.6 autoboxing został 'zmodyfikowany' i powyższy kod się nie skompiluje).

4.

Odpowiedź prawidłowa to 4. Statyczne bloki wykonują się w czasie ładowanie klas, bloki inicjalizacyjne po wywołaniu super() w konstruktorze. Przy więcej niż jednym bloku, liczy się kolejność w kodzie.

5.

Tym razem dobrze zrobili Ci, co zaznaczyli odpowiedź numer 6! Typ enumeryczny został rozbudowany do tego stopnia, że używając go w switch-ach nie musimy w każdym case podawać nazwy enum-a. Coś na zasadzie "With" w Visual Basic. (w Javie 1.6 enumy zostały 'ulepszone' i powyższy kod się nie skompiluje).



Ankieta, czyli pochwal się wynikiem


I jak Wam poszło? Ja się przyznam, że zamieszczone w/w przykłady, to takie na których ja się wyłożyłem, a więc moja odpowiedź w ankiecie to 5 :P

Resources

  • Większość przykładów pochodzi/wywodzi się z książki "Scjp Sun Certified Programmer For Java 5 Study Guide (Exam 310-055)" - Kathy Sierra i Bert Batesa.
  • Konkurs javowy na konferencji Javarsovia 2008.
  • Blog Mariusza Lipińskiego, javowego eksperta i pogromcy kodu.

Zapraszam do komentowania i umieszczania swoich wyników. Jeśli macie jeszcze jakieś ciekawe przykłady to podsyłajcie, a na pewno zamieszczę je w kolejnych postach dotyczących javy.


Pozdrawiam,
Jacek Ciereszko


niedziela, 1 czerwca 2008

„Could not load file or assembly App_Web” – problem rozwiązany. Part 3

Niedawno pisałem o problemie związanym z komunikacją pomiędzy aplikacją Silverlight, a WCF Service umieszczonym w aplikacji ASP.NET (link). Ponieważ nie dawało mi to spokoju oraz problem ten występował także w aplikacji konkursowej (patrz Win The Web), to postanowiłem znaleźć jego przyczynę.

Okazało się, że przyczyną całego zamieszania, było to, że serwis WCF jest hostowany razem z aplikacją ASP.NET w tej samej domenie. W efekcie, z jakiś powodów, w pewnym momencie WCF Service przestaje działać i nawet restart IISa nie pomaga.

Lokalnie (tak jak pisałem poprzednio) można czyścić katalog C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\, natomiast na serwerze IIS najszybciej jest wgrać ponownie katalog bin z nowo przekompilowanej wersji projektu.

Ale, że lepiej zapobiegać niż leczyć, to należy:

  1. W pliku konfiguracyjnym ASP.NET (web.config), w elemencie <System.serviceModel>, dodać wpis <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>.
  2. W WCF Service, a dokładniej w kodzie usługi dodajemy

    using System.ServiceModel.Activation;


    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

    public class KlasaService : IKlasaService

    { .. }

Zmiany te spowodują, że WCF Service będzie zachowywać się jak zwykły ASMX, czyli straci swoje specjalne właściwości, ale za to będzie współdziałał bezawaryjnie z aplikacją ASP.NET. Na temat powyższych ustawień (Allowed/Required) nie będę się rozpisywał w tym poście i zapraszam po więcej na stronę MSDNa (link).

Resources

  • Webcast Tim Heuer-a na temat połączeń Silverlighta z WCFem (link) – POLECAM!!! (szkoda, że nie ukazał się z tydzień wcześniej, zaoszczędziło by mi to bardzo dużo czasu ;) )
  • Wpis Kemal Tolga Koseoglu (link) - Polecam!
  • Dokładny opis całego problemu (link) - Polecam!
  • Obszerny artykuł na w/w temat tylko w połączeniu z ASMXem (link)
  • Dyskusja na forum Silverlight.net na w/w temat(link)


Pozdrawiam,
Jacek Ciereszko