niedziela, 22 marca 2009

Sinatra

Dzisiaj będzie o Sinatrze, nie o Franku Sinatrze, słynnym wokaliście, ale o frameworku nazwanym jego nazwiskiem. Framework napisany jest w Ruby. Czerpie nieco z Merba, z Ruby on Rails. Jest na tyle ciekawy, że najprostsza aplikacja zawiera się w kilku linijkach:


#sinatraweb.rb
require 'rubygems'
require 'sinatra'

get '/' do
"Hello World!"
end


Po czym w konsoli odpalamy:


gem install sinatra ; instalujemy gem sinatra
ruby websinatra.rb


A w przeglądarce wchodzimy pod adres http://localhost:4567 i gotowe, pierwsza aplikacja w Sinatrze została uruchomiona. Może wynik nie imponuje, bo to tylko sam tekst, ale w ciągu kilku minut udało się uruchomić aplikację, działającą na własnym serwerze.

W tym przypadku Ruby on Rails jest kolosem, w którym trzeba nieco bardziej się napracować aby cokolwiek zrobić ;) Dobra, koniec żartów i nabijania się bądź co bądź z bardzo dobrego frameworku. W Sinatrze, bez problemu można dodać layouty dla stron. Do katalogu, w którym znajduje się aplikacja dodajemy katalog views, do którego dodajemy plik layout.erb (Sinatra obsługuje także szablony haml, builder. Ja wybrałem erb gdyż znam go z RoR.):


<html>
<head>
<title>Sinatra</title>
</head>
<body>
<div>
<h1>Sing!</h1>
</div>
<div>
<%= yield %>
</div>
</body>
</html>


Słowo yield umieszczamy w miejscu gdzie ma pojawić się treść. W tym samym katalogu dodajemy kolejny plik, index.erb wyświetlający konkretną treść:


<p>
Witaj, może znajdziesz tu coś dla siebie!
Teraz jest: <%= @data %>
<p>


I jeszcze modyfikujemy główny plik aplikacji:


require 'rubygems'
require 'sinatra'

get '/' do
@data = DateTime.now
erb :index
end


Jak widzimy, sposób używania widoków wygląda podobnie jak w RoR. Poprzez metodę get definiujemy ścieżkę dostępu do zasobu a w bloku definiowane jest zachowanie kontrolera. Nie przypadkowo użyłem tu słowa "zasób" gdyż mamy od dyspozycji jeszcze metody: post, put i delete. Czyli istnieje możliwość implementacji kompletnego interfejsu REST.

Sinatra pozwala na napisanie aplikacji opartych o wzorzec Model-View-Controller, mimo iż w przykładowej aplikacji nie występuje żaden model. Nie narzuca też jakiegoś konkretnego rozwiązania, dlatego też można użyć ActiveRecord, Og, lub innych podobnych rozwiązań do połączenia się z bazą danych.

środa, 4 lutego 2009

Wyznaczanie MD5 w jednej linii kodu

Otrzymanie sumy kontrolnej MD5 w .NET nie jest operacją trudna, ale na pewno nie tak trywialną jak wywołanie funkcji md5() z innych języków programowania. Najczęściej suma kontrolna przekazywana jest w postaci ciągu znaków liczby szesnastkowej.


using System.Security.Cryptography; // :)

string MD5Hash(string s)
{
return BitConverter.ToString(
MD5.Create()
.ComputeHash(Encoding.Default.GetBytes(s)))
.Replace("-",string.Empty)
.ToLower();
}


Powyższy kod w postaci "jednolinijkowca" załatwia sprawę.

wtorek, 16 grudnia 2008

HTTP 417 i Webservice

Ostatnio w firmie napisałem aplikację, która łączy się poprzez webservice do "bardzo ważnego" systemu z punktu widzenia firmy. Program służy ludziom w jednej zdalnej lokalizacji (nazwijmy ją LZ), natomiast serwer znajduje się gdzie indziej. Droga z jednego punktu do drugiego, jest raczej długa mimo niewielkiej geograficznej odległości (ok. 5km). Pewnego dnia aplikacja przestała działać (firma też w tym momencie znacznie zwolniła).

Ale do rzeczy, po krótkim wywiadzie okazało się, że wywołanie metod serwisu skutkuje rzuceniem wyjątku. Dokładnie WebException skarżący się na "HTTP ERROR 417: Expectation failed". Po dalszym wywiadzie o co chodzi, okazało się iż sprawa ma się z nieodpowiednimi wpisami w nagłówku HTTP. Po uruchomieniu aplikacji w innym miejscu niż LZ, problem znikł. Okazało się, że ISP dostarczający sieć do LZ miesza coś w HTTP przy pomocy transparentnego proxy.

No dobra problem zidentyfikowany, ale teraz jak go ominąć? Proste: zabrońmy dostawcy mieszać nam w strumieniu zabezpieczając go przez szyfrowanie. Włączamy w webserwisie SSL, uprzednio generując certyfikat przy pomocy wbudowanego w IIS generatora certyfikatów. Następnie trzeba zmusić program kliencki by bez pytania akceptował ten certyfikat. Tu posłużyłem się informacjami znalezionymi tutaj. W ten sposób ominąłem problem i dodatkowo zabezpieczyłem dane.

środa, 29 października 2008

Basic Commodore 64 na twoim PC

Tak, to prawda, a na dodatek to nie żadna emulacja przy pomocy któregoś z emulatorów. Autorzy www.pagetable.com skonwertowali oryginalny kod Basica z C64 na język C. Całość jest wydana na licencji BSD wraz z źródłami. Więc można skompilować na prawie każdym systemie. Więcej...

niedziela, 20 lipca 2008

Wyrażenia regularne w C# - podmiana

Wyrażenia regularne pozwalają także na podmianę tekstu na podstawie podanych wzorców. Klasa Regex posiada metodę Replace umożliwiającą podmianę tekstu.
Najprostszy sposób to wywołanie metody, której argumentami są: ciąg wejściowy, wzorzec oraz ciąg, który zostanie użyty do podmiany.


string tekst = "Ala mz kota, a kot mw Ale";
string podmiana = Regex.Replace(tekst, "m.", "ma"); // podmień tekst rozpoczynający się od m i kończący się dowolnym znakiem
Console.WriteLine(podmiana); // wyświetlenie podmienionego tekstu


Bardziej rozbudowana wersja tej metody pozwala na zastosowanie delegatów wywoływanych w momencie dopasowania do wzorca.


class Program
{
private static string ReplaceMethod(Match m)
{
Console.WriteLine(m.Value); // znaleziony tekst
return "ma"; // zwrócenie tekstu który znajdzie się w miejscu dopasowania
}

static void Main(string[] args)
{
string tekst = "Ala mz kota, a kot mw Ale";
string podmiana = Regex.Replace(tekst, "m.", ReplaceMethod);
Console.WriteLine(podmiana);
Console.ReadKey();
}
}

wtorek, 8 lipca 2008

Wyrażenia regularne w C#

Wyrażenia regularne to podstawowe narzędzie przy analizie i modyfikacji tekstu. C# też oferuje odpowiednią klasę do używania wyrażeń regularnych. Mowa tu o klasie Regex.
Klasy można używać w dwojaki sposób, tworząc obiekty tej klasy lub też korzystać ze statycznych metod. W tych dwóch przypadkach, postępuje się w podobny sposób.

Wyszukiwanie tekstu

Klasa Regex posiada dwie metody posiadające kilka innych wariantów: Match i Matches. Pierwsza z nich zwraca jedynie pierwszy wynik wyszukiwania w postaci obiektu klasy Match.

string tekst = "Ala ma kota, a kot ma Ale";
Match match = Regex.Match(tekst,"kot.?");
while (match.Success) // czy zostało coś znalezione
{
Console.WriteLine(match.Value); // Wyświetlenie wyniku wyszukiwanie
match = match.NextMatch(); // odczytanie następnego wyniku
}

W powyższym przykładzie zastosowana została metoda Match, która zwraca pojedynczy wynik oraz metoda NextMatch(), która zwraca kolejny. Można pobrać całą kolekcję wyników przy pomocy metody Matches.

string tekst = "Ala ma kota, a kot ma Ale";
MatchCollection matches = Regex.Matches(tekst, "kot.?");
foreach (Match m in matches)
{
Console.WriteLine(m.Value);
}

poniedziałek, 7 kwietnia 2008

Witam na moim blogu

Postanowiłem, że pod adresem rychlik.eu będzie mój blog. Będzie to znacznie lepsze rozwiązanie niż prawie "nieżywa" strona. Na tym blogu skupię się głównie na moich zainteresowaniach czyli programowanie w C#, Ruby itp. Poza tym znajdą się tu różne ciekawe "znaleziska" z sieci, część z nich bezpośrednio na blogu, reszta na moim profilu del.icio.us.