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.

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ę.