Xenu – wygrać z 404

Tworząc aplikacje /strony internetowe dobrze jest zadbać, aby dla każdego linku istniało miejsce docelowe :)

Nie stanowi to problemu, kiedy mamy małą stronę (składającą się z 5,6 podstron), ale przy większych (szczególnie kiedy kontent jest generowany dynamicznie), często stanowi to problem. Ciężko jest również “przeklikać” stronę i sprawdzać, czy wszystkie linki są prawidłowe.

Z pomocą przychodzi mały, ale wręcz genialny program – Xenu. Zadaniem tego programu jest analizowanie strony w poszukiwaniu “złych” linków. Xenu sprawdza nie tylko linki do stron, ale również adresy sktryptów javascipt, css, obrazów.

Program można pobrać ze strony: http://home.snafu.de/tilman/xenulink.html.

Instalacja programu jest banalna, więc nie będę jej opisywał.

Po uruchomieniu programu wybieramy “File -> Check URL…”

xenu1

Podajemy adres strony, klikamy OK …

xenu2

… i czekamy, aż Xenu skończy swoją pracę

xenu3

Na zakończenie otrzymamy raport prezentujący listę znalezionych linków oraz status określający, czy dany link jest prawidłowy, czy też nie.

Myślę, że Xenu jest obowiązkowym narzędziem każdego, kto tworzy strony www.

Screencast: 1. AJAX – wprowadzenie

Zapraszam na pierwszą część z serii screencastów dotyczących wykorzystania AJAXa w ASP.NET.

Pierwsza część jest jednocześnie jedyną w pełni teoretyczną. Omawia historię powstania AJAXa oraz krótkie wprowadzenie, które pozwoli rozumieć działanie przykładów przedstawionych w kolejnych częściach.

Zapraszam do oglądania i czekam na komentarze :)

ScriptManager: EnableCdn="true"

Parę dni temu Microsoft uruchomił usługę Microsoft Ajax CDN umożliwiającą pobieranie bibliotek javascript (związanych z Microsoft AJAX) z serwerów Microsoftu. Wykorzystanie Microsoft Ajax CDN pozwala zwiększyć “szybkość” działania aplikacji – używane biblioteki są cachowane i szybciej wysyłane do klienta.

Najbardziej mnie jednak cieszy fakt dodania property EnableCdn, umożliwiających wykorzystanie Microsoft Ajax CDN do ładowania skryptów, które do tej pory automatycznie były pobierane z bibliotek System.Web.dll oraz System.Web.Extensions.dll, czyli zamiast standardowego:

[sourcecode language=”xhtml”]
<script src="/ScriptResource.axd?d=gbruZflV-cd1gZnUdPOxDZcPjj4iD1Hix9fWmdpjOFQzRXbkQcZ2wc0n-Dt1NPH2RQJC2J0S8AHa_9qVldKC2T0CHE2p0Pg6O5j986Okf1M1&&t=ffffffff87dfba72" type="text/javascript"></script>
[/sourcecode]

uzyskamy

[sourcecode language=”xhtml”]
<script src="http://ajax.Microsoft.com/ajax/beta/0909/MicrosoftAjax.debug.js" type="text/javascript"></script>
[/sourcecode]

Very cool :)

Lista dostępnych bibliotek znajduje się na stronie:
http://www.asp.net/ajax/cdn/

Więcej informacji o Microsoft Ajax CDN na stronie ScottaGu:

http://weblogs.asp.net/scottgu/archive/2009/09/15/announcing-the-microsoft-ajax-cdn.aspx

Quick Tip: 05. waliduj dane w formacie w jakim je wyświetlasz

Często dane, które posiadamy musimy odpowiednio sformatować przed ich wyświetleniem.
Jeżeli takie dane musimy zwalidować, to warto zadbać, aby walidowane dane były  w takim samym formacie jak je wyświetlamy.

Prosty przykład:

Powiedzmy, że mamy metodę pobierającą kwotę faktury:

[sourcecode language=”csharp”]

var invoiceBalance = GetInvoiceBalance();

[/sourcecode]

Kwotę tą otrzymujemy z dokładnością do 4 miejsc po przecinku.
Jednak przez wyświetleniem formatujemy ją:

[sourcecode language=”csharp”]

litInvoiceBalance.Text = invoiceBalance.ToString("C");

[/sourcecode]

Co w wyświetli nam np. 100,00 zł.
Jak widać nasza zmienna wyświetlana jest z dokładnością do 2 miejsc po przecinku.

Dodatkowo załóżmy, że jeżeli pobrana kwota jest większa od 0, umożliwimy użytkownikowi zaznaczenie RadioButton’a, czyli:

[sourcecode language=”csharp”]

if (invoiceBalance > 0)
{
rbMakePayment.Enabled = true;
}

[/sourcecode]

Niby wszystko ok – aplikacja działa. Jeśli kwota jest większa od 0 możemy zaznaczyć RadioButton’a, a jeśli nie to nie możemy.

Problem pojawi się w sytuacji, kiedy nasza procedura zwróci np. 0,0010.
Co wówczas zrobi nasz program? Wyświetli 0,00 zł, ale jednocześnie pozwoli zaznaczyć RadioButton’a :(
Dzieje się tak, ponieważ 0,0010 zaokrąglone do dwóch miejsc po przecinku da nam 0,00, ale podczas walidowania kwota jest większa od zera.

Tego typu błędy są czasami ciężkie do wykrycia – kompilator nic nie zgłosi, a i sam błąd występuje rzadko.

Rozwiązaniem w tym przypadku jest zaokrąglenie naszej kwoty przed wyświetleniem i zwalidowaniem, czyli:

[sourcecode language=”csharp” highlight=”3″]
var invoiceBalance = GetInvoiceBalance();

invoiceBalance = Math.Round(invoiceBalance, 2);

litInvoiceBalance.Text = invoiceBalance.ToString("C");

if (invoiceBalance > 0)
{
rbMakePayment.Enabled = true;
}

[/sourcecode]

Warto zwrócić uwagę na takie sytuacje.

Jak pobrać PublicKeyToken – GetAssemblyDetails

W jednym z projektów, nad którym ostatnio pracowałem, musiałem dodać referencje do pewnej biblioteki, czyli np. standardowe:

[sourcecode language=”xml”]
<add assembly="System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
[/sourcecode]

Niby wszystko ok, ale to PublicKeyToken – trochę trzeba się naklikać, żeby tą wartość uzyskać.

Jako osoba ceniąca “proste” życie napisałem program, który robi to za mnie – GetAssemblyDetails :)

GetAssemblyDetails jest standardową aplikacją konsolową, którą dodatkowo można wywołać z menu kontekstowego plików .dll oraz .exe

Jak tego programu używać:

GetAssemblyDetails -f “ścieżka do assembly” – pobiera dane assembly
np. GetAssemblyDetails -f c:Program FilesMicrosoft ASP.NETASP.NET MVC 1.0AssembliesSystem.Web.Mvc.dll

GetAssemblyDetails -r – dodaje program do menu kontekstowego

GetAssemblyDetails -u – usuwa program z menu kontekstowego

Wystarczy skopiować tekst wygenerowany przez program i voila :)

POBIERZ  GetAssemblyDetails.exe

I jeszcze parę screenów:

assembly1

assembly2

Quick Tip: 04. przeszukuj kolekcje z where zamiast foreach

LINQ udostępnia metodę where, która umożliwia przeszukiwanie kolekcji tak jak foreach.

Przykładowo, zamiast:

[sourcecode language=”csharp”]
var polishCustomers = new List<Customer>();

foreach (var customer in customers)
{
if (customer.Country == "Poland")
polishCustomers.Add(customer);
}
[/sourcecode]

możemy użyć

[sourcecode language=”csharp”]
var polishCustomers = customers.Where(x => x.Country == "Poland");
[/sourcecode]

czyli krótko, zwięźle i na temat :)

Oczywiście wcześniej musimy dodać using System.Linq;