Serwis demotywatory.pl jest w naszym kraju bardzo popularny. Ja również darzę go sympatią. Jest jednak pewien szkopuł — feed RSS. Niestety przeglądanie demotywatorów z poziomu Google Readera jest niezwykle męczące, ponieważ feed nie zawiera obrazków — trzeba rozwijać wpis, klikać na link, przeskakiwać do właściwego serwisu, wracać spowrotem — można się szybko zniechęcić. Mam dla Was jednak dobrą nowinę:
Wykonałem wersję ulepszoną — która ów obrazki zawiera
Zapraszam do subskrybowania: http://nme.pl/demotywatory/feed.
Ten feed może nie zaspokoić osób które non stop siedzą na demotywatorach, ponieważ wprowadza pewne opóźnienie — z drugiej strony jednak — dla tych którzy przeglądają je raz na jakiś czas powinien okazać się znacznie wygodniejszy niż standardowy. Miłego korzystania!
W rok 2011, blog nme.pl wchodzi z nowym silnikiem napisanym w Django! Napisanie go zajęło mi mniej więcej tydzień. Napisałem go całkowicie od podstaw — nie korzystałem z już istniejących silników. Osobiście jestem bardzo zadowolony z efektów. Blog jest na chwilę obecną dwujęzyczny, napisałem do niego już trzy pluginy — uploadowanie plików, tworzenie redirectów oraz wykrywanie uszkodzonych wewnętrznych linków. Napisałem sobie też widgety obsługujące RSS i wyszukiwanie w obrębie konkretnych kategorii (wykorzystałem Haystack).
Większość wpisów jest już dostępna, te, których nie ma, a niosą za sobą jakąś wartość — niebawem się pojawią. Poprawiłem nieco niektóre wpisy. Migrację komentarzy wykonam z pewnym opóźnieniem. Tagi dodam również z lekkim opóźnieniem. Jeśli ktoś z Was chciałby jeszcze zerknąć na starego, Wordpressowego bloga zapraszam pod adres prev.nme.pl (może tam niestety brakować obrazków itp, jednak wszystko powinno być tutaj — jeśli jakiś materiał jest niedostępny zarówno na starej jak i nowej wersji bloga — proszę o kontakt ze mną).
Życzę Wam wszystkiego dobrego w Nowym Roku!
Aktualizacja (śro, 16 lut 2011, 20:41:00 CET):
Przez ostatnie półtorej miesiąca nieco dopieściłem silnik bloga. Niedawno np. pochwaliłem się feedem demotywatory.pl — który jest również dostępny z poziomu Django Admin. Dodałem jednak również kilka innych rzeczy — ogólnie — zarządzanie feedami atom/rss, własne bookmarki, bardzo wygodny notatnik oraz wysoko dostosowany do moich potrzeb — dziennik spraw bieżących. W związku z tym, przedstawię screeny pokazujące jak ja ten blog widzę 
Strona główna Django Admin:

Wpisy:

Sprawy bieżące:

Zapomniałem zrobić screena edycji posta — najważniejszej rzeczy, dorzucę niebawem — powiem póki co, że edycję wspomaga rewelacyjnie customizowalny markItUp!.
Nie wiem czy każdy z Was wiedział o tym, że komunikator Facebooka jest zgodny z XMPP, czyli otwartym protokołem komunikatorów. Taka wiadomość obiegła jakiś czas temu blogosferę, ale jakoś mnie osobiście to umknęło. Z drugiej strony niewielu blogerów zadało sobie trud sprawdzenia jak zostało to zaimplementowane i co nam ta usługa tak naprawdę oferuje. Ja sprawdziłem i mam dwie wiadomości — dobrą i złą.
Więc po kolei:
Zła — na chwilę obecną wsparcie dla protokołu, które oferuje nam Facebook jest w mojej opinii zbyt słabe, aby korzystać z niego na codzień. Dlaczego? Ponieważ aby zalogować się do swojego konta konieczne jest wyłączenie szyfrowania oraz usługa jest zamknięta dla Jabberów zewnętrznych — nie dodamy kontaktów np. z Google Talk.
Dobra — aby aktywować konto, należy przebrnąć przez w miarę przyjemny proces, który umożliwi nam założenie sobie identyfikatora tekstowego. Ów identyfikator staje się częścią JID'a oraz staje się aliasem do naszego profilu, np. http://facebook.com/imie.nazwisko.
I właśnie tylko z powodu tej drugiej wiadomości — uważam, że warto spędzić chwilę i skonfigurować sobie konto Jabbera na Facebooku. Na używanie konta, przynajmniej w moim wypadku — przyjdzie kolej kiedy indziej, ale z aliasu do swojego profilu już można będzie korzystać 
Jeśli ktoś chciałby jednak skorzystać z rozsądniejszej implementacji Jabbera — polecam Google Talk. Pidgin jako komunikator dostępny jest również pod Windows.
W poprzednim wpisie opowiedziałem o tym, jak dzień po dniu, w dwa i pół tygodnia zrealizowałem startup — serwis z przepisami. Wspomniałem również, że przybliżę jak serwis wygląda "od kuchni" 
Nie mam ostatnio zbyt wiele czasu ponieważ kończę jeden projekt, o którym już niebawem napiszę, ale jako, że nie rzucam słów na wiatr — chciałbym Wam dzisiaj przedstawić jak wygląda interfejs Django Admin aplikacji w serwisie kuchnia.chwila-dla-siebie.pl.
Myślę, że ten wpis może być pomocny dla osób, które omijają Django Admina tworząc własne interfejsy administracyjne z obawy, że niektórych rzeczy w tym interfejsie nie będą w stanie zrealizować.
Zmiany kodzie startupu
Od poprzedniego wpisu wprowadziłem w kodzie aplikacji trzy proste zmiany:
- dodałem dodatkowe widgety z Facebooka i zrównolegliłem ich wyświetlanie (obecnie ładowane są przez JavaScript, kiedy content na stronie jest już gotowy przez przeglądarkę do wyrenderowania)
- w Django Adminie dodałem podgląd przepisów na podstronie z listą przepisów
- wyszukiwanie przepisów jest obecnie cache'owane za pośrednictwem memcache'a — dzięki temu jedynie pierwsze wyszukanie konkretnej frazy trwa dłuższy czas — następnie w trakcie stosowania pagera wykorzystywany jest cache. Czas renderowania stron przez aplikację po stronie serwera spadł dzięki temu o 700%
Box administratorów
Zalogowany użytkownik ma dostępne na stronie box ze skrótami. Jeśli użytkownik jest superuserem, skrótów jest o jeden więcej, ponieważ aplikacja ma zaimplementowane dwie instancje Django Admina — podstawową — do obsługi przepisów oraz dodatkową — do administracji użytkownikami z dostępem do historii przepisów. Członkowie zespołu mają też domyślnie ukryte reklamy.
Panel superadmina
Na stronie Django Admin dla superusera, dostępu do przepisów de facto nie ma, są natomiast pozycje umożliwiające analizę historii zmian w przepisach, dodawanie i edycję newsów oraz użytkowników. Widoczne są tu również statystyki memcache'owania wyników wyszukiwania.
Historia modyfikacji przepisów
Bardzo wygodny interfejs, którego tworzenie dostarczyło mi bardzo dużo dobrej zabawy. Właśnie w takich sytuacjach Django pokazuje jak wiele ma developerowi do zaoferowania.
Podstawowy Django Admin
Interfejs dla zwykłych użytkowników, mających status staff został przedstawiony poniżej. Tworzyłem go tak, aby członkowie zespołu mieli dostępne skróty do najpotrzebniejszych filtrów. Dzięki temu nie jest potrzebne żmudne ich wyklikiwanie. Podstawowy filtr (niezweryfikowanych przepisów) jest z tego co pamiętam niemożliwy do wyklikania 
Kategorie
Zarządzanie kategoriami z wyliczaniem ile przepisów procentowo zostało już zweryfikowanych:
Przepisy
Interfejs do obsługi przepisów zrealizowałem w następujący sposób:
Edycja przepisu
Edycja konkretnego przepisu — to co jest potrzebne jest widoczne na jednej, zwięzłej stronie — nie ma potrzeby żadnego przewijania ekranu:
Podgląd przepisów
Jak wspomniałem wcześniej — podczas weryfikacji przepisów stwierdziłem, że przydałby się jeszcze jeden prosty ficzer — podgląd przepisu po najechaniu na linka. Zrealizowałem to w następujący sposób:
Mam nadzieję, że warto było na ten wpis chwilkę poczekać
Zrealizowanie takiego interfejsu jaki przedstawiłem jest bardzo proste, a społeczność Django jest bardzo otwarta — większość z przedstawionych modyfikacji jest bardzo dokładnie opisana zarówno na stronach z dokumentacją na stronach dokumentacji djangoproject.com oraz na stackoverflow.com który jest skarbnicą rozwiązań ciekawych problemów.
Jeśli macie jakieś sugestie, pytania bądź uwagi — zapraszam do skomentowania wpisu!
Słowo wstępu — będąc na urlopie odwiedziłem rodzinne strony. W międzyczasie wylegiwania się na słońcu i robienia kilometrów na rowerze, namówiłem moją mamę do zmianę podejścia do publikacji treści w Internecie. Ma ona dużo pomysłów, content generuje ciekawy i unikalny, po różnych stronach go rozmieszcza, ale nie ma z tego żadnych korzyści. Wszystko co publikuje w różnych serwisach jest własnością tych serwisów. Strata czasu. Postanowiliśmy, że podzielę się moim hostingiem, na którym mam dużo wolnego miejsca i będzie mogła sobie zacząć w normalny sposób blogować — w Wordpressie. Musiałem tylko wymyślić nazwę domeny... I wymyśliłem. 
W sobotę 31 lipca kupiłem domenę chwila-dla-siebie.pl. Coś poszło nie tak i strefa w DNSie po stronie panelu administracyjnego mojego providera się nie utworzyła jak należy. Konfiguracja DNS'ów musiała więc poczekać do poniedziałku, kiedy ostatecznie zgłosiłem błąd i został on rozwiązany ręcznie.
Pomysł i realizacja
Kiedy oczekiwałem na dostęp do strefy, przypomniało mi się, że 10 lat temu pewien człowiek na swojej stronie z przepisami kucharskimi obwieścił wszem i wobec, że stronę zamyka, zabiera swoje wiaderko, grabki i opuszcza piaskownice. Stwierdziłem wtedy, że szkoda, żeby się to wszystko zmarnowało, bo korzystałem z tej strony czasami. Cała strona przeleżała u mnie w archiwach jakieś 10 lat. Jako dodatek do bloga, stwierdziłem, że taka strona z przepisami będzie strzałem w dziesiątkę... i zacząłem pisać... 
Po ponad dwóch tygodniach aplikacja prezentuje się następująco:
Poniżej zamieszczam loga dzień po dniu jej tworzenia
dzień 1, niedziela
- Napisałem pierwotną wersję parsera do przepisów, analizujący dokumenty html i wypluwający łatwiejsze do przetwarzania za pomocą wyrażeń regularnych pliki tekstowe. Okazało się, że dysponuję 6182 przepisami.
- Przygotowałem sobie szkielet aplikacji. Wykorzystałem do tego kod mojego bootstrapa Django / JavaScript / CSS (link do opisu na innym moim blogu, w języku angielskim) — zwłaszcza Buildera JavaScript. Dla interfejsu użytkowników wykorzystałem mój bazowy template — z layoutem pionowym (nagłówek, treść, stopka).
dzień 2, poniedziałek
- modele — przygotowałem modele dla kategorii i przepisów i spędziłem trochę czasu na dopracowanie wyświetlania tych informacji w panelu admina Django.
dzień 3, wtorek
- Zdeployowałem aplikację na serwerze. Przygotowałem konfigurację serwera www, wrzuciłem sztampowe template'y do wyświetlania błędów. Aplikacja póki co działała na screenie, a serwer WWW obsługiwał zapytania jako reverse proxy.
dzień 4, środa
- Dodałem layout poziomy (kategorie, przepisy, sidebar). Strona dostosowuje swój rozmiar do szerokości okna przeglądarki, chyba, że jest ona mniejsza niż zadeklarowana minimalna szerokość.
dzień 5, czwartek
- Napisałem sobie kod do obsługi paginatora przepisów i opisałem to w poprzednim wpisie
dzień 6, piątek
- Zaimplementowałem wyświetlanie kategorii, paginację przepisów i wyświetlanie konkretnego przepisu.
dzień 7, sobota
- Napisałem obsługę wyszukiwania przepisów. kod póki co nie jest specjalnie wydajny, ale został napisany tak, aby zastosowanie cache'owania było proste.
- Zrobiłem też prosty, brzydki design dla layoutu. Jakieśtam obrazki, żeby strona nabrała kształtów, które mnie osobiście dają motywację do dalszej pracy.

dzień 8, niedziela
- Dodałem templatkę do dodawania przepisów i jej obsługę, następnie uzupełniłem obsługę o mailowanie do mnie przez aplikację informacji o nowym przepisie.
- Dodałem do przepisu przyciski "lubię to" z Facebooka i "dodaj na Śledzika".
dzień 9, poniedziałek
- Trochę się przyłożyłem, pomyślałem i narysowalem nowy design dla layoutu. Narysowałem kilka podstawowych backgroundów i ustawiłem je w css'ie. Wyszło wystarczająco zadawalająco, żebym mogło tak zostać

dzień 10, wtorek
- Podzieliłem logo na dwie części i poprawiłem je od strony kodu — chciałem aby po wyłączeniu styli, dokument wyglądał tak jak powinien (tagi h1).
- Dodałem model News'ów, dodałem możliwość edycji do interfejsu Django Admin, news początkowo wpisany w templatkę przeniosłem do skryptu inicjalizującego bazę, a do templatki wstawiłem kod wyświetlający Newsy z bazy. To akurat pamiętam, bo całe mieszanie z newsami zajęło mi tyle ile trwały Fakty na TVN'ie

- Zrobiłem trochę porządków w modelach, dodałem obsługę vars'ów i memcache, również z mojego frameworka, które wcześniej uznałem za tymczasowo zbędne.
dzień 11, środa
- Wyczyściłem bazę i zaimportowałem ponownie przepisy. Założyłem też konto mojej koleżance (którą z tego miejsca gorąco pozdrawiam
), która pomogła mi tego dnia sprawdzić 150 przepisów 
- Dodałem osoby które to lubią z Facebooka (ta większa wersja, z ryjkami) do strony głównej.
dzień 12, czwartek
- Dodałem funkcjonalność zapisywania historii zmian w przepisach z interfejsem dla superusera w Django Adminie, umożliwiającym przeglądanie wprowadzonych zmian i ich cofania (Undo).
dzień 13, piątek
- Zarejestrowałem się w jednej z sieci afiliacyjnych, a następnie w jednym z programów partnerskich. W międzyczasie weryfikowaliśmy kolejne przepisy, których było już 320.
- Dodałem reklamę z Google Adsense, przycisk "Share" z Facebooka.
- Wrzuciłem też na stronę favicona.
dzień 14, sobota
- Weryfikacja kolejnych 100 przepisów.
- Usunąłem z głownej Facebookowe osoby które to lubią, założyłem kuchni stronę na Facebooku i dodałem "Like Boxa" do ów Facebookowej strony.
- Dodałem do strony kod śledzenia Google Analytics oraz dodałem stronę do Google Webmaster Tools
dzień 15, niedziela
- Zmieniłem obsługę aplikacji przez serwer WWW, obecnie pracuje jako wsgi. Bawiłem się też w zmienianie Suzuki Hayabuzy we włochatego potwora w Gimpie (efekty pracy udostępnione na moim profilu Facebookowym
)
dzień 16, poniedziałek
- Gimp i przygotowanie trzech obrazków reklam do sidebara. Wrzuciłem obrazki na serwer, przygotowałem szkielet modułu adbox, który zawierał tablicę z reklamami i parametrami ich wyświetalnia i zaimplementowałem statyczne wyświetlanie losowej reklamy z tablicy.
dzień 17, wtorek
- Napisałem fadera do reklam w javascripcie, który dzięki wspomnianemu na początku bootstrapowi, eksportował mi je z pythona za pomocą jsona do javascriptu, automagicznie się includował, rozpoznawał które to reklamy ma animować, a następnie je animował
Chodziło mi to po głowie od jakiegoś już czasu, coś podobnego ma Allegro na głównej.
A tymczasem...
W międzyczasie oczywiście chodziłem do pracy i robiłem tam inne rzeczy. Musiałem też trochę czasu poświęcić mojemu samochodowi, który w trakcie tych dni ucierpiał przed parkingiem pod pracą, bo w moje drzwi wjechało Mondeo. Spisywanie, telefony, oględziny, lakiernik, pisma itp. Straszne pożeracze czasu. No ale dałem radę.
Acha, i spałem. 
Startup nie startup
Zdaję sobie sprawę, że specjaliści od Web 2.0 i social networkingu, np. Grzegorz Marczak z Antyweb'a prawdopodobnie mieliby zastrzeżenia do określania tej aplikacji mianem startupu, a gdyby miał go na swoim blogu opisywać, zebrałbym jako autor więcej batów niż ta aplikacja ma linijek kodu, ale co tam.
Wszystkich Was na stronę aplikacji serdecznie zapraszam — jest ona dostępna pod adresem kuchnia.chwila-dla-siebie.pl (oraz jako skrót z tej domeny: nme.pl/kuchnia).
W następnym wpisie przedstawię jak wygląda obecna konfiguracja panelu Django Admina aplikacji.