czwartek, 27 grudnia 2012

Łączenie URL-i jak Path.Combine()

Pracując z aplikacjami webowymi dosyć często zachodzi potrzeba połączenia dwóch stringów będących URL-ami. Można to zrobić w bardzo prosty sposób jak zwykłe łączenie dwóch stringów, przy pomocy plusa. Jednak to rozwiązanie jest nieeleganckie i może być źródłem nieoczekiwanych problemów.

Z drugiej strony w przypadku operowania na stringach będących ścieżkami na dysku możemy skorzystać z metody Path.Combine(), która bezpiecznie łączy dwa ciągi znaków. Dodając lub nie "\" w miejscu ich łączenia.

W przypadku łączenia URL-i nie mamy gotowej metody w frameworku, która działała by w taki sam sposób jak Path.Combine(). Można tu wykorzystać naturalną możliwość łączenia jaką daje konstruktor klasy Uri() jednak jego działanie nie będzie zgodne z oczekiwaniem. Dodatkowym problemem jest to, że nie można podać łączonych URL-i jako stringów.
string urlA = "http://example.org/info";
string urlB = "test.html";

Uri baseUri = new Uri(urlA);
Uri pathUri = new Uri(urlB, UriKind.Relative);
Console.Write(new Uri(baseUri, pathUri).ToString());

Wynikiem działania powyższego kodu będzie adres w postaci: http://example.org/test.html. Nie taki był zamiar, bo zgodnie z oczekiwaniem adres miał wyglądać tak: http://example.org/info/test.html aby zachować zachowanie takie jak Path.Combine().
Gdy lekko zmodyfikujemy łączone adresy:
string urlA = "http://example.org/info/";
string urlB = "test.html";

To otrzymamy właściwy adres zgodnie z oczekiwaniem. A co gdy dołączana część adresu będzie się zaczynać od "/"?
string urlA = "http://example.org/info/";
string urlB = "/test.html";

Otrzymamy znowu adres: http://example.org/info.html, więc wróciliśmy do punktu wyjścia. Kilka spostrzeżeń:
  • Pierwsza część adresu musi zawsze kończyć się znakiem "/"
  • druga część adresu nie może się zaczynać od znaku "/"
Zastosujmy więc poniższe wnioski do początkowego kodu:
string urlA = "http://example.org/info/";
string urlB = "/test.html";

Uri baseUri = new Uri((urlA.EndsWith("/") ? urlA : urlA + '/'));
Uri pathUri = new Uri(urlB.TrimStart('/'), UriKind.Relative);
Console.Write(new Uri(baseUri, pathUri).ToString());
Lub w bardziej przyjaznej formie metody:
public static string UrlCombine(string urlA, string urlB)
{
   // dodajmy / na końcu gdy go nie ma
   Uri baseUri = new Uri((urlA.EndsWith("/") ? urlA : urlA + '/'));
   // zawsze usuwamy znak / z początku
   Uri pathUri = new Uri(urlB.TrimStart('/'), UriKind.Relative); 
   return new Uri(baseUri, pathUri).ToString();
}

Omijając kilka właściwości klasy Uri udało się stworzyć metodę, która może ułatwić i przyspieszyć prozaiczną czynność jak łączenie adresów.

piątek, 4 maja 2012

HTML5: Element progress - pasek postępu

Standard HTML5 wprowadza kilka elementów, bardziej związanych z aplikacjami niż z typowymi dokumentami tekstowymi. Jednym z nich jest pasek postępu, który pozwala na graficzną reprezentację postępu czasochłonnej czynności, jak ściąganie/wysyłanie plików, przetwarzanie danych przez algorytm. Umieszczenie elementu w dokumencie:

<progress max="100"></progress>

Parametry:
  • max - wartość maksymalna,
  • value - aktualna wartość wskazywana przez pasek,
  • form - formularz do którego przypisany jest pasek.
Dostęp do paska postępu w JavaScript

<progress id="test" max="100"></progress>

Kod w JavaScript:

bar = document.getElementById("test");
bar.value = 50; // 50% postępu



W przypadku nieokreślenia parametru max pasek postępu, przyjmuje postać, w której nie wskazuje na aktualny postęp tylko pracę w toku (przesuwający się prostokąt).



Określanie wyglądu paska

Określenie tła i obramowania wygląda tak samo jak w innych elementach HTML. Problemem może być tu określenie koloru wskazującego na postęp. Nie można tego dokonać żadnym standardowym parametrem CSS.
Należy użyć pseudostyli dla konkretnej przeglądarki, w tym przypadku dla Firefoksa i Chrome:

progress::-webkit-progress-bar-value, 
progress::-webkit-progress-value,
progress::-moz-progress-bar {background-color: Red;}

wtorek, 13 września 2011

Dzień programisty 2011


  1. Uruchamiamy Visual Studio

  2. Tworzymy nowy projekt "Console Application"

  3. Wklejamy poniższy tekst

    using System;
    using System.Text;

    namespace Quine2011
    {
    class Program
    {
    const string q = "dXNpbmcgU3lzdGVtOw0KdXNpbmcgU3lzdGVtLlRleHQ7DQoNCm5hbWVzcGFjZSBRdWluZTIwMTENCnsNCiAgICBjbGFzcyBQcm9ncmFtDQogICAgew0KICAgICAgICBjb25zdCBzdHJpbmcgcSA9ICIyNTYiOw0KICAgICAgICBzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpDQogICAgICAgIHsNCiAgICAgICAgICAgIGNvbnN0IHN0cmluZyB4MjU2ID0gIjI1NiI7DQogICAgICAgICAgICBzdHJpbmcgdiA9IEVuY29kaW5nLkRlZmF1bHQuR2V0U3RyaW5nKENvbnZlcnQuRnJvbUJhc2U2NFN0cmluZyhxKSk7DQogICAgICAgICAgICBpbnQgcCA9IHYuSW5kZXhPZih4MjU2KTsNCiAgICAgICAgICAgIENvbnNvbGUuV3JpdGUodi5TdWJzdHJpbmcoMCwgcCkgDQogICAgICAgICAgICAgICAgKyBxIA0KICAgICAgICAgICAgICAgICsgdi5TdWJzdHJpbmcocCArIHgyNTYuTGVuZ3RoKSk7DQogICAgICAgICAgICBDb25zb2xlLlJlYWRLZXkoKTsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg==";
    static void Main(string[] args)
    {
    const string x256 = "256";
    string v = Encoding.Default.GetString(Convert.FromBase64String(q));
    int p = v.IndexOf(x256);
    Console.Write(v.Substring(0, p)
    + q
    + v.Substring(p + x256.Length));
    Console.ReadKey();
    }
    }
    }



  4. Kompilujemy i uruchamiamy

  5. Do zobaczenia za rok

czwartek, 19 maja 2011

dotPeek - nowy dekompilator dla .NET

Po tym jak okazało się, że Reflector nie będzie już dostępny w najprostszej wersji jako darmowe oprogramowanie, wielu programistów zaczęło prace nad odpowiednikiem. Pierwszym takim rozwiązaniem jest ILSpy, o którym niedawno pisałem.

Mimo tego ludzie z JetBrains (autorzy dodatku do Visual Studio - ReSharper) rozpoczęli prace nad swoją aplikacją.



Obecna wersja programu dostępna pod adresem:
http://www.jetbrains.com/decompiler/

Wersja ta jest jeszcze niestabilna. Gdy uruchamiałem pierwszy raz dotPeek, program zawiesił się po czym pojawiła się propozycja wysłania raportu o błędzie do autorów. Jest to normalne zachowanie programu, który znajduje się we wczesnym stadium tworzenia. Wygląd programu przypomina Visual Studio i zapewne dotPeek będzie elementem kolejnej wersji ReSharpera. Reszta opcji jest znana z Reflectora, może poza możliwością otwarcia modułów z GAC - w Reflectorze trzeba było najpierw znaleźć odpowiedni plik i dopiero go otworzyć, co nie zawsze było proste i wygodne.

Wczesna wersja dostępna jest w wersji darmowej (EAP -Early Access Program).

piątek, 18 lutego 2011

Żegnaj Reflector, witaj ILSpy

Jakiś czas temu firma Redgate, ogłosiła że przekazany im pod opiekę program Reflector przestanie być dostępny w wersji darmowej. Owszem równolegle sprzedawana była wersja Reflectora, która posiadała nieco więcej właściwości min. integrację z Visual Studio. Od lutego 2011 Reflector dostępny jest w cenie 35$.

Społeczność programistów nie czekała długo i odpowiedzią na tę sytuację jest projekt ILSpy. Na stronie projektu widoczne są już pierwsze screenshoty, dostępny jest kod źródłowy na Githubie.
Projekt nabiera rozpędu i w tym przypadku należy spodziewać się dobrego narzędzia, które będzie na bieżąco rozwijane.

sobota, 18 września 2010

DuckDuckGo - "nowe Google" ?

Coraz większą uwagę w Świecie przeglądarek przykuwa nowa wyszukiwarka DuckDuckGo. Czy będzie to "nowe Google"? Pod koniec lat dziewięćdziesiątych pojawiła się nowa wyszukiwarka. Od razu tym co wyróżniało ją od innych panujących wtedy wyszukiwarek to znacznie lepszy algorytm wyszukiwania. Wyniki na pierwszych pozycjach znacznie lepiej odzwierciedlały to czego spodziewał się użytkownik. Czy teraz Duck Duck Go próbuje przejąć rynek.

Zero-click

Teraz DDG przykuwa uwagę sposobem prezentacji wyników. Pierwszą taką funkcjonalnością jest "Zero-click info". Można to porównać do "I'm feelin' lucky" z Google. Z tym, że rozwiązanie to nie ogranicza nas do obejrzenia tylko strony z pierwszego wyniku wyszukiwania. Dalej będąc na stronie wyszukiwania możemy dostać się do kolejnych wyników nie klikając w cokolwiek. Jak narazie wyniki Zero-click są dostępne tylko w przypadku kilku serwisów internetowych min. Wikipedia, Stackoverflow.

!bang

!bang to zbiór komend wyszukiwania. Obejmuje on szeroki zakres popularnych serwisów. Polega to głównie na przekierowaniu do wyszukiwarki danego serwisu wpisując na przykład !youtube numa numa zostaniemy przeniesieni wprost do wyników wyszukiwania serwisu YouTube. Natomiast wpisując !google lub !g przeglądarka przejdzie do wyszukiwania Google. Twórcy DDG mają dosyć zdrowe podejście do rozwiązań i nie negują istnienia innych serwisów. Więcej na temat !bang

Narzędzia

Nie znasz swojego adresu IP? Potrzebne losowe liczby, proszę bardzo rand 1 46. Pełna lista narzędzi.

Prywatność

W przeciwieństwie do Google, DDG nie loguje informacji o wyszukiwaniach i użytkownikach. Wyszukiwania są anonimowe. Dodatkowo można się zabezpieczyć przed wyciekiem informacji o wyszukiwaniu na stronach z wyników wyszukiwania, przez włączenie trybu POST. Można też skorzystać z trybu proxy włączanego komendą !proxy. Dodatkowo połączenie do DDG można zrealizować przez połączenie szyfrowane.

Na zakończenie

Duck Duck Go niekoniecznie musi być alternatywą dla Google czy Bing, ale dobrym dopełnieniem tych oraz wielu innych serwisów, stanowiąc punkt startowy do poszukiwań w internecie.