czwartek, 6 maja 2010

Sinatra w praktyce

Wcześniej, bo jakiś rok temu przedstawiłem jak w Sinatrze napisać najprostrzą aplikację. Ten sposób jest dobry, by szybko zademonstrować możliwości frameworka lub szybko przygotować zarys działającej aplikacji. Przy rozwijaniu aplikacji, lepiej jest nieco bardziej się postarać i całość ubrać w ładną klasę dziedzicząca po Sinatra::Base. Dzięki temu definicje odwołań nie będą znajdować się w głównej przestrzeni nazw.

#sinatraweb.rb
class HelloApplication < Sinatra::Base
get '/' do
"Hello World!"
end
end

Poza efektem estetycznym aplikacja będzie mogła być łatwo rozszerzana lub też być
częścią jakiejś większej aplikacji, bez ryzyka, że dojdzie do konfliktów itp.

Dodatkowo aplikację należy wyposażyć w plik konfiguracyjny, przy pomocy którego
aplikacja będzie uruchamiana. Tak zwany plik "rackup" najczęściej w projektach
występujący pod nazwą config.ru

#config.ru
require 'rubygems'
require 'sinatra/base'
require 'sinatraweb.rb'

HelloApplication.run!

Zastosowanie tego pliku jest dosyć istotne gdy uruchamiamy aplikację na Heroku
lub na innych systemach wykorzystujących bibliotekę Rack. Przy pomocy pliku *.ru można ustawić parametry uruchomienia aplikacji takie jak port, adres tryb i działania.

Obsługa błędów 404 i innych


Zdarza się to dosyć często, że użytkownik nie trafia na stronę na którą sie spodziewał trafić. I tu pojawia się znany błąd 404. Sinatra domyślnie obsługuje tego typu błąd wywołując odpowiednie zdarzenie. Bez problemu możemy to zdarzenie nadpisać, aby wyświetlić własny widok.

Dwa proste przykłady

not_found do
'Tu niczego nie ma!';
end

not_found do
erb :error404 # dodajemy plik error404.erb do katalogu "views"
end

Wszystkie inne błędy przechwycić można przez zdarzenie error:

error do
"Kłopoty! " + request.env['sinatra.error'].message
end


Przełączanie środowiska


Normalnie Sinatra działa w trybie deweloperskim, jest to dosyć wolny tryb, część plików jest za każdym odwołaniem wczytywana ponownie. Przełączenie w tryb produkcyjny eliminuje ten problem. Dodatkowo pozwala to na skonfigurowanie oddzielnych środowisk do tworzenia, testowania i normalnego uruchamiania.
Ustawienie odpowiedniego środowiska polega na uruchomieniu metody set:

set :environment, :production # włączamy środowisko produkcyjne

W przypadku tworzenia aplikacji w osobnej klasie warto metodę tą dodać właśnie w definicji klasy aplikacji. Łatwe przełączanie między środowiskami pozwoli na używanie innych baz danych w środowisku deweloperskim i produkcyjnym, co wydaję się rozsądnym rozwiązaniem.

configure do
# konfiguracja wspólna dla wszystkich trybów
end

configure :production do
# konfiguracja środowiska produkcyjnego
end

configure :development do
# środowisko deweloperskie
end

configure :test do
# środowisko testowe
# podpinamy np. inną bazę danych niż w środowisku deweloperskim
end

Więcej przydatnych wskazówek: http://sinatra-book.gittr.com

środa, 31 marca 2010

Modyfikownie daty w C#

Było o modyfikowaniu daty w Ruby. Teraz będzie trochę więcej o tym jak to się robi w C#.

Dodawanie godzin, minut i sekund



DateTime pozniej = DateTime.Now.AddHours(2); // dodajemy do obecnej daty dwie godziny do przodu
DateTime pozniej2 = pozniej.AddMinutes(35).AddSeconds(3); // do wcześniej zmodyfikowanej daty dodajemy 35 minut oraz 3 sekundy


Można także odejmować od daty dowolną ilość jednostek. Sprawa sprowadza się do dodania ujemnej wartości.


DateTime wczesniej = DateTime.Now.AddHours(-12); // data cofnięta o 12 godzin

Przykłady



DateTime data1 = DateTime.Now.AddDays(7); // dodajemy 7 dni do obecnej daty
DateTime data2 = DateTime.Now.AddMonths(3); // data przesunięta o 3 miesiące
DateTime data3 = DateTime.Today.AddYears(1); // Jaka będzie data gdy dodamy do obecnej jeden rok?
DateTime datat4 = DateTime.Parse("2008-02-29").AddYears(1); // 2009-02-28 00:00:00


DateTime.Today działa podobnie jak DateTime.Now z tą różnicą iż nie jest ustawiana aktualna godzina, tylko zawsze jest to 00:00:00.

wtorek, 29 grudnia 2009

Dodawanie/odejmowanie lat, miesięcy, dni i godzin w Ruby

W Ruby manipulowanie obiektami przechowującymi datę i czas może być kłopotliwe. W przypadku gdy chcemy dodać kilka dni do konkretnej daty, nie możemy zmodyfikować tylko pola days, gdyż ilość dodanych dni ma wpływ na końcowy miesiąc a także i rok.

W .NET struktura DateTime posiada metody AddDays, AddHours, AddMinutes itd.

Jednak Ruby nie jest gorszy, wystarczy wyposażyć go w Ruby Facets a w klasy i moduły Date, Time i DateTime zostaną rozszerzone o dodatkowe metody. Nas interesuje metoda advance.


require 'facets/date'
dni44 = DateTime.now.advance(:days=>44) # 44 dni od podanej daty

poniedziałek, 28 grudnia 2009

ChromiumOS - sam sobie zbudowałem

Ściągnąłem źródła ChromiumOS, skompilowałem na maszynie wirtualnej używając Ubuntu. Zajęło to ok 3h, kompilowałem to na raty, kilkukrotnie powtarzając cały proces (ach te pomyłki). Ale opis podany na stronie projektu jest dobry i trzymając się go można bez problemu zbudować cały system.

Okno logowania, podajemy login i hasło do usług Google.


Od razu mamy dostęp do swojej skrzynki pocztowej.Menu rozwijane, a w nim ikonki, których jeszcze nie da się konfigurować. Oczywiście dostęp do wielu "aplikacji" w formie aplikacji webowych.


Panel kalendarza Google.

Prosty kalkulator.

Menedżer procesów, uruchamiany przez skrót Ctrl+Esc.

Bardziej szczegółowe "Nerd stats", informacje o zajmowanej pamięci.

W tym momencie system jest w fazie tworzenia i wiele rzeczy zostanie rozbudowanych, jak choćby menu, do którego w tym momencie nie można dodać własnych aplikacji. Minie jeszcze trochę czasu, nim system będzie w pełni używalny, mimo to już teraz prezentuje się ciekawie.

środa, 22 lipca 2009

Mnożenie egipskie

Tym razem wpis inspirowany artykułem na The Daily WTF. Mnożenie dużych liczb może być skomplikowane i trudne. Egipcjanie wymyślili algorytm który to ułatwia, nie będę się wdawał w szczegóły, wszystko jest wyjaśnione w powyższym tekście. Ja natomiast napisałem prosty program w Ruby, który jest implementacją tego algorytmu:


# w Ruby 1.8.7 już jest taka metoda
class Fixnum
def even?
self.divmod(2)[1] == 0
end
end

def em(a, b)
result = 0
while a>1 do
a = a / 2
b = b * 2
if !a.even?
result += b
end
end
result
end


Metoda em mnoży dwie liczby wg algorytmu, metoda even? jest konieczna tylko w przypadku uruchamiania w Ruby 1.8.6. Powyższa implementacja będzie zwracać zły wynik w przypadku mnożenia przez 1, :) ale to jest chyba dosyć "trywialne" zadanie, do którego nie trzeba wykorzystywać żadnych algorytmów.

środa, 17 czerwca 2009

Zrzuta

Podoba Ci się fajny kawałek umieszczony na wrzuta.pl? Chcesz go sobie wrzucić na telefon, empetrójkę? Istnieją sposoby żeby sobie taki pliczek ściągnąć, zawsze. Jednak jedne są lepsze a drugie gorsze. Ja dzisiaj opiszę ten lepszy. Bo lepsze wrogiem dobrego... e tam, tamten sposób z ręcznym modyfikowaniem url, jest zły i niewygodny.
Dlatego powstał dodatek do Firefoksa pod nazwą Zrzuta. Instalujemy dodatek, uruchamiamy ponownie Firefoksa, wchodzimy na wrzuta.pl i cieszymy się z możliwości ściągnięcia mp3.
Jeżeli znajdujemy się na stronie z odtwarzaczem na dolnym pasku pojawia się "ZRZUTA" klikamy dwukrotnie i ściągamy na swój dysk plik mp3, nic prostszego.
Pozdrowienia dla Autora dodatku :)

niedziela, 14 czerwca 2009

HttpFox

Czasami zachodzi potrzeba obejrzenia, zapytań płynących z przeglądarki do serwera. Szczególnie gdy pracujemy nad aplikacjami wykorzystującymi AJAX. Można to rozwiązać na kilka sposobów. Jednym z nich jest użycie sniffera pakietów. Rozwiązanie skuteczne jednak, korzystanie z niego może sprawiać problemy.
Gdy korzystamy z Firefoksa lepszym jest zainstalowanie dodatku o nazwie HttpFox.

Po instalacji na dolnym pasku przeglądarki pojawia się ikona:

Po kliknięciu na nią w oknie przeglądarki otwiera się panel w którym można rozpocząć przechwytywanie zapytań.


Można przeglądać: przesyłane dane POST, cookies itd. Dołączona wyszukiwarka pozwala filtrować przechwycone komunikaty.