Mawiają, że przyzwyczajenie jest drugą naturą człowieka. Sprawia ono, że bezwiednie (albo nawet bezmyślnie) wykonujemy pewne czynności. Niekiedy to jest dobre - np. z przyzwyczajenia myjemy dłonie po skorzystaniu z toalety, nawet jeśli ich nie obsikaliśmy. Niestety, czasem mimowolność przyzwyczajeń sprawia, że ludzie dokładają sobie zbędnej roboty, np. pisania kodu, który nie ma sensu. Samo pisanie jeszcze nie jest złe, gorzej, że później ktoś taką radosną twórczość musi czytać i utrzymywać. Tak zazwyczaj dzieje się w przypadku wzorca Repozytorium.

Zadaniem, które wziąłem na warsztat w poprzednim tygodniu, była refaktoryzacja obsługi optimistic concurrency. Do tej pory obsługa konfliktu wersji przy aktualizacji rekordu była obsługiwana za pomocą wyjątku rzucanego z serwisu i łapanego w filtrze MVC. To oczywiście był błąd projektowy, bo przecież wystąpienie optimistic concurrency to spodziewany efekt edycji rekordu, a nie żaden wyjątek. Poprawiając to, stwierdziłem że dobrze będzie przy okazji w ogóle poprawić komunikację na linii serwis-kontroler, tak aby wyjątki z aplikacji nigdy nie docierały do GUI.

Wiele razy rożni ludzie dziwili mi się, że “nie lubię Entity Frameworka”. Takie stwierdzenie nie tylko bardzo mija się z prawdą, ale wręcz jest zupełnie pozbawione sensu. Lubić można rosół z makaronem, komplementy i kolor niebieski, ale nie ORMa. To samo zresztą dotyczy innych bibliotek czy języków - technologia to jest coś, czego się używa albo i nie (w zależności od potrzeb, zastosowań i możliwości), nie obiekt uczuć. Co do EF zaś - mam po prostu bardzo wiele argumentów za tym, żeby go nie używać. Postaram sie je wymienić w tym krótkim wpisie.

Kilka dni temu ogłosiłem nadzieję na zakończenie moich zmagań z Bootstrap Datepicker. Jak wiadomo, nadzieja jest matką głupich, i dzisiaj musiałem wrócić do tego tematu przy okazji naprawiania dat w gridzie. Po ostatnich zmianach zauważyłem, że daty w kolumnach wyświetlane są w amerykańskim formacie, zaś wyszukiwanie nie działa.

W życiu wielu ludzi nadchodzi taki moment, że mają dość mieszkania z rodzicami/teściami/pod mostem i postanawiają wziąć kredyt na mieszkanie. Mnie również się to przydarzyło. Niestety, branie kredytu wiąże się z kontaktem z bardzo zbiurokratyzowanymi instytucjami - bankami, które wymagają dostarczenia różnych dokumentów, potwierdzeń i zaświadczeń. Zazwyczaj jest to łatwe, mi jednak dostarczyło niesamowitych przygód.

Gdy pod koniec 2013 roku zaczynałem pracę nad swoim frameworkiem, jednym z najważniejszych wyborów, które musiałem podjąć, był wybór kontrolki grida. Po przeanalizowaniu dostępnych rozwiązań, zdecydowałem się na jqGrid. Wydawał się prosty w obsłudze i miał dobre wsparcie po stronie serwerowej ASP.NET MVC (tzn. builder i model binder). Do tego był darmowy. No właśnie - tu jest problem - BYŁ. Od grudnia 2014 przestał być dostępny na licencji MIT, i z tego powodu stanąłem przed koniecznością zamiany go na coś darmowego.

To trzecia i (mam nadzieję) ostatnia część moich przygód z kontrolką daty w PizzaMVC. Tym razem musiałem naprawić problem związany z polskim zapisem daty wynikający z ewidentych błędów Microsoftu w .NET Framework. A przy okazji napisałem najdłuższy program w Javie w swoim życiu.

Bootstrap datepicker pojawił się w PizzaMVC przy okazji migracji z ASP.NET MVC 4 na 5. Ponieważ wersja 5 standarodowo korzysta z Bootstrapa, musiałem wymienić poprzednie kontrolki (pochodzące z jQuery UI) na coś kompatybilnego z Bootstrapem. Wtedy zrobiłem to pod presją czasu, wrzucając luźno pliki JS i podpinając je po linii najmniejszego oporu. Teraz przyszła pora na poprawki.

To będzie krótki post, ale cudaczność tej biblioteki naprawdę zasługuje na oddzielny wpis. Najprostszą odpowiedzią na tytułowe pytanie jest oczywiście to, że moment.js został napisany w JavaScript, a język ten nie słynie z przemyślanych rozwiązań…

Jak pisałem w poprzednim poście, celem moich ostatnich działań było oddzielenie Pizza.Mvc od Pizza.Framework. Po wydzieleniu modułu Pizza.Utils, był już tylko jeden punkt łączący te dwa moduły - przekazywanie informacji o zalogowanym użytkowniku, do NHibernatowego event handlera, który przeprowadza audyt obiektu przy jego tworzeniu bądź aktualizacji w bazie. Pierwotnie zrobiłem to w niezbyt estestyczny sposób, teraz to poprawiłem i w sumie zastanawiam się, czemu od razu nie zrobiłem dobrze.