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.

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.