wMiastoWzięci.pl potrzebują trochę uwagi

W rzeczy samej, serwis wmiastowzieci.pl potrzebuje cokolwiek więcej uwagi. Po niezbyt przyjemnych (i mało produktywnych) przejściach z Google AppEngine przyszedł czas, żeby poświęcić trochę czasu tradycyjnym aplikacjom, a wmiastowzieci.pl to aplikacja tradycyjna aż do bólu: Django, FastCGI i MySQL (do tego parę drobiazgów).

Obiecuję sobie, że w najbliższym czasie trochę nad tym serwisem popracuję.

wMiastoWzięci.pl na (niejakim) zakręcie

W związku z nadciągającą zimą finansową w IT (wszyscy przepowiadają, że rok 2009 będzie ciężki, tak jak był 2000 — a ja nie mam powodu, żeby nie wierzyć), wMiastoWzięci.pl w najbliższym czasie pozostaną moim prywatnym projektem, częściowo (prawdopodobnie w całkiem sporym zakresie) edukacyjno-eksperymentalnym. Hostowany będzie tak, jak dotychczas, tzn. na najtańszej opcji na djangohosting.ch, więc w wypadku znaczącego pogorszenia wydajności (np. z powodu nagłego zainteresowania serwisem) niczego nie będę dokładał za pieniądze (procesy, pamięć, storage). Lepiej, żeby było to jasne już teraz.

Przez ten rok (co najmniej, bo może być i dłużej) zamierzam zrobić tam kilka rzeczy, ale bez ustalania jakiegoś sztywnego grafiku, bez liczenia wersji i określania terminów:

  • oceny zawartości;
  • personalizowane powiadomienia o zmianach w zawartości;
  • uproszczenie procesu dodawania wydarzeń;
  • ponowne przemyślenie architektury informacji, bo trochę się pogubiłem...;
  • przejście od wydarzeniocentryczności do miejscocentryczności;
  • reorganizacja zawartości wyświetlanej na stronie początkowej serwisu;
  • nowy wygląd, lepiej dopasowany do charakteru serwisu;
  • może jeszcze kilka drobiazgów...

Jak widać, nie ma tego wiele, ale też nie zamierzam spędzać nad tym serwisem wiele czasu — moja córka dorasta w szybkim tempie i wymaga coraz większej uwagi. Na tyle, na ile będę mógł poświęcić na niego czas, będę coś tam dłubał, ale na pewno nie będę urządzał wyścigu do funkcjonalności, ani nie będę śledził działań konkurencji tylko po to, żeby być na czasie, ani tym bardziej o krok dalej. Nowe funkcje się pojawią, błędy będą poprawiane, serwis będzie rósł — w oczekiwaniu na lepsze czasy.

Markdown dla grzecznych

Markdown to fajny wynalazek, ale zaskakująco niebezpieczny i to w miejscu, którego zwykle się nie spodziewamy... Wspomniał o tym jakiś czas temu Jeff Atwood przy okazji jakichś innych wynurzeń. Utkwiło mi to bardzo mocno w pamięci, pewnie dlatego, że kiedyś zdarzyło mi się popełnić aplikację podatną na XSS. Tak, nieumiejętnie (nazwałbym to bezmyślnie, ale nie jest moim zamiarem itd.) zastosowany markdown wystawi na niebezpieczeństwo także i Twój serwis. Zastanawiam się nad tym, jak zastosować do zmyślnie, bo chciałbym użytkownikom wMiastoWzięci.pl dać do ręki coś, co im się przyda, a jednocześnie nie pozwoli im na wyrządzenie żadnych szkód (obojętne, umyślnie czy nieumyślnie).

Pewnym rozwiązaniem mogłoby być oczyszczenie tekstu źródłowego przed zapuszczeniem na nim filtra markdown — ale to trochę przypomina wylewanie dziecka z kąpielą, bo wyłącza część użyteczności markdown. Z drugiej jednak strony, rozwiązanie Jeffa A. (czyszczenie tylko części HTML) nie wydaje mi się rozsądne, przede wszystkim z powodu ogromnego skomplikowania zagadnienia. Czyżby była to sytuacja bez wyjścia?

Lighty na ratunek ortografii

Zdarzyło się tak, że zrobiłem literówkę w urlconfie i stało się, Google zaindeksowało mi stronę pod błędnym url-em. O ja nieszczęsna, ale przecież zdarza się w najlepszej rodzinie. Trzeba było zmontować jakiegoś redirecta. Co prawda Django ma jakąś swoją aplikację do redirectów (django.contrib.redirects), ale przecież nie o to chodzi, żeby Django robiło wszystko, skoro to taka drobnostka — przecież każdy serwer http ma coś do robienia redirectów, Lighttpd nie jest żadnym wyjątkiem. Trochę nad tym posiedziałem (bo orłem z wyrażeń regularnych to ja nie jestem...) i działa jak złoto:

$HTTP["host"] =~ "(^|\.)wmiastowzieci\.pl$" {
    url.redirect = (
        "/miajsca/$" => "/miejsca/",
    )
}

Żeby było ciekawiej (choć to babol i w nowszym lighty będzie zmienione), lighty w tym momencie wysyła 301 (czyli permanent redirect) co akurat w moim przypadku robi dobrze, bo nie zamierzam więcej popełniać tej literówki. :)

Czas się ujawnić

To uczucie nieporównywalne z niczym: budujesz aplikację przez kilka tygodni lub miesięcu i przez cały czas zastanawiasz się czy ktoś będzie tego używał?. W takiej niepewności trwasz dopóki nie zauważysz, że jednak ktoś zdecydował się jej użyć, a wtedy... No i wtedy właśnie przychodzi ten strzał adrenaliny, który mogę porównać tylko z paroma rzeczami (niestety, nie mogę napisać, co to za rzeczy, bo każda z nich jest albo szkodliwa albo zakazana przez prawo — tę stronę przecież czytują dzieci...). Dziś rano spojrzałem w panel administracyjny jednego z moich prywatnych serwisów i poczułem właśnie TO.

Pomimo trzymania aplikacji w niemal całkowitej tajemnicy do czasu ukończenia prac (wiedziała o niej tylko moja żona i Google, o ile ktoś wiedział czego ma szukać), ktoś zajrzał na wMiastoWzięci.pl i dodał wydarzenie (choćby z tego powodu warte uwiecznienia). Nie będę tego ukrywał dłużej, to mój serwis. Wciąż jeszcze jest szlifowany, wciąż nie wszystko w nim działa, ale jak widać komuś to nie przeszkadzało. Co nie działa:

  • zgłaszanie obiektów (wydarzenia, zdjęcia, recenzje) do moderacji
  • komentarze do wydarzeń i miejsc
  • przeglądanie wielu etykiet na raz

Dla spragnionych informacji technicznych: serwis działa na Django-trunk, baza to MySQL 5.0 (z backendem MyISAM), deployment na FastCGI/lighttpd.

A skoro już poszło w świat, to skończył się luźny czas developmentu w modelu langsam, langsam i trzeba w szybkim tempie dorobić brakujące funkcje serwisu. ;)