strona główna

Archive for February, 2008

Binary Life Forms

Friday, February 29th, 2008

Tym razem krótko: uruchomiliśmy z Jankiem osobną stronę na potrzeby comiesięcznych projektów: Binary Life Forms. Wpisy o kolejnych projektach będą pojawiać się i tutaj (w wersji bardziej technicznej) i tam (bardziej ogólne, w dwóch wersjach językowych).

Statystyki

Thursday, February 21st, 2008

out_of_service.jpg

Zdjęcie z SXC

Jak napisał Marek Kasperski na swoim blogu, dostępne jest podsumowanie ostatniego roku w sieci z punktu widzenia El Monito.

Na szybko: 70% serwisów ma zauważalne przerwy w działaniu. 20% jest niedostępne przez przynajmniej 10 godzin miesięcznie. Ponad 10% jest niedostępne przez przynajmniej dobę. Statystyczny Serwis jest niedostępny średnio przez jakieś 5% czasu. Tak, to jest dobry powód żeby zerknąć na wygląd stron 404 i 500. A przynajmniej pretekst :)

Disclaimer: dane użyte do przygotowania wykresów zostały zebrane metodą, której przy najlepszych nawet chęciach nie można nazwać kontrolowanym eksperymentem – grupa nie jest reprezentatywna, zbiór obserwowanych serwisów zmieniał się w czasie (z kilkunastu w styczniu 2007 do ponad sześciuset rok później).

Urodziny El Monito

Tuesday, February 19th, 2008

No, i przegapiłem:

 
elksoftp_monitor=> SELECT min(start_ts) AS "Pierwszy zapis"
                   FROM server_presence;
     Pierwszy zapis
––––––––––––
 2007-01-06 20:01:30+01
(1 row)
 

El Monito (wtedy jeszcze Elksoft Monitor) oficjalnie wystartował w czerwcu, ale prace i testy rozpocząłem pół roku wcześniej. I tak 6 stycznia minął dokładnie rok od momentu uruchomienia pierwszej wersji, jeszcze na moje potrzeby.

roczek

Obrazek z SXC

A przy okazji – czy na Twoim blogu pojawiła się już wlepka El Monito? Są dwie do wyboru, obie małe, lekkie, szykowne, Do wyczerpania zapasów :)

Bootstrap 8.02

Monday, February 18th, 2008

W najbliższą sobotę odbędzie się kolejny Bootstrap, rocznicowo-nietypowy.

Po pierwsze, będzie nietechnicznie: temat całości to Social Lending – społecznościowe podejście do pożyczek. Po drugie, będzie okazja posłuchać szefów czterech polskich serwisów tego typu. Po trzecie, jednorazowo zmieniamy miejsce na większe: sala Starej Drukarni, Ogrodowa 31/35, o 200 metrów od Chłodnej 25.

Więcej informacji o:

Komiksy w sieci

Friday, February 15th, 2008

Wczoraj wieczorem dokręciliśmy ostatnie śrubki w drugim z cyklu
projektów-w-tydzień. Tym razem z lekkim poślizgiem, w planach
mieliśmy zamknięcie prac w zeszłym tygodniu, w praktyce –
rzeczywiście intensywne prace zaczęliśmy w piątek, skończyliśmy
wczoraj (środa). Pierwszy
użytkownik
powoli kończy przeprowadzkę.

Nowy serwis to WebComicsPot,
narzędzie do możliwie prostego publikowania w sieci komiksów, także
wielojęzycznych. Założenia były takie: samo umieszczenie plansz w
sieci jest proste i tanie, kłopotem jest za to złożenie sensownego
interfejsu pozwalającego na ich przeglądanie i przełączanie się między
tłumaczeniami. WebComicsPot rozwiązuje właśnie ten kłopot.

Jak w favpico, obsługa jest
uproszczona do granic możliwości: autor podaje tylko listę adresów pod
którymi znajdują się kolejne plansze. Serwis zakłada, że każdy adres
zawiera datę w formacie RRRR-MM-DD. Dodatkowo możliwe jest wklejenie
w stronę komiksu swojego kodu HTML i dodanie arkusza styli CSS.
Jednocześnie, to jest nasz pierwszy serwis wspierający OpenId – koniec z
wymyślaniem kolejnych haseł :)

Coś o stronie technicznej i organizacyjnej; zaletą tak małych
projektów jest to, że można w krótkim czasie sprawdzić w praktyce
sporo nowych narzędzi: jeśli się sprawdzą to świetnie, jeśli nie – to
upośledzają tylko jeden drobny projekt, nie ma sensu go przepisywać.
Tym razem znalazłem sporo przydatnych rzeczy.

Django-authopenid
zachowuje się bardzo sensownie, wymagała tylko drobnych poprawek
(które muszę jeszcze spakować w jeden sensowny diff i wysłać).

Instant Django to
świetny sposób na udostępnienie serwisu nieprogramiście
(np. grafikowi) pod Windows – zawiera, w jednej paczce, 2.5, django, sqlite, dość sensowny edytor tekstu i
parę skryptów które odpowiednio konfigurują środowisko. Wystarczy
dodać skrypt uruchamiający serwer (z syncdb przed startem), nauczyć
grafika korzystać z TortoiseSVN
i już, właśnie załatwiliśmy stronę techniczną współpracy.

FeedParserFeedJack – świetne biblioteki do
obsługi RSS, używałem
ich już wcześniej w Planemoo. Tym razem FeedParser przydał się też do
czyszczenia kodu HTML wpisywanego przez autora komiksu: ze względów
bezpieczeństwa serwis usuwa część konstrukcji.

Cssutils
– podobnie jak w przypadku HTML, możliwość wpisania
dowolnego kodu CSS to dziura bezpieczeństwa ze względu na @import i
javascript w adresach. Sam cssutils nie potrafi tego wyczyścić, ale
wystarczyło utworzyć własną podklasę CSSSerializer, żeby usunąć i
@import, i podejrzane adresy:

 
URL_WITH_CALL_RE = re.compile(r'^url[(]["\']https?://\S+$')
 
class SanitizingSerializer(cssutils.CSSSerializer):
    """
    Overrides some stuff in CSSSerializer to make it safer.
 
    1. disallow ALL URLs not starting with 'http://' or 'https://'
    2. remove @imports
    """
 
    def do_css_CSSValue(self, cssvalue):
        if cssvalue and isinstance(cssvalue, CSSPrimitiveValue):
            if cssvalue.primitiveType == CSSPrimitiveValue.CSS_URI:
                if not URL_WITH_CALL_RE.match(cssvalue._value):
                    return u'url("")';
        return super(SanitizingSerializer, self).do_css_CSSValue(cssvalue)
 
    def do_CSSImportRule(self, rule):
        return u''
 
cssutils.setSerializer(SanitizingSerializer())
 

Django zawiera bibliotekę do komentarzy, bardzo przydatną ale z
paroma ograniczeniami; przeszkadzał mi, przede wszystkim, ścisły
rozdział komentarzy użytkowników zalogowanych i anonimowych, w
praktyce uniemożliwiający dyskusję między jednymi a drugimi. Tutaj
poszukiwania innej biblioteki niestety nie dało rezultatu, trzeba było
dostosować django.contrib.comments.

Drobiazg, ale jak przydatny: slughifi zamienia "zażółć gęślą jaźń"
na "zazolc-gesla-jazn", więc jest wersją funkcji slugify, mądrzejszą o
znajomość wielu znaków narodowych, w tym cyrylicy.

Musiałem też nieco rozbudować własną bibliotekę do obsługi tłumaczeń,
django-multilingual;
eksperymentalne zmiany okazały się bardzo przydatne więc niedługo znajdą
się też w wersji publicznej.

Napisałem też trochę kodu wspomagającego testy modułowe Django,
teraz duża część moich testów wygląda tak:

 
def test_adding_a_comic(self):
    self.login()
    self.get('/')
    self.click('m-your-account')
    self.click('publish-now')
 
    self.click('cancel')
    self.assertLocation('/account/ed/')
 
    # okay, now go and publish it
    self.click('publish-now')
    self.assertContains(self.response, 'name="short_name"')
    self.assertContains(self.response, 'name="main_language_id"')
    self.assertContains(self.response, 'name="add" value="save"')
 

Gdzie 'm-your-account' i 'publish-now' to identyfikatory (nie tekst!)
odsyłaczy na stronie; oczywiście każdy click przechodzi do strony
wskazywanej przez dany odsyłacz. Pozwala to łatwo przetestować całe
sekwencje zdarzeń, i to w sposób niezależny od aktualnie włączonej
wersji językowej interfejsu.

A za miesiąc, wszystko na to wskazuje, coś bardziej skomplikowanego :)