sobota, 13 grudnia 2008

Isolated Storage Memory w Silverlight 2.0 RTW

W artykule tym postaram się możliwie krótko i zrozumiale opisać zagadnienie izolowanej przestrzeni pamięci dla aplikacji, czyli Isolated Storage.

Na co mi to?

Miejsce to, odnosi się do kawałka dysku na komputerze po stronie klienta, w którym aplikacja ma prawo przetrzymywać swoje pliki i informacje. Do użytku mamy z defaultu 1MB ale wielkość pamięci może być zmieniona przez usera (o tym za chwilę).

Taka ilość miejsca oraz wyjątkowa łatwość dostępu, daje nam duże możliwości. Wielokrotnie wykorzystywałem tą przestrzeń, jako miejsc do przechowywania informacji o ustawieniach użytkownika, jako lokalny high scores dla gry lub też informacje dla ankiety, o tym czy użytkownik już dziś głosował. Zastosowań jest naprawdę wiele i warto pamiętać o tym rozwiązaniu.

Zróbmy sobie przykład

Jako przykład aplikacji zróbmy prosty program, w którym podajemy swoje imię, a program będzie je pamiętał i wyświetlał przy każdym kolejnym uruchomieniu.

Zacznijmy od dodania kontrolek do wprowadzenia danych

<TextBox Height="32" x:Name="EnterName" Width="192" Text="Enter your name here" TextWrapping="Wrap"/> 

<Button Height="28" x:Name="SubmitButton" Width="106" Foreground="#FF313131" Content="Submit" Click="SubmitButton_Click">

oraz TextBlocka do wyświetlania zapamiętanego imienia

<TextBlock Height="91" x:Name="NameTextBlock" Width="284" TextWrapping="Wrap">

<Run x:Name="UserName" FontFamily="Comic Sans MS" FontSize="36" FontWeight="Bold" Text="" />

</TextBlock>

Następnie w kodzie wywołujemy metodę do odczytu imienia oraz zapisu. Aby odczytać coś z przestrzeni aplikacji, należy stworzyć obiekt IsolatedStorageFile

IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication();

który przyda nam się do sprawdzenia czy plik istnieje

if (!isf.FileExists("nasz_zapisany_plik.txt"))

oraz do utworzenia FileStream-era

IsolatedStorageFileStream isfs = new IsolatedStorageFileStream("nasz_zapisany_plik.txt", FileMode.Open, isf);

Teraz wystarczy podłączyć np. StreamReader i możemy robić odczyty jak na zwykłym pliku txt w aplikacji desktopowej.

StreamReader sr = new StreamReader(isfs);

userName = sr.ReadToEnd();

sr.Close();

Aby zapisać coś w Isolated Storage, otwieramy plik z innym FileMode, np.

IsolatedStorageFileStream isfs = new IsolatedStorageFileStream("nasz_zapisany_plik.txt", FileMode.Create, isf);

oraz zamiast StreamReadera, podłączamy StreamWriter

StreamWriter sw = new StreamWriter(isfs);

Cała reszta jest analogiczna do operacji na zwykłych plikach.

Kompletna metoda zapisu:

private void SaveUserName(string name)

{
IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication();

IsolatedStorageFileStream isfs = new IsolatedStorageFileStream(FILE_NAME, FileMode.Create, isf);

StreamWriter sw = new StreamWriter(isfs);
try

{

sw.WriteLine(String.Format("{0}", name));

}

catch (Exception ee) { }

finally

{

sw.Close();

isfs.Close();

isfs.Dispose();

isf.Dispose();

sw.Dispose();

}

}

Kompletna metoda odczytu:

private string ReadNameIfExist()

{

string userName = String.Empty;

IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication();

if (!isf.FileExists(FILE_NAME))

return userName;

IsolatedStorageFileStream isfs = new IsolatedStorageFileStream(FILE_NAME, FileMode.Open, isf);

try

{

StreamReader sr = new StreamReader(isfs);

userName = sr.ReadToEnd();

sr.Close();

}

catch (Exception e) { }

finally

{

isf.Dispose();

}

return userName;

}

W powyższym "przykładzie", nie umieszczałem całego kodu z przygotowanego dema, ponieważ zrobił się trochę za długi (szczególnie generowany xaml), dlatego też po całość zapraszam do części source code.

Gotowa aplikacja wygląda tak: link. (Nie zapomnijcie o odświeżaniu strony => F5).

Można łatwiej? [edit 29-08-2008]

Tak jak Kuba słusznie zauważył (Kuba Florczyk), w swoim artykule pominąłem kwestie klasy IsolatedStorageSettings. IsolatedStorageSettings jest to klasa która zapewnie łatwiejszą obsługę Isolated Storage. Nie musimy deklarować IsolatedStorageFile i IsolatedStorageFileStream, wszystko mamy opakowane w klasie, a wszelkie operacji przeprowadzamy jak na Dictionary, czy też ASP-owej sesji (klucz-wartość).

A więc podajemy klucz i przypisujemy wartość. Aby odczytać wartość, wystarczy podać klucz i otrzymujemy obiekt z zapisaną wcześniej wartością.

Przykład użycia

Deklaracja
private IsolatedStorageSettings isolatedSettings = IsolatedStorageSettings.ApplicationSettings;
Zapis danych
try
{
isolatedSettings.Add("imie", name);
}
catch (ArgumentException ex)
{
// message z bledem
}
Odczyt danych
string name = String.Empty;
try
{
name = (string)isolatedSettings["name"];
}
catch (System.Collections.Generic.KeyNotFoundException)
{
// blad i wartosc domyslna dla name
name = "anonymous";
}
Aktualizacja danych
isolatedSettings["name"] = "nowe imie";

Usuwanie danych
isolatedSettings.Remove("name");

Czyszczenie wszystkich ustawień
isolatedSettings.Clear();

Liczba ustawień
isolatedSettings.Count();

Lista dostępnych kluczy
isolatedSettings.Keys;

Lista dostępnych wartości
isolatedSettings.Values;

Jak widać, IsolatedStorageSettings zapewnia prace jak ze zwykłym słownikiem. Rozwiązanie to zaoszczędzi nam dużo czasu i uprości kod.

I na końcu, jeszcze raz dzięki Kubie za pomocny komentarz!!! :)

Jak zwiększyć wielkość dostępnej pamięci?

Otóż zwiększanie potrzebnej pamięci jest wyjątkowo proste ale musi zgodzić się na to użytkownik. W związku z tym, musimy go zapytać i jeśli się zgodzi, wtedy możemy zapisywać na jego dysk więcej danych. Limit pamięci do jakiej możemy zwiększyć jest ograniczony tylko przez wielkość typu ""long", a więc mniej więcej 8,589,934,592Gb :)

A więc wystarczy wywołać kod:

private void SubmitButton_Click(object sender, RoutedEventArgs e)
{
using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication())
{
Int64 sizeNeeded = 1024 * 1024 * 100;
if (sizeNeeded > isf.AvailableFreeSpace)
{
Int64 newValue = isf.Quota - isf.AvailableFreeSpace + sizeNeeded;
if (isf.IncreaseQuotaTo(newValue))
{
// np. zapis danych
}
}
}
}


Efekt:

User zobaczy ładne zapytanie i po jego akceptacji możemy zapisywać dane. Niestety, nie znalazłem możliwości modyfikacji treści zapytania, a więc informacja w okienku musi zostać taka jak jest. Dodatkowo, zapytanie może być wywołane tylko z eventów, a więc nie odpytamy użytkownika o zwiększenie ilości pamięci podczas inicjalizacji aplikacji. Możemy to zrobić dopiero gdy wciśnie jakiś przycisk w aplikacji (kwestie bezpieczeństwa).

uwaga bug:
Ponieważ zapytanie jest zawsze w języku angielskim, to w przypadku gdy użytkownik nie posiada systemu operacyjnego w tym języku, zapytanie o zwiększenie ilości danych nigdy się nie pojawi i zawsze będzie zwracać "false". Bug jest zgłoszony do MS i można poczytać o nim więcej tutaj: http://silverlight.net/forums/p/51485/135114.aspx

Gdzie to jest?

Aby znaleźć dokładne miejsce przetrzymywania informacji, najłatwiej jest użyć debugera.



Zmienna "m_AppFilePath" podpowie nam, że jest to gdzieś w przestrzeni naszego użytkownika oraz w przestrzeni assembly naszej aplikacji. Taka ścieżka nie jest łatwa do zapamiętania i może wyglądać np. tak:

"C:\\Users\\ToJaUser\\AppData\\LocalLow\\Microsoft\\Silverlight\\is\\3tumcpvn.hf1\\wrelfaen.uut\\1\\s\\rtqyd4tgtuurqnzlqaf3otinrvcefdf4aeqlkxhw0dltde2t2uaaaeaa\\f"

Jak to usunąć?

Aby zobaczyć ile miejsca zajmuje aplikacja i ewentualnie wyczyścić wgrane pliki, wystarczy że klikniemy prawym na aplikacji Silverlight i wybierzemy "Silverlight Configuration"



Następnie przejdziemy do zakładki "Application Storage".



W zakładce tej mamy komplet informacji o aplikacjach, łącznie z ilością miejsca jakie zajmują na naszych dyskach.

Source code

Working demo

Reources

  • MSDN System.IO.IsolatedStorage Namespace - link
  • Blog trzech panów: "Switch On The Code" linktrochę nieaktualne, ale to tu znalazłem kiedyś pierwsze wzmianki o Isolated Storage Memory


Pozdrawiam,

Jacek Ciereszko

piątek, 21 listopada 2008

Obrazek instalacyjny Silverlight 2.0

Czy obrazek instalacyjny Silverlight 2.0 (patrz poniżej) wydaje Ci się intuicyjny? Czy użytkownik który nie wie co to Silverlight na pewno kliknie go aby zainstalować plugin do swojej przeglądarki?



Odpowiedź prawie zawsze brzmi nie!

Najgorsze co możemy zrobić, to wystraszyć użytkownika na samym początku. Jego pierwsze wrażenie wpłynie na to, czy będzie on używał aplikacji czy zniechęci się do niej od samego początku, dlatego też warto dbać o jego pierwsze wrażenie.

Czy możemy coś z tym zrobić?

Tak! Możemy wstawić swój własny obrazek, który bardziej będzie przypominać aplikację, którą próbuje uruchomić użytkownik. Możemy sprawić żeby user nie czuł się zagubiony i wiedział co zobaczy jak zainstaluje plugin.

Podmieńmy więc "obrazek braku plugin-a" w Silverlight.

Dla plików html

<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%">
<param name="source" value="ClientBin/SilverlightApplication1.xap" />
<param name="onerror" value="onSilverlightError" />
<param name="background" value="white" />
<param name="minRuntimeVersion" value="2.0.31005.0" />
<param name="autoUpgrade" value="true" />
<a href="http://go.microsoft.com/fwlink/?LinkID=124807" style="text-decoration: none;">
<img src="ClientBin/InstallSL.png" alt="Get Microsoft Silverlight" style="border-style: none" />
</a>
</object>

Aby wstawić własny obrazek, wystarczy zmienić wartość "src" dla tagu <img i wskazać na własny. Możemy także zmienić cały kod html i zamiast linka z tagu <a wstawić tylko informację lub alternatywną wersję aplikacji która nie wymaga Silverlighta. W ten sposób będziemy mieli pełną kontrolę nad tym, co zobaczy użytkownik, zanim zainstaluje Silverlight-a.

Dla plików aspx

<asp:Silverlight ID="Xaml1" runat="server" Source="~/ClientBin/SilverlightApplication1.xap" MinimumVersion="2.0.31005.0" Width="100%" Height="100%">
<PluginNotInstalledTemplate>
<a href="http://go.microsoft.com/fwlink/?LinkID=124807" style="text-decoration: none;">
<img src="ClientBin/InstallSL.png" alt="Get Microsoft Silverlight" style="border-style: none" />
</a>
</PluginNotInstalledTemplate>
</asp:Silverlight>

Dla plików ASP dodajemy parametr "PluginNotInstalledTemplate", a w nim możemy wrzucić dowolny kod html, który wyświetli się gdy użytkownik nie będzie miał zainstalowanego Silverlighta. W tym przykładzie skopiowałem kod html z przykładu powyżej.

Jak w prosty sposób przetestować obrazek instalacyjny

Aby sprawdzić jak będzie wyglądać aplikacja dla użytkowników którzy nie posiadają zainstalowanego plug-ina do Silverlighta, możemy użyć możliwości jakie daje nam Internet Explorer. Wystarczy przejść do “Tools” -> “Manage Add-ons” -> “Enable or Disable Add-ons”.

Teraz znajdź plug-in Silverlight-a i wyłącz go. Aplikacja zrestartuje się automatycznie.

Przykładowe rozwiązanie

Jak przykładowe rozwiązanie chciałem pokazać preinstaller dla mojej gry pasjans.

Gra wygląda tak:


Gdy użytkownik nie ma zainstalowanego plugina do Silverlighta, gra wygląda tak:

Jeśli zmodyfikujemy preinstallery, to brak plugina może wyglądać, np. tak:


Pozdrawiam,

Jacek Ciereszko

środa, 19 listopada 2008

TechEd EMEA 2008 (Barcelona) – relacja, zdjęcia, Speaker Idol itd.

Hola! Buenos noches.. no więc konferencja dobiegła końca, wiele się nauczyłem i zobaczyłem, a teraz czas na refleksje. W tym artykule opisze w miarę jak najkrócej konferencję, sesje oraz Speaker Idola. Nie będę oceniać sesji ani prelegentów, a skupie się tylko na tym, co zobaczyłem.

Udział w konferencji zawdzięczam firmie Microsoft i konkursowi "Win The Web", który wygrałem wraz z dwoma kolegami, w maju na poziomie Polski i Europy oraz mojej firmie Hewlett-Packard dzięki udzielonemu wsparciu.

Konferencja i sesje

Aby wybrać sesję, spędziłem ponad 3h na czytaniu prawie wszystkich opisów i przeglądaniu terminów. Do wyboru było 335 sesji, w tym jedna sesja generalna, 247 sesji tematycznych, 80 sesji interaktywnych oraz 151 "Hands On Labs". Wybór był niesamowity i chyba każdy znalazł coś dla siebie. Ja głównie skupiłem się na sesjach architektonicznych oraz Web-owych z szczególnym nastawieniem na Silverlighta. Miałem także szansę uczestniczyć w kilku sesjach poświęconych ASP.NET oraz Windows Mobile. Wszystkie sesje były prowadzone na bardzo wysokim poziomie przez najlepszych specjalistów z całego świata.


Sesje były podzielone według następujących grup: Architecture, Business Intelligence, Database Platform, Developer Managers, Developer Tools and Languages, Development Practices Dynamics, Keynote, Microsoft IT, Office and SharePoint, PDC Highlights, Security, SOA and Business Processes, Unified Communications, Web and User Experience, Windows and Frameworks, Windows Embedded, Windows Mobile.

Spośród tak dużego wyboru i tylu kategorii, zawsze można było wybrać tematy najbardziej odpowiednie, nie zdarzyło się abym poszedł na prezentacje z braku wyboru.

Prezentacje których nie mogliśmy zobaczyć, są nagrane i umieszczone (prawie) na stronie TechEd EMEA 2008.

Planowane umieszczenie spisu wszystkich sesji oraz opisanie tych, na których byłem, muszę zaniechać, ponieważ ich mnogość wydłużyła by ten artykuł do stanu nie do przeczytania :] W ramach rekompensaty, zamieszczam link do spisu sesji na TechEd EMEA 2008.

Organizacja

Konferencja była zorganizowana na bardzo wysokim poziomie, było bardzo dużo osób które się nami opiekowały i dbały o nasze bezpieczeństwo. Dbały też o to, abyśmy głodni nie chodzili, choć tutaj należy wspomnieć o obiadkach które zwykle były podane jako torebki z jedzonkiem, a więc nic na ciepło. Rozwiązanie to ma swoje plusy i minusy, z jednej strony możemy się przemieszczać z jedzeniem po stoiskach i zjeść resztę obiadu później, a z drugiej strony nie jemy nic na ciepło.

W przerwach były podawane oczywiście zakąski, kawka, owoce itd., a wieczorem zdarzało się piwko.


Konferencja była podzielona na sale prezentacyjne, sale do "Hands On Labs" oraz exhibition hall, gdzie znajdowały się wszystkie stoiska firm, stoiska specjalistów z MS oraz scena Speaker Idol. Była także duża sala na największe prezentacje, gdzie odbywał się key note, na którym było ponad 3000 osób, sala ta była przeogromna!


Na większości powierzchni konferencji był także stały dostęp do Internetu poprzez WiFi oraz ustawione stanowiska komputerowe.



Do przyjemniejszych rzeczy należały stanowiska z XBOXami, gdzie non stop ktoś grał w gry. W budkach wystawiających się firm zbieraliśmy liczne upominki i braliśmy udział w konkursach. Nagrody była cenne i jako przykład podam, że kolega z którym przyjechałem, zgarną w jednym z takich konkursów nowiutkiego XBOXa!!! Ja dostałem mniej cenne nagrody (jak widać na zdjęciu) ale za to mam ich bardzo dużo.



W stoiskach "Ask the Expert" spotkałem także byłego prelegenta z C2C 2008 - Martina Kulova z którym miałem okazje zamienić dwa słowa i podziękować za C2C 2008.

Speaker Idol

Dla tych którzy jeszcze nie słyszeli o konkursie Speaker Idol, przypomnę że jest to bardziej zabawa niż rywalizacja, polegająca na wybraniu osoby która w najlepszy sposób poprowadzi prezentację. Nagrodą zwykle jest szansa na poprowadzenie całej 1.5h prezentacji na następnej edycji konferencji i tak też było na TechEd EMEA 2008.

Mój Speaker Idol odbył się właśnie w czasie konferencji Tech-Ed EMEA 2008 w Barcelonie, a napisałem mój, ponieważ przeszedłem wstępne eliminację (wybranie 30 najlepszych zgłoszeń) oraz "późne" eliminacje z których to dostałem się do finałowej grupy 9 osób, które miały swoje 5 minut przed publicznością oraz jury.


Nagrodami w tegorocznym Speaker Idol na TechEd EMEA 2008 była w/w szansa na poprowadzenie prezentacji w przyszłym roku na TechEd EMEA 2009 w Berlinie!!! Za drugie i trzecie miejsce uczestnicy otrzymali wstęp na TechEd EMEA 2009. Tu warto wspomnieć, że bilet na TechEd EMEA 2008 w Barcelonie kosztował prawie 2500 EURO, a więc nagrody były na prawdę cenne!!!

W jury zasiadły największe gwiazdy i osobistości. Należą do nich przede wszystkim Jose Luis Latorre Millas z INETA, Oliver Sturm, Kate Gregory oraz inni najlepsi prelegenci, którzy prowadzą prezentacje na co dzień.

Na TechEd konkurs trwał 4 dni, w pierwsze 3 trwały eliminacje i w 4 dzień były finały. Każdy z uczestników/uczestniczek miał/ła swoje max 5 minut na przeprowadzenie prezentacji. Dodam tylko, że według powszechnie panujących zasad, przede wszystkim oceniany był prelegent, a to co prezentował było drugorzędną sprawą.

Tak jak wspomniałem, ja także miałem swoje 5 minut, które w całości poświęciłem prezentacji o Silverlightcie :D Na przygotowania poświęciłem około tygodnia, podobnie na eliminacje wstępne, choć najtrudniejszy do przezwyciężenia był strach przed wyjściem w tak "zacnym" miejscu i przed tak dużą liczbą ludzi oraz jury.

Występowałem jako trzeci i konkurowałem z Guiseppe Maggiore z Włoch oraz Kurt Claeys, MVP z Belgii. Konkurs oczywiście przegrałem, jak jury słusznie powiedziało, zabrakło energii w wypowiedziach, trochę zbyt dużo łaziłem po mównicy i zbyt daleko od laptopa, przez co powroty przy zmianie slajdów wyglądały nieatrakcyjnie. Było jeszcze trochę uwag ale o dziwo nic poważnego, da się poprawić :P


To co mnie zdziwiło najbardziej po udziale w konkursie, to że wciąż się cieszę że wziąłem w nim udział. Spodziewałem się, że jak przegram to będę bardziej zawiedziony, w końcu włożyłem w przygotowania tyle pracy, a jednak było inaczej. Bardzo dużo się nauczyłem o prowadzeniu prezentacji, oglądałem innych uczestników oraz słuchałem to co mówi jury i zdobyta wiedza na pewno przyda mi się w przyszłości. Biorąc udział w konkursie, nie spodziewałem się, że uwagi jury będą aż tak szczegółowe, że będą oni zwracać uwagę np. na trzymanie ręki w kieszeni albo zerknięcie na slajdy (te uwagi akurat wyłapałem dzięki innym uczestnikom :P ).


Najważniejsze jest to, że znowu miałem okazję aby zwalczyć strach przed przemawianiem. Przed wystąpieniem, przez około 1.5 dnia miałem "stukotanie" serca. Poranek przed samym konkursem było najgorszy, ledwie pamiętam na jakich sesjach byłem, w ogóle nie mogłem się skupić na prezentacjach. Serce uspokoiło się dopiero jak znalazłem się na miejscu, stanąłem za mównicą i spojrzałem na ludzi. Wtedy tylko zostało "spięcie", które widać bardzo ładnie na nagraniu :]

Video z prezentacji (niesynchronizowane z powyższym filmem)


Pomimo przegranej, polecam udział w konkursie, jest to wspaniałe doświadczenie, duża szansa na nauczenie się profesjonalnego prowadzenia prezentacji oraz sprawdzenie samego siebie w roli prelegenta!

Na końcu chciałbym dodać, że dwie osoby z zeszłorocznych finałów TechEd EMEA 2007, pracują obecnie w Microsoft, a więc jest to nie tylko szansa na bycie prelegentem ale także na pokazanie się i wybicie w ścieżce kariery.

A więc uczcie się i dzielcie się wiedzą bo warto!

Barcelona

Oprócz samej konferencji, miałem także okazję zwiedzić Barcelone. Wszystkie wieczory spędzaliśmy spacerując i zajadając się lokalną kuchnią (tapas, Paella, owoce morza). W sobotę zjechaliśmy cała Barcelonę, zwiedzając ich wiecznie w budowie Sagrade Familie, pałacyk z fontannami, stadiony olimpijskie, "stare miasto" z mnóstwem małych uliczek, centrum i oczywiście plaże.


Podsumowanie

Fajnie było ale się skończyło. Mieliśmy trochę problemów z odbiorem mieszkania, no i zabrakło imprezy integracyjnej dla Polaków, tak jak miały inne kraje ale cała reszta, łącznie z pogodą, dopisała. Serdecznie polecam wyjazd na taką konferencję i udział w Speaker Idol, no i do zobaczenia za rok! Adios!

Resources

  • Strona konferencji - link
  • Galeria upominków które otrzymałem w czasie konferencji - link

poniedziałek, 3 listopada 2008

Jak w blogger.com dodać obiekt Silverlight?

No więc, dziś otrzymałem powyższe pytanko od jednego z czytelników. Ponieważ chciałem odpisać na nie jak najsumienniej, to wyszedł z tego co raz to dłuższy tekst, aż ewaluował do rozmiaru artykułu, w którym to opiszę krótko, jak można na dwa sposoby dodać aplikację Silverlight na stronie html bloga w blogger.com i nie tylko.

Otóż moje dwa najlepsze sposoby na umieszczenie aplikacji, to:

  1. Zagnieżdżenie aplikacji w iframe,
  2. Użycie Live Control

Zanim rozpocznę opisywanie metod, powiem tylko, że mowa o edycji kodu html na blogger.com do którego najłatwiej dostać się poprzez wybranie "Dostosuj" na stronie bloga, a następnie przez Układ -> Edytuj kod HTML. Na tej stronie zobaczymy pełny kod html używany do generowania strony bloga. Tu też będziemy wprowadzać zmiany.

IFrame

Iframe zna chyba każdy i jest to najłatwiejszy sposób na umieszczenie aplikacji Silverlight na stronie html. W ten oto sposób został zamieszczony powyższy nagłówek na blogu. Kod który za to odpowiada, to:

 ..kod html...
<body>
<div id='outer-wrapper'>

<iframe frameborder='0' scrolling='no'
src='http://silverlight.services.live.com/invoke/81369/Blog%20Header/iframe.html'
style='position:absolute; width:1024px; height:350px; left: 115px; z-index: 10; '/>

<div id='wrap2' style='position:absolute; width: 842px; z-index: 20; left: 100px; top: 260px; '>
… reszta kodu html

Zwróć uwagę na ustawiony "style" na "position:absolute". Nagłówek ma to do siebie, że się nie przemieszcza, a więc może być na samej górze na stałe. Parametr "z-index" ustawiam na 10 dla nagłówka, a dla pozostałej części tekstu ustawiam 20, dzięki czemu nagłówek jest przykryty contentem z bloga.

Live Control

Live Control jest drugą opcją wymienioną na stronie http://silverlight.live.com, możemy ją znaleźć zaraz po wgraniu aplikacji (Upload application) "Add this Application to a Web Page " -> "Method 2: Use a Live Control". To co należy zrobić, to dodać linki do dwóch plików javascript oraz atrybut do taga <html> :

<html xmlns:devlive=http://dev.live.com  ….inne parametry…>
…kod html…

<script src='https://controls.services.live.com/scripts/base/v0.3/live.js' type='text/javascript'/>
<script src='https://controls.services.live.com/scripts/base/v0.3/controls.js' type='text/javascript'/>

</head>
<body >
<div>
<devlive:slscontrol silverlightVersion='2.0' src='/81369/Blog Stopka/'/>
</div>
…kod html…

A więc dodałem atrybut do tagu html (xmlns:devlive=http://dev.live.com) oraz dwa pliki javascript (live.js i controls.js). Aby umieścić aplikację wystarczył wpis <devlive:slscontrol …/>. W wyżej wymieniony sposób mam umieszczoną stopkę na stronie bloga. Zaletą tego rozwiązania jest to, że aplikacja jest traktowana jak element strony, nie musi być na stałe umieszczona przez style, np. dzięki temu moja stopka na stronie jest zawsze na końcu artykułu.

Pozdrawiam
Jacek Ciereszko

sobota, 1 listopada 2008

„Dlaczego odradzam korzystania z serwerów blogów”

No więc znalazłem dziś na blogu "programista Tomasz" stwierdzenie "Dlaczego odradzam korzystania z serwerów blogów" oraz krótki opis wszystkich wad. Ponieważ od 9 miesięcy sam korzystam z blogger.com i bardzo sobie chwale to miejsce, dlatego też nie mogłem powstrzymać się od słowa komentarza.

Pan "Tomasz" napisał ogólnie bardzo negatywnie na temat darmowych serwisów dla blogerów i dlatego chciałem w kilku punktach opisać moje zdanie na temat opisanych wad. A więc Pan "Tomasz" pisze, że:

  1. "za duże obciążanie, blogi ładują się wolno." – Moim zdaniem Google stać na hosting i blogi tam zamieszone ,zawsze ładują się szybko, czego nie można powiedzieć o prywatnych hostingach.
  2. "Serwisy te są dosyć wolno rozwijane" – Odkąd jestem na bloggerze, wyszło dużo znaczących poprawek i dodatków, a dzięki dużej liczbie użytkowników, blogger jest prowadzony i rozwijany na bardzo wysokim poziomie.
  3. "nie dostaniesz tam wszystkich możliwości jakie możesz mieć na swoim własnym blogu. A jeżeli będziesz mógł je mieć to za opłatą." – W życiu nie musiałem za nic płacić i nie widziałem takiej opcji.
  4. "Blogi te mają różne ograniczenia, przez co nie możesz do końca zmieniać ich wyglądu, zachowania" – Na bloggerze ma się pełny dostęp do strony html i to nie tylko części <body> ale całej strony. Dzięki temu w prosty sposób zamieniłem nagłówki na aplikacje Silverlightowe, ustawiłem w wygodnym edytorze kolorki na style, rozmieściłem szerokości bocznych pasków i ustawiłem stopkę. Naprawdę, nie widzę rzeczy których nie mógłbym zmienić na stronie.
  5. "moderatorzy mogą wykasować Twój blog albo wpisy… gdy Twoje wpisy są kontrowersyjne" – No jak się wrzuca zdjęcia dla "Pedobear-a" to pewnie że wykasują. Ale możliwe jest także prowadzenie blogów dla osób +18, dochodzi tylko klauzula i tyle.
  6. "Nie zawsze jest też możliwość robienia kopii czy eksportów danych" – To chyba na pingerku tylko tak mają.. a i to pewnie da się wyeksportować dane. Dodatkowo masz opcję "FTP Publishing", dzięki której wrzucisz swoje posty na własny hosting.
  7. "No i jeszcze kwestia domeny - jeżeli będziesz chciał zmienić miejsce dla swojego bloga, cała reklama dotychczasowego zostanie stracona" – Własną domenę podpinasz bez żadnych problemów w kilka sekund. Dodatkowo blogger załatwia za Ciebie problem przekierowań ze stron www.* (np. www.mojBlog.pl na mojBlog.pl).
  8. "Jeżeli będziesz chciał zarabiać na blogu, albo przynajmniej zwrócić sobie koszty założenia, będziesz miał problemy" – Kosztów prowadzenia nie ma, a jak chcesz zarobić, to masz nawet "Google AdSense" jako kontrolkę na blog. Co do obcych reklam, to nie wiem ale widziałem że ludzie mają zamieszczone.

Są to trochę wyrwane z kontekstu fragmenty artykułu ale mam nadzieje że zachowują przesłanie opisanych wad.

A wracając do blogger.com, to dodatkowo masz w nim takie "bajerki" jak eksport artykułów z Worda, prosto na blog (to akurat większa zaleta Worda niż bloggera), fotki trzymane są na koncie Picassa, więc łatwo się nimi zarządza, można wrzucić filmik, który wyeksportuje się w odtwarzacz, w bardzo łatwy sposób dodałem także formatowanie kodu, tak aby zamieszczone dema wyglądały czytelnie. Dodatkowo dzięki istnieniu w dużej społeczności na jednej stronie, dostajesz darmowe pozycjonowanie poprzez linki prowadzące do Twojego bloga i innego tego typu funkcje na stronie.

A to moim zdaniem minusy swojego hostingu z blogiem:

  • Babranie się z ustawieniami.
  • Duże koszty hostowania serwera pod blog, no chyba że nikt nie odwiedza strony, wtedy można postawić gdzieś za free.
  • Brak automatyzacji ustawień, zarządzania postami, itd.
  • Ze wszystkim jesteś zdany sam na siebie i zamiast mieć przyjemność z dzielenia się wiedzą, tracisz czas na zarządzanie samym blogiem.

To tyle, mam nadzieje że nie wyszło niegrzecznie ale aż mnie tknęło jak przeczytałem takie.. "nieprawdy". Polecam blogger.com jako bardzo dobre miejsce na blogowanie, wszystko jest za darmo, działa szybko i w prosty sposób możemy dowolnie go dostosować do własnych potrzeb.

Resources

I pytanko na koniec do tych co używają "spaces.live.com", czy wyżej wymienione wady także nie tyczą się tego serwisu? Nidy jakoś nie miałem okazji wypróbować możliwości jakie daje blogowanie na spaces.

Pozdrawiam,

JAcek Ciereszko

piątek, 24 października 2008

Komunikacja pomiędzy Silverlight-em 2.0, a kodem javascript

W poprzednim artykule poświeconym połączeniom pomiędzy Silverlight-em, a kodem HTML (link), pokazałem jak w prosty sposób wskazać elementy strony html z poziomu aplikacji Silverlight i je użyć. Dowiedzieliśmy się także, w jaki sposób podpiąć Silverlight-a pod zdarzenia z kodu html. Całość zaowocowała nam "grą" w Ping Ponga :)

W tym artykule, chciałem krótko pokazać w jaki sposób możemy wywołać metody aplikacji Silverlight-a z kodu javascript i na odwrót, czyli metody javascript z kodu aplikacji Silverlight. Funkcjonalność ta okazuje się bardzo przydatna, szczególnie przy pracy z Virtual Earthem, Google Maps, obiektami JSONowymi i innymi aplikacjami/skryptami stworzonymi w javascript-cie.

Agenda

  1. Odwołanie do metody w javascript-cie z Silverlight-a
  2. Odwołanie do kodu aplikacji Silverlight, z javascript-u
  3. Obsługa event-ów wywołanych w Silverlight-cie, w kodzie javascript
  4. Przykładowy działający kod

Odwołanie do metody w javascript-cie z Silverlight-a

W pliku cs (np. Page.cs) dodajemy import Browser-a:

using System.Windows.Browser;

a w pliku javascript (np. Test.js), utworzonym przez nas w projekcie, dodajemy metodę

function testMethod(nothing) {
window.alert("[javascript] hello from javascript!");
}

i wywołujemy ją z kodu Silverlight-a (Page.cs):

Object[] args = null;
Object result = HtmlPage.Window.Invoke("testMethod", args);

, parametr args jest opcjonalny, tak samo jak wartość zwracana - result.

Plik Test.js musi być podłączony do strony html/aspx, która zawiera aplikacje Silverlight

<script type="text/javascript" src="Test.js"></script>

Alternatywnie, metoda testMethod może znajdować się bezpośrednio w pliku html/aspx, za pośrednictwem znaczników

<script type="text/javascript"> ... </script>

Odwołanie do kodu aplikacji Silverlight, z javascript-u

W celu odwołania się do Silverlight-a, musimy oznaczyć nasze zmienne, klasy, properties-y i eventy specjalnymi znacznikami ([ScriptableType], [ScriptableMember]). Dlatego też, klasa do której będziemy mogli się odwołać z javascript-u, będzie miała ten atrybut

[ScriptableType]
public class ScriptableClass
{
}

, natomiast jej zmienne i metody muszą mieć znaczniki ScriptableMember, np.:

[ScriptableType]
public class ScriptableClass
{
[ScriptableMember]
public string ScriptableMethod(string value){…}

[ScriptableMember]
public string val
{
get { return _val; }
set { _val = value; }
}
}

Następnie klasa musi zostać zarejestrowana na stronie html, poprzez wywołanie (np. w pliku Page.cs):

ScriptableClass scriptableClass;
scriptableClass = new ScriptableClass();
HtmlPage.RegisterScriptableObject("ScriptableClass", scriptableClass);

Na końcu, aby odwołać się do obiektu scriptableClass i jego metod/zmiennych w kodzie javascript, piszemy (w pliku Test.js):

var control = document.getElementById("Xaml1");
result = control.Content.ScriptableClass.scriptableMethod("Hello from javascript");

, a więc odnajdujemy kontrolkę Silverlight-a po jej id na stronie html/aspx (tu ta wartość może się u Was różnić jeśli modyfikowaliście kod html/aspx, w moim wypadku jest to "Xaml1") i wskazujcie zarejestrowany obiekt (ScriptableClass) i wywołujecie na nim metody (np. scriptableMethod(..)).

<div style="height: 100%;">
<asp:Silverlight ID="Xaml1" runat="server" Source="~/ClientBin/SilverlightApplication1.xap"
MinimumVersion="2.0.31005.0" Width="100%" Height="100%" />
</div>

Mamy już wszystko co trzeba. Po wywołaniu metody scriptableMethod() z klasy ScriptableClass w kodzie javascript, wykona się metoda w kodzie Silverlight-a.

Obsługa event-ów wywołanych w Silverlight-cie w kodzie javascript

Aby event mógł być obsłużony, należy utworzyć EventHandler (np. public event EventHandler SilverHandler) w aplikacji (ScriptableClass.cs)

[ScriptableType]
public class ScriptableClass
{
[ScriptableMember]
public event EventHandler SilverEvent;

public virtual void OnEvent(ScriptableEventArgs e)
{
if (null != SilverEvent)
{
SilverEvent(this, e);
}
e.val.ToString(); //value from javascript
}
}

Dodaliśmy także metodę OnEvent do ScriptableClass, która wywoła event SilverEvent. Teraz potrzebujemy metody która wywoła OnEvent (Page.cs):

ScriptableClass scriptableClass;

private void Button_Click_1(object sender, RoutedEventArgs e)
{
ScriptableEventArgs sea = new ScriptableEventArgs();
sea.val = "Event Args from Silverlight";

scriptableClass.OnEvent(sea);
}

Jak widać, pojawiła się dodatkowo klasa ScriptableEventArgs. Klasa ta, to nadpisana własna klasa EventArgs-ów. Musimy ją nadpisać, ponieważ potrzebujemy EventArgs-ów które są także typu [ScriptableType] ( ScriptableEventArgs.cs.)

[ScriptableType]
public class ScriptableEventArgs : EventArgs
{
private string _val;

[ScriptableMember]
public string val
{
get { return _val; }
set { _val = value; }
}
}

A więc mamy event (SilverEvent), mamy klasę argumentów (ScriptableEventArgs) oraz metodę która wywoła event. To co potrzebujemy, to obsługi eventa po stronie javascript (Test.js)

function loadedd(cos) {
var control = document.getElementById("Xaml1");
control.Content.ScriptableClass.SilverEvent = eventfunction;
}

function eventfunction(sender, args) {
value = args.val;
window.alert("[javascript] " + value);
args.val = "javascript values"; //return string
}

I tak, metoda eventfunction zostanie wywołana w momencie wciśnięcia przycisku w aplikacji Silverlight (Button_Click_1), ponieważ została przypisana do eventa SilverEvent. Przypisanie robimy podobnie jak dla wywołania metod z obiektu ScriptableClass, tylko tym razem przypisujemy metodę pod event.

control.Content.ScriptableClass.SilverEvent = eventfunction;

Ponieważ przypisanie może zostać wykonane dopiero po inicjalizacji aplikacji Silverlight, dlatego też w/w przypisanie eventa zostało zamknięte w metodę, którą ja wywołuje dopiero z metody Page_Loaded

public Page()
{
InitializeComponent();

this.Loaded += new RoutedEventHandler(Page_Loaded);
}

void Page_Loaded(object sender, RoutedEventArgs e)
{
HtmlPage.Window.Invoke("loadedd");
}

W ten sposób mam pewność, że event SilverEvent zostanie prawidłowo przypisany.

Przykładowy działający kod

Dla celów tego artykułu, stworzyłem demo aplikacji, która zapewnia prostą komunikację pomiędzy Silverlightem i javascriptem. W aplikacji mamy trzy przyciski:

  • "Call javascript" – wywoła metodę w kodzie javascript (Test.js) z aplikacji Silverlight
  • "Call Silverlight" – wywoła metodę javascritp, która wywoła metodę w aplikacji Silverlight
  • "Call javascript event" – zostanie wywołany event (SilverEvent) w obiekcie ScriptableClass. Event zostanie przekazany i obsłużony w kodzie javascript. Kod javascript zwróci rezultaty poprzez użycie wartości w klasie ScriptableEventArgs

Plik Page.xaml:

<UserControl x:Class="SilverlightApplication1.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="300">
<Canvas x:Name="LayoutRoot" Background="White">
<Button Content="Call javascript" Click="Button_Click" Canvas.Left="100" Canvas.Top="50" />
<Button Content="Call javascript event" Click="Button_Click_1" Canvas.Left="100" Canvas.Top="100" />
</Canvas>
</UserControl>

Plik SilverlightApplicationTestPage.aspx

<%@ Page Language="C#" AutoEventWireup="true" %><%@ Register
Assembly="System.Web.Silverlight" Namespace="System.Web.UI.SilverlightControls"
TagPrefix="asp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" style="height: 100%;">
<head runat="server">
<title>SilverlightApplication1</title>

<script type="text/javascript" src="Test.js"></script>

</head>
<body style="height: 100%; margin: 0;">
<form name="CallButtons" action="" method="GET">

<input type="button" name="button" value="Call Silverlight" onclick="testScriptableClassMethod()">

</form>
<br />
<form id="form1" runat="server" style="height: 100%;">
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<div style="height: 100%;">

<asp:Silverlight ID="Xaml1" runat="server" Source="~/ClientBin/SilverlightApplication1.xap"
MinimumVersion="2.0.31005.0" Width="100%" Height="100%" />

</div>
</form>
</body>
</html>

Plik Page.cs

public partial class Page : UserControl
{
ScriptableClass scriptableClass;
public Page()
{
InitializeComponent();
scriptableClass = new ScriptableClass("Hello from Silverlight");
HtmlPage.RegisterScriptableObject("ScriptableClass", scriptableClass);

this.Loaded += new RoutedEventHandler(Page_Loaded);
}

void Page_Loaded(object sender, RoutedEventArgs e)
{
HtmlPage.Window.Invoke("loadedd");
}

private void Button_Click(object sender, RoutedEventArgs e)
{
Object[] args = null;
Object result = HtmlPage.Window.Invoke("testMethod", args);
}

private void Button_Click_1(object sender, RoutedEventArgs e)
{
ScriptableEventArgs sea = new ScriptableEventArgs();
sea.val = "Event Args from Silverlight";
scriptableClass.OnEvent(sea);
}
}

Plik ScriptableClass.cs

[ScriptableType]
public class ScriptableClass
{
private string value;

[ScriptableMember]
public event EventHandler SilverEvent;

public ScriptableClass(string val)
{
value = val;
}

[ScriptableMember]
public string scriptableMethod(string val)
{
string temp = value;
value = val;
return temp;
}

public virtual void OnEvent(ScriptableEventArgs e)
{
if (null != SilverEvent)
{
SilverEvent(this, e);
}
e.val.ToString(); //value from javascript
}
}

Plik ScriptableEventArgs.cs

[ScriptableType]
public class ScriptableEventArgs : EventArgs
{
private string _val;

[ScriptableMember]
public string val
{
get { return _val; }
set { _val = value; }
}
}

Plik Test.js

function testMethod(nothing) {
window.alert("[javascript] hello from javascript!");
}


function testScriptableClassMethod() {
var control = document.getElementById("Xaml1");
result = control.Content.ScriptableClass.scriptableMethod("Hello from javascript");

window.alert("[javascript] " + result);
}

function eventfunction(sender, args) {
value = args.val;
window.alert("[javascript] " + value);
args.val = "javascript values";
}

function loadedd(cos) {
var control = document.getElementById("Xaml1");

control.Content.ScriptableClass.SilverEvent = eventfunction;
}

Pełny kod dema znajdziecie tu -> link

Resources


Pozdrawiam,
JAcek Ciereszko

wtorek, 14 października 2008

Silverlight 2 released!!!

No i stało się, pojawił się długo oczekiwany Silverlight 2.0 w wersji RTW!!! Ma być dostępny do ściągnięcie już dziś pod adresem http://silverlight.net/GetStarted, (w chwili pisania tego postu jest dopiero kilka minut po północy ;P ).

Nowy Silverlight 2.0 RTW, w stosunku do wersji Beta 2 ma wprowadzić kilka nowych poprawek na błędy, kilka kontrolek + skiny i tyle, nie spodziewałbym się zbyt wielu zmian (więcej informacji znajdziecie w porównaniu wersji Beta 2 z wersją 2.0 RTW - link). Natomiast to co może szokować, to informację o tym, że wraz z wydaniem Silverlight 2.0, pojawi się plug-in do Eclipse-a, który obsłuży tworzenie aplikacji przy użyciu tego IDE - http:/www.eclipse4sl.org/ :)

Jak to zadziała, tak jak widać na screenach na oficjalnej stronie projektu (link), to przesiadam się na Eclipse-a, na stałe! :D

I jako ostatnie, warto dodać, że Microsoft zapowiedział wypuszczenie także zbioru darmowych templatek (Silverlight Control Pack) oraz specyfikacji dla Silverlight's Extensible Application Markup Language (XAML). Wszystko w ramach darmowej licencji Microsoft Permissive License i zgodnie z obietnicą o otwartych "źródłach" (Microsoft's Open Specification Promise). W ten oto sposób, użytkownicy darmowego Visual Web Developer 2008 Express Edition będą mogli także tworzyć aplikację w Silverlight-cie 2.0!!!

Resources

  • Blog Jesse Liberty-iego (link)
  • www.blogs.zdnet.com (link)


Lecę spać, może rano już będą źródła :)

Pozdro,

JAcek C.

sobota, 11 października 2008

Podsumowanie Bloggers Underground i zdjęcia

7 października odbyła się wspaniała impreza, o której pisałem poprzednio (link), a mianowicie Bloggers Underground. O godzinie 19:00 w klubie Leżaki na warszawskiej starówce, zebrali się najlepsi blogerzy z Polski - wyjadacze wieczornego kodowania i dzielenia się zebraną wiedzą. Na imprezie tej, miałem okazję być także ja, choć wiedzą i doświadczeniem nie dorównuje żadnemu z nich :)

Cel spotkania

Celem tego zacnego spotkania były poprostu plotki oraz możliwość zobaczenie i poznania ludzi, których artykuły czyta się na co dzień. W trakcie spotkania każdy z uczestników miał możliwość przedstawienia się oraz zaprezentowania ciekawej opowieści związanej z blogowaniem.

Plan Spotkania

Na początku było zapoznanie, które bardziej przypominało spotkanie AA ("cześć, jestem Jacek, piszę od 10 miesięcy i nie mogę przestać) ale ta część okazała się bardzo wesoła i bardzo rozruszała towarzystwo (szczególnie 13-nastki). Każdemu można było się przyjrzeć dokładnie i skojarzyć z blogiem który prowadzi :)

Następnie rozpoczęły się krótkie prezentacje, podczas to których słuchaliśmy ciekawych przemówień, popijając pyszne piwko i zagryzając smacznym jedzonkiem. Prezentację miały trwać mniej więcej po 10 minut i zawsze pociągały za sobą dyskusję. Ponieważ impreza trwała tylko jeden wieczór, nie każdy mógł coś prezentować, dlatego też organizatorzy wybrali (prawdopodobnie po kolejności zgłoszeń), kilka osób które mogły coś powiedzieć, a byli to:

  • Nataniel Zieliński
    Czy nazwa kompa w lesie może się duplikować?
  • Arkadiusz Waśniewski
    Coś o mobilnych, o komunikacjach z urządzeniami, o wykorzystaniu IIS do stworzenia własnego serwera komunikacji...
  • Tomasz Wiśniewski
    Jak jeden temat na blogu potrafi generować 90% odwiedzi na stronie.
  • Mariusz Kędziora
    O statystykach odwiedzin blogów Microsoft i o tym co można robić żeby próbować podnosić odwiedziny bloga.
  • Łukasz Sowa
    Startup bloga, czyli tworzenie swojej internetowej osobowości.
  • Paweł Potasiński
    Na jakie braki i niedoróbki w SQL Server najczęściej narzekamy w SoftLabie.
  • Jacek Ciereszko
    Blog czy blogów dwa. Wady i zalety pisania bloga w dwóch językach.
  • Justyna Spychała
    Pozycja na pomidorka czyli jak pseudotechnicznym blogiem wzbudzić wzruszenie w czytelnikach.
  • Marcin Borecki
    Czy niewolnictwo na pewno zniesiono? - pierwsza praca informatyka
  • Joanna Kozłowska
    Blogi w zastosowaniach edukacyjnych.

Tak!, ja także miałem okazję zabrania głosu, co przy moim stresie do przemówień, wymagało trochę alkoholu, choć i tak się bałem :P

Po wszystkich przemówieniach oraz długich plotkach, uczestnicy spotkania stopniowo rozeszli się do domów, aby rano wstać na MTS.

Uczestnicy

Uczestnicy którzy zgłosili się i którzy są wypisani na oficjalnej stronie imprezy to:

  1. Rafał Antas
  2. Agnieszka i Marcin Krupińscy
  3. Kuba Skalbania
  4. Joanna Kozłowska
  5. Jacek Barcikowski
  6. Tomasz Bryja
  7. Wojciech Kowasz
  8. Krzysztof Pietrzak
  9. Sebastian Wilczewski
  10. Wiktor Gworek
  11. Piotr Pawlik
  12. Jacek Laskowski
  13. Łukasz Sowa
  14. Jacek Ciereszko
  15. Daniel Dąbrowski
  16. Jacek Segit
  17. Jakub Gutkowski
  18. Ziemek Borowski
  19. Tomek Onyszko
  20. Radek Kępa
  21. Paweł Potasiński
  22. Marek Krupa
  23. Marcin Borecki
  24. Marcin Goł
  25. Bartłomiej Legiędź
  26. Michał Grzegorzewski
  27. Mariusz Kędziora
  28. Justyna Spychała
  29. Maciej Aniserowicz
  30. Paula Januszkiewicz
  31. Arkadiusz Waśniewski
  32. Grzegorz Tworek
  33. Nataniel Zieliński
  34. Jarosław Karaś
  35. Jacek Doktór
  36. Tomasz Wiśniewski
  37. Konrad Sagała

Wliczając Państwo Krupińskich, daje nam to 38 osób, ale Ci co byli, wiedza, że odwiedzili nas także gości z MS i nie tylko, a więc uczestników było jeszcze więcej!

Fotki








Sponsor

Sponsorem, jak się okazało była firma na M, i to nie McDonald's, także nie MediaMarkt, a było nim MS, czyli Microsfot (uwaga nie napisałem M$, poprawiam się!!!).



Podziękowania

No i na końcu specjalne podziękowania dla organizatorów imprezy, czyli Karol Stilger, Łukasz Foks i Aneta Sidorowicz.

Do zobaczenia na następnym Bloggers Underground!!!

Pozdro,

JAcek Ciereszko

wtorek, 23 września 2008

Już 7 października o godzinie 19.00 w jednym z lokali na warszawskiej starówce odbędzie się pierwsze wydarzenie pod nazwą „Bloggers Underground” – spotkanie społeczności blogerów piszących o technologiach Microsoft.

Formuła spotkania jest bardzo prosta – kilka wystąpień po 10 minut, podczas których można opowiedzieć o ciekawym wydarzeniu związanym z prowadzeniem bloga lub opisać ciekawe „case study”. To doskonała możliwość spędzenia wieczoru przed konferencją Microsoft Technology Summit 2008 w luźnej atmosferze wraz z innymi specjalistami IT i programistami. Zgłoszenia, pomysły oraz sugestie prosimy przekazywać drogą mailową.

Ilość miejsc jest limitowana i tylko zaproszeni goście mają wstęp na spotkanie, dlatego warto się śpieszyć z decyzją.

Zapraszam na oficjalnego bloga imprezy, na którym znajdziecie najświeższe informacje.

Do zobaczenia 7 października!

Resources:

piątek, 29 sierpnia 2008

Formatowanie kodu w blogger

Ci którzy prowadzili blog na http://www.blogger.com (http://www.blogspot.com/)na pewno zetknęli się z problemem formatowania kodu. Otóż blogger nie daje żadnego wsparcie dla tego typu formatowania i jedynym sensownym rozwiązaniem są znaczniki <pre>. Oczywiście można napisać artykuł w Wordzie (2007), wkleić kod prosto z Visual Studio/Eclipse i poprzez opcję publikuj -> blog, umieścić cały artykuł wraz z ładnie sformatowanym kodem bezpośrednio na blog, jednak rozwiązanie to nie pozostaje bez wad. Opublikowany kod rozjeżdża się, tworzą się ekstra linie pomiędzy wierszami, a sama czcionka wygląda inaczej. To co zyskujemy tą metodą, to tylko kolorowanie składni.

Taką też metodą radziłem sobie od ponad 9 miesięcy, pisanie artykułu w Wordzie, opcja publikuj -> blog i później ładowanie grafiki i ręczne poprawianie formatowania kodu. Dużo roboty, a efekt i tak mógłby być lepszy.

Google-Code-Prettify (Pretty Printing Styles)

No ale na szczęście pojawił się projekt Google Code Prettify (http://code.google.com/p/google-code-prettify/). Projekt ten dostarcza nam dwa pliki:

  • prettify.css – spis kolorów do styli
  • prettify.js – plik z kodem javascript, który zapewnia nam odpowiednie kolory oraz ładną ramkę w około kodu

Aby podłączyć Google-Code-Prettify, należy w ustawieniach bloggera, w kodzie html, podłączyć w/w pliki. Normalnie kod podłączenia wygląda tak:

<head>
<link href="prettify.css" type="text/css" rel="stylesheet" />
<script type="text/javascript" src="prettify.js"></script>
</head>
<body onload="prettyPrint()">
<!-- content -->

Aby użyć go w bloggerze, należy przejść do ustawień bloga -> Układ -> "Edytuj kod html" oraz odnaleźć wpis <body> i zastąpić go kodem:

<script src='http://<adres>/prettify.js' type='text/javascript'/>
<link href='http://<adres>/prettify.css' rel='stylesheet' type='text/css'/>
</head>
<body onload='prettyPrint()'>

Uwaga adres (<adres>) do plików należy zastąpić swoim własnym lub (niepolecane) skorzystać z czyjegoś, o ile ktoś pozwoli. Taki czyjś można łatwo znaleźć w Google, wpisując nazwę plików. Opcjonalnie można skorzystać z plików w projekcie, choć wydaje mi się że najlepiej hostować je samemu.

http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.js
http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.css

Teraz można już używać formatowania. Formatowanie kodu można włączyć na 2 sposoby. Umieszczając kod w znacznikach <pre class="prettyprint">...</pre> oraz w znacznikach <code class="prettyprint">...</code>.

Języki wspierane przez projekt to:

  • odmiany C
  • Java
  • Python
  • Bash
  • SQL
  • HTML
  • XML
  • CSS
  • Javascript
  • Makefiles
  • Ruby
  • PHP
  • Awk
  • Perl

Program sam rozpoznaje w jakim języku napisany jest kod i dopasowuje odpowiednie formatowanie.

Przykłady

Kod formatowany ręcznie

public void OnHtmlButtonClick(object sender, HtmlEventArgs args)
{

HtmlElementCollection htmlElements = _htmlDocument.GetElementsByTagName("p");

foreach (HtmlElement h1Element in htmlElements)

{

h1Element.SetStyleAttribute("color", "#FFFF00");

}

}

Kod formatowanych przy użyciu Google Code Prettify

public void OnHtmlButtonClick(object sender, HtmlEventArgs args)
{
HtmlElementCollection htmlElements = _htmlDocument.GetElementsByTagName("p");
foreach (HtmlElement h1Element in htmlElements)
{
h1Element.SetStyleAttribute("color", "#FFFF00");
}
}

Istnieje także opcja ręcznego wybrania języka w którym ma być wyświetlany kod ("prettyprint lang-*") oraz dodania numeracji linii (<span class="nocode">).

<pre class="prettyprint lang-html">
<span class="nocode">1:</span> <body>
<span class="nocode">2:</span> Kod html
<span class="nocode">3:</span> </body>
</pre>

 1: <body>
2: Kod html
3: </body>

Więcej przykładów można znaleźć na stronie projektu link.

Resources

  • Człowiek od którego dowiedziałem się o istnieniu google-code-prettify - Łukasz Gorgol link
  • Strona główna projektu link
  • Opis użycia, przykłady, FAQu itd. link


Pozdrawiam,

Jacek Ciereszko

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