Links, lynx, w3m i dillo nie wspierają dostatecznie HTML5

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

dbcache.d umie już cache’ować listy

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…

Prosty widok na macierz 2D w C++

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:

  • niewygodne: kłopotliwa inicjalizacja, kolejność rząd/kolumna wymaga sprawdzenia sposobu inicjalizacji,
  • niebezpieczne: brak RAII, trzeba pamiętać o odpowiednim zwolnieniu zasobów, można niechcący nadpisać wskaźnik jednego rzędu innym rzędem,
  • niezgrabne: nie ma żadnego mechanizmu upewniającego, że wszystkie wiersze (lub kolumny) macierzy będą tej samej długości.

Ruby a if __name__ == ‘__main__’:

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:

Refaktoring dbcache.d rozpoczęty

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.