Quick Tip: 07. Firefox – Smart keywords

Dzisiaj krótko na temat, jak ułatwić sobie pracę z Firefoxem.

Firefox posiada bardzo przydatny mechanizm – “Smart keywords“. Umożliwia on definiowanie słów kluczowych dla pól wyszukiwania na stronach.

Aby dodać nowe słowo kluczowe klikamy prawym przyciskiem myszki na danym polu i wybieramy: “Utwórz słowo kluczowe dla tej wyszukiwarki…“,

ff1

w nowym okienku “Nowa zakładka” podajemy nazwę zakładki oraz słowo kluczowe.

Dla google można zrobić tak:

ff2

po takiej konfiguracji w przeglądarce (jako adres) wpisujemy np. “g asp.net“  i uzyskujemy wyniki wyszukiwania dla asp.net :)

Takie skróty możemy definiować dla dowolnego pola na stronie www.

Ja np. często korzystam  ze skrótu “b + numer issue” jako odwołanie do BugTrackera.

Proste i bardzo przydatne :)

Quick Tip: 06. zamieniamy URL na link

Dzisiaj prosty przykład jak w tekście zamienić url na link, czyli np. użytkownik wpisuje:

“Zapraszam na moją stronę http://gasior.net.pl”

a my wyświetlając ten tekst chcemy otrzymać coś takiego

“Zapraszam na moją stronę <a href=”http://gasior.net.pl”>http://gasior.net.pl</a>

Z pomocą przychodzą wyrażenia regularne:

protected string ConvertUrlsToLinks(string msg)
{
   Regex r = new Regex("(http://[^ ]+)");
   return r.Replace(msg, "<a href=\"$1\">$1</a>");
}

Jeżeli zachodzi taka potrzeba możemy ten sam efekt uzyskać w JavaScripcie:

var objRegExp = /(http:[^ ]+)/g;
var convertedValue = msg.replace(objRegExp, "<a href='$1'>$1</a>");

EDIT:
w nawiązaniu do słusznej uwagi z komentarza (użytkownik apl) podaję poprawioną, dokładniejszą metodę:

var reg = @"((www\.|(http|https)+\:\/\/)[&#95;.a-z0-9-]+\.[a-z0-9\/&#95;:@=.+?,##%&~-]*[^.|\'|\# |!|\(|?|,| |>|<|;|\)])";
Regex r = new Regex(reg, RegexOptions.IgnoreCase);
return r.Replace(msg, "<a href=\"$1\">$1</a>").Replace("href=\"www", "href=\"http://www");

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:


var invoiceBalance = GetInvoiceBalance();

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


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

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:


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

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:

var invoiceBalance = GetInvoiceBalance();

invoiceBalance = Math.Round(invoiceBalance, 2);

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

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

Warto zwrócić uwagę na takie sytuacje.

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:

var polishCustomers = new List<Customer>();

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

możemy użyć

var polishCustomers = customers.Where(x => x.Country == "Poland");

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

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

Quick Tip: 03. Stosuj nagłówki

Przeglądając źródła różnych stron www (HTML) często można znaleźć taki kod:


<span class="bigHeader">Mój Nagłówek</span>

<span class="newsTitle">Mój News</span>

W ten sposób za pomocą CSS ustalamy wygląd nagłówków, tytułów artykłów, newsów, itp. Np. na codeguru.pl każdy news na stronie głównej wygląda tak:


<a class="bigWindowTitleLinked" title="tytuł" href='/url.aspx'>News</a>

Jednak pod względem optymalizacji SEO dużo lepszym rozwiązaniem jest stosowanie nagłówków <h1>, <h2>, <h3>,  itd. W ten sposób określamy ważność tekstu na stronie (<h1> jest ważniejszy od <h2>). Dla podanych przykładów wyglądałoby to tak:


<h2>Mój Nagłówek</h2>

<h2>Mój News</h2>

Składnia prostsza, krótsza i lepiej interpretowana przez wyszukiwarki.

A dlaczego <h2> a nie <h1>? Wszystko zależy od tego, jak chcemy ustalić hierachię informacji na stronie. Jestem zwolennikiem stosowania nagłówka dla nazwy strony np.:


<h1>Mój portal</h1>

Zmiana class=”bigHeader” na nagłówki trudna nie jest :), a zyskujemy bardzo dużo na jakości kodu w “oczach” przeglądarek.

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.


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

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


protected void btnMyButton_Click(object sender, EventArgs e) {

Page.Validate("MojaGrupa")

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

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

Quick Tip: 01. C# operator ??

Podczas tworzenia oprogramowania jedną z częściej wykonywanych operacji jest sprawdzanie, czy dany obiekt nie jest nullem. Często wygląda to tak:

MyType result;
if(Object1 != null)
{
  result = Object1;
}
else
{
  result = Object2;
}

lub

MyType result = Object1 != null ? Object1 : Object2;

Kod ten możemy sobie uprościć stosując operator ?? (podwójny znak zapytania). Operator ten zwraca obiekt będący “z lewej strony”, jeżeli jest on różny od null lub jeżeli jest nullem obiekt będący z jego “z prawej strony”.

Podany przykład będzie wyglądał tak:

MyType result = Object1 ?? Object2;

lub

MyType result = Object1 ?? Object2 ?? Object3;

Oczywiście Object1 może być również funkcją zwracającą obiekt, np:

public MyType MyObject
{
    get { return myObject ?? (myObject = objectFactory.Create()); }
}

zamiast:

public MyType MyObject
{
    get
    {
        if (myObject == null) myObject = objectFactory.Create();
        return myObject;
    }
}

Korzystając z tego operatora należy pamiętać, że pusty string nie jest nullem!