Przetestuj swoją stronę …

problem testowania aplikacji internetowych znany jest każdemu, kto choć raz taką pisał :)

Głównym problemem jest fakt, iż każda przeglądarka na swój sposób interpretuje strony. Dlatego każdy (lub prawie każdy) instaluje na swoim komputerze wszystkie możliwe przeglądarki, aby móc przetestować poprawność działania swojej aplikacji. Jednak nadal mamy problem z przeglądarkami IE, których poszczególne wersje ciężko zainstalować na jednym komputerze.

Z pomocą przychodzi Xenocode Browser Sandbox. Xenocode dostarcza nam wirtualne środowisko umożliwiające uruchamianie różnych aplikacji. Aktualnie udostępnione są “obrazy”: Microsoft Internet Explorer 8, 7, 6, Mozilla Firefox, Apple Safari,  Opera oraz Google Chrome – czyli wszystkie najpopularniejsze przeglądarki dostępne pod windows.

Xenocode Browser Sandbox

Wykorzystanie jest niezwykle proste – pobieramy plik exe i go odpalamy :) Nic się nie istaluje, nie miesza w systemie i mamy w pełni funkcjonalą przeglądarkę :)

ReSharper 4.5 Nightly Build

UPDATE: ReSharper 4.5 Beta

Dzisiaj rano postanowiłem potestować nowego ReSharpera 4.5 – aktualnie dostępnego tylko jako Nightly Build. Zainstalowałem więc wersję 4.5.1180.25 z 17 lutego 2009 jako najnowszą na dzisiaj.

Instalacja przebiegła bez problemu i o połowę krócej niż miało to miejsce w przypadku wesji 4.1 :)

ReSharper 4.5

Zgodnie z zapowiedziami nowa wersja ma dostarczyć m. in.:

  • ulepszone analizy kodu (Solution-Wide Analysis)
  • lepsze wsparcie dla VB.NET
  • wsparcie dla MSTest
  • nowe metody refaktoryzacji
  • nowa wersja ma być szybsza :)

A oto moje spostrzeżenia:

  • pierwsze co rzuca się w oczy to pamięć. W jednym z projektów R# w wersji 4.1 pobiera ok. 230-300MB. Nowa wersja w tym samym projekcie potrzebuje ok. 120-170MB, czyli różnica jest spora.
  • działa zdecydowanie szybciej – ogólnie jeśli chodzi o pracę z VS, uruchamianie VS  jaki i funkcje R#, np.  “Find Usages”. Różnica jest naprawdę widoczna.
  • intellisense dla Global Resources. W wersji 4.1 wpis:

[sourcecode language=”xhtml”]

<%$ Resources:MyGlobalResource, MyGlobalKey%>

[/sourcecode]

otrzymywał czerwony szlaczek  i komunikat: MyGlobalResource nie został znaleziony :( Teraz zarówno lista GlobalResources, jak i lista dostępnych kluczy dostępna jest w intellisense :)

resharper_2

  • wsparcie dla MSTest
  • informajce o aktualizacjach dla ReSharpera oraz wtyczek

Niestety póki co nie znalazłem nowych metod refaktoryzacji i nowych analiz kodu – jeszcze nie znalazłem lub dostarczone będą później.

Wersja finalna planowana jest na pierwszy kwartał 2009. Jest więc szansa, że ukaże się już niedługo. Bezpłatnej aktualizacji będzie mógł dokonać każdy, kto posiada licencję na wersję 4.0 lub 4.1.

I na koniec mała uwaga: nie polecam zaznaczania opcji  “Analyze errors in whole solution”. U mnie zakończyło się to padem R# :)

Gravatar i ASP.NET

Korzystając z różnych portali w sieci staramy się być jednoznacznie identyfikowani – stosując ten sam nick, czy dodając awatara. Jednak posiadanie kont na wielu portalach znacznie utrudnia zarządzanie nimi (np. gdy postanowimy nasze zdjęcie uaktualnić lub usunąć).

Z pomocą przychodzi Gravatar (globally recognized avatar). Jest to taka globalna przechowalnia awatarów. System ten kojarzy awatary z adresami e-mail. Tak więc zakładając konto na jakimś portalu i podając naszego maila, portal ten może pobrać naszego gravatara. Jeżeli postanowimy uaktualnić zdjęcie – robimy to tylko w jednym miejscu.

Dodanie gravatara do naszej strony jest niezwykle proste i polega na stworzeniu odpowiedniego urla , który podajemy jako źródło dla obrazka.

Każdy url zaczyna się od adresu
> http://www.gravatar.com/avatar/

Następnie dodajemy adres e-mail shashowany algorytmem MD5
> http://www.gravatar.com/avatar/3b3be63a4c2a439b013787725dfce802

Dodatkowo możemy podać kilka opcjonalnych parametrów:

s – rozmiar awatara w pikselach
> http://www.gravatar.com/avatar/3b3be63a4c2a439b013787725dfce802?s=80

r – “kategorię” awatara – pozwala na filtrowanie zawartości awatara
> http://www.gravatar.com/avatar/3b3be63a4c2a439b013787725dfce802?r=g

d – domyśne zdjęcie – wysyłane jeżeli dla danego adresu e-mail nie ma zarejestrowanego gravatara. Jako domyślne zdjęcie podajemy url konkretnego zdjęcia lub podajemy typ automatycznie wygenerowanego zdjęcia. Do wyboru mamy identicon, monsterid oraz wavatar.
http://www.gravatar.com/avatar/3b3be63a4c2a439b013787725dfce802?d=http%3A%2F%2Fexample.com%2Fimages%2Fexample.jpg
> http://www.gravatar.com/avatar/3b3be63a4c2a439b013787725dfce802?d=identicon
> http://www.gravatar.com/avatar/3b3be63a4c2a439b013787725dfce802?d=monsterid
> http://www.gravatar.com/avatar/3b3be63a4c2a439b013787725dfce802?d=wavatar

Dodając naszego gravatara ustawiamy jego kategorię (oznaczoną literą). I tak:

  • G – może być wyświetlany na wszystkich stronach
  • PG – może zawierać nieprzyjemne treści
  • R – treści nieerotyczne, ale nie dla dzieci
  • X – dostępny na stronach z treścią erotyczną

A oto jak można wygenerować gravatara w C#:

[sourcecode language=”csharp”]

protected string GetGravatarUrl(string email) {
var hash = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(email, "MD5");

var gravatarUrl = new StringBuilder();
gravatarUrl.Append("http://www.gravatar.com/avatar/");
gravatarUrl.Append(hash.ToLowerInvariant());
gravatarUrl.Append("?s=60");
gravatarUrl.Append("&r=g");
gravatarUrl.Append("&d=mavatar");

return gravatarUrl.ToString();
}

[/sourcecode]

Z metody korzystamy w następujący sposób:

[sourcecode language=”xhtml”]

<asp:DataList ID="dlUserList" runat="server">
<itemTemplate>
<img alt=&#039;<%# Eval("UserName") %>&#039; src="<%# GetGravatarUrl(Eval("EmailAddress")) %>" />
</itemTemplate>
</asp:DataList>
[/sourcecode]

Można też skorzystać z gotowej kontrolki. Można ją pobrać pod adresem: http://www.freshclickmedia.com/wp-content/uploads/2008/02/gravatar.zip

Opis implementacji kontrolki: http://www.freshclickmedia.com/blog/2008/02/gravatar-aspnet-control/

Quick Tip: 02. Pamiętaj o Page.IsValid !!

Każda strona posiadająca formularze powinna być walidowana. I każdy (mam nadzieję :)) to robi – choćby poprzez stosowanie kontrolki RequiredFieldValidator.

Walidacja odbywa się (przy parametrze Display=”Dynamic”) po stronie przeglądarki (java script) oraz po stronie serwera. Wszystko działa jak należy. Użytkownik nie wprowadza danych lub wprowadza je źle i formularz się nie wysyła :)  – działa, jeżeli obsługa java script w przeglądarce użytkownika jest włączona!

Problem pojawia się, kiedy użytkownik korzystający z naszej strony ma wyłączoną obsługę java script, a my zapomnimy wywołać walidację po stronie serwera.

Dlatego tak ważne jest korzystanie z Page.IsValid. Właściwość ta zwraca nam true lub false w zależności od tego, czy walidacja przeszła poprawnie czy też nie.

[sourcecode language=”csharp”]

protected void btnMyButton_Click(object sender, EventArgs e) {
if (!Page.IsValid) {
return;
}
// dalsze operacje
}

[/sourcecode]

Jeżeli korzystamy z grup walidacji (ValidationGroup=”NazwaValidationGroup”), wtedy daną grupę walidujemy poprzez wywołanie metody Page.Validate(“NazwaValidationGroup”).

[sourcecode language=”csharp”]

protected void btnMyButton_Click(object sender, EventArgs e) {

Page.Validate("MojaGrupa")

if (!Page.IsValid) {
return;
}
// dalsze operacje
}

[/sourcecode]

Niby oczywiste, a tak często o tym zapominamy :)