Można dodawać komentarze, z podglądem na żywo. Zanim zostaną pokazane muszą przejść moderację (patrz tu i tu). Standardowo zapraszam do testów pod adresem krzaq.cc:8080.
Tak na dobrą sprawę można to już uznać za kompletny MVP.
The next gen of old-school blogging
Można dodawać komentarze, z podglądem na żywo. Zanim zostaną pokazane muszą przejść moderację (patrz tu i tu). Standardowo zapraszam do testów pod adresem krzaq.cc:8080.
Tak na dobrą sprawę można to już uznać za kompletny MVP.
Byłem szczęśliwy gdy szybkie google’owanie pokazało mi atrybutu formaction dla html-owych form. Niestety, podczas dzisiejszych testów zgodności (ręcznych) z linksem okazało się, że ten atrybut jest przez niego kompletnie ignorowany. Tak samo zachowują się pozostałe konsolowe przeglądarki (lynx, w3m) oraz prosta przeglądarka GUI: Dillo.
Wobec tego następujący kod będzie musiał zostać zmodyfikowany, wraz z metodą obsługującą POST w danej ścieżce:
button(type="submit", formaction='/preview_comment') preview! button(type="submit", formaction='/send_comment') send |
Dzięki temu wszystkie wyszukania (po tagach, językach, autorach, etc) będą bardzo szybkie. Sama implementacja widoczna jest tutaj. Niestety, nie obyło się bez drobnej duplikacji kodu (“done is better than perfect”), którą trzeba będzie usunąć. Na szczęście nie będzie z tym wiele roboty.
Na maszynie testowej czas generowania listy spadł z 6ms do standardowych ~200µs.
Przy okazji miałem okazję pobawić się z variadic templatkami w D…
Dziś tak bardziej o C++. Dość często widzę kod mający w zamierzeniu obsługiwać macierze wyglądający mniej więcej tak:
int** matrix = new int*[h]; for(int i = 0; i < h; ++i) { matrix[i] = new int[w]; } |
Pomijając nawet kwestię wydajności (to taka macierz JP na 100%, gdzie P to Prefetch), jest to okropny kod. Korzystanie z nagiego new i delete to antyidiom w C++ (szczególnie delete, szerzej opisałem to n.p. tutaj). Jest to:
Jestem w trakcie dodawania możliwości komentowania. Baza już gotowa, muszę jeszcze dorobić obsługę dodawania, moderowania i wyświetlania komentarzy. Ale już teraz działa podgląd na żywo tego jak komentarz będzie wyglądał. Wystarczyło podpiąć REST-owe API do prostego skryptu w js.
Efekt jest całkiem zadowalający1:
Ten wpis jest niepowiązany z Pierunem, jest to swoista notatka dla mnie. Dość często zdarza się, że googluję tę samą rzecz (może napisanie tego pozwoli mi na lepsze przyswojenie wyniku poszukiwań – zawsze tego samego): jak zmusić Ruby’ego do wykonania pewnych działań wyłącznie jeśli dany skrypt został włączony bezpośrednio, a nie poprzez require z innego skryptu. Inaczej mówiąc, szukam alternatywy dla tytułowego idiomatycznego kodu w Pythonie:
if __name__ == '__main__': foo() |
Na szczęście w Rubym jest to równie proste:
Wszystkie powtarzające się wywołania HQL zostały przeniesione do jednego szablonu. Dzięki temu klasa DBCache całkiem przyjemnie teraz wygląda.
Na przykład obsługa ustawień stała się trywialna:
Pisząc kolejne metody do cache DB ciężko było nie zauważyć, że znaczna część ich kodu się powtarza. Z tego powodu utworzyłem szablon CacheElement (nazwa robocza).
Jednocześnie operacje na samej bazie przeniosłem do osobnego szablonu DBElementDriver (nazwa jeszcze bardziej robocza), który jest odpowiedzialny za wykonywanie odpowiednich zapytań w bazie danych. Parametrami tego szablonu są: klasa elementu oraz nazwa pola odpowiadającego za klucz.
Dopisałem kod tworzący kanały RSS. Na razie jest to wersja alpha – tylko dla wersji językowych (np: http://krzaq.cc:8080/rss/lang/en). Następnym zadaniem będzie dodanie RSS dla tagów, a przyszłościowo – dla komentarzy. Niemniej jednak, MVP zbliża się wielkimi krokami.
Commit odpowiedzialny za to można znaleźć tutaj: [link]
Właśnie dostałem automatyczne życzenia urodzinowe na forum, gdzie jako dzień urodzin podałem 31. lutego. Być może mieli jakąś walidację po stronie klienta za pomocą javascriptu, ale jako dumny użytkownik NoScripta nawet tego nie zauważyłem.