Przesiadka z Wordpressa na Pretzel

blog

Przesiadka z Wordpressa na Pretzel

Dzisiaj postanowiłem coś zrobić ze swoim blogiem. Podoba mi się prostota statycznych generatorów. Pełna kontrola nad wypluwanym kodem html. Do tego łatwość modyfikacji oraz szybkość działania. Wszystko to bez żadnej bazy danych. Pisanie nowego posta to po prostu dodanie nowego pliku.

Nie ma oczywiście tu żadnego edytora. Do edycji Twoich postów może być każdy program, który potrafi edytować pliki tekstowe. Ten tekst piszę w Visual Studio Code, ale równie dobrze mogę użyć Worda wraz ze sprawdzaniem składni. :)

Najlepsze jest to, że większość statycznych generatorów obsługuje Markdown. Prostota tego rozwiązania powala i daje niesamowitą elastyczność w pisaniu. Używając Wordpressa musiałem pokombinować co i jak, aby sklecić cały tekst wraz z obrazkami, wstawkami kodu, itd. Tutaj wklejam czysty kod z notatnika i niemalże po kilku małych poprawkach mam sformatowany post.

Pretzel

Sam Pretzel to statyczny generator stron html, który działa na takiej samej zasadzie jak Jekyll, ale jest napisany w c#. Projekt jest open-source i można go znaleźć na githubie.

Składnia taka sama jak w Jekyll, do tego Markdown i w sumie nic więcej do szczęścia nie potrzeba.

Publikacja nowego posta wymaga uruchomienia generatora z linii komend posługując się poniższą (dowcipną) składnią:

    pretzel bake blog.softio.pl

Po wygenerowaniu w odpowiednim katalogu otrzymujemy pliki wynikowe, które wystarczy, że wgramy (zwykłe copy) na nasz serwer.

Jeśli ktoś zastanawia się nad zmianą platformy to szczerze polecam. Na prosty blog dla deva w zupełności wystarczy.

Czy da się żyć bez Reshapera?

produktywność

Czy da się żyć bez Reshapera?

Resharper

Resharper to narzędzie do wspomagania pracy (życia) programisty. Przez jednych wychwalany pod niebiosa. Przez innych - mieszany z błotem. Aby móc coś powiedzieć o tym narzędziu trzeba go trochę poużywać.

Był taki czas, że dawałem sobie radę bez niego. Długo odwlekałem decyzję z zakupem. Między innymi dlatego, że w pobliżu nie znalazł się nikt kto by chciał mi taki zakup zasponsorować (mówię tu o moich poprzednich pracodawcach). Od dłuższego czasu sam jestem sobie pracodawcą, ale wtedy w grę wchodzą względy finansowe. Resharper dla przysłowiowego Kowalskiego tani nie jest. Mimo to, w końcu zainwestowałem. Na początku troszkę trwało zanim opanowałem podstawowe ruchy, czytaj skróty klawiaturowe, choć de-facto sprowadza się tak naprawdę do jednego, mitycznego Alt+Enter. Tak jest, z Resharperem aplikacje pisze się już prosto, wystarczy kilkanaście razy nastukać Alt+Enter i kodzik napisany. ;) Taki żarcik, a na serio nie wyobrażam (nie wyobrażałem) sobie wykonywania większego refaktoringu bez niego.

Resharper jest narzędziem potężnym i z wersji na wersję coraz bardziej rozbudowanym. Niestety za tym idzie jak cień jego ociężałość. Świeże Visual Studio 2015 śmiga aż miło. Zainstalowanie Resharpera spowalnia czas startu studia, czas załadowania projektu, a ostatnio zacząłem bardzo mocno odczuwać także spowolnienie pracy całego środowiska. W szczególności bardzo denerwujące jest to kiedy studio się zacina podczas wykonywania standardowych operacji (przykładowo zmiana nazwy klasy). Żeby nie było, komp świeżo po reinstalacji, takie tam i7 + SSD + 8GB RAM.

Z tego powodu zacząłem się zastanawiać jak by wyglądała moja codzienność bez Resharpera. Niestety natura człowieka jest taka, że jak się przyzwyczai do pewnych rzeczy to później trudno jest się odzwyczaić. Ja na tym polu niczym szczególnym się nie wyróżniam, więc zacząłem szukać tych małych ulepszaczy, z których korzystam na co dzień, ale bez całej reszty bagażu jaką wnosi Resharper. I tak oto stworzyłem poniższą listę "zastępników".

Move Class To File

Bardzo prosty i mały dodatek, dzięki któremu bardzo łatwo jest przenieść definicję klasy do nowego pliku. Na dodatek taki smaczek - rozszerzenie to jest napisane przez Filipa W. Zastępuje funkcję Resharpera, która pozwala na podzielenie jednego pliku z kilkoma definicjami do odpowiadających im oddzielnym plikom. Podpowiedź wywołuje się z podręcznego menu kontekstowego standardowym dla VS skrótem klawiaturowym "Ctrl+.".

Refactoring Essentials

To drugi dodatek, który zastępuje wiele opcji samego Resharpera. Posiada bardzo rozbudowaną listę wspomagaczy. Nie będę się rozpisywał na temat jego możliwości, sprawdźcie sami. Podpowiedź wywołuje się z podręcznego menu kontekstowego standardowym dla VS skrótem klawiaturowym "Ctrl+.".

VS Tricks

Wszyscy, którzy używają Resharpera na pewno wiedzą co to jest Camel Humps. Niestety dodatek nie wspiera wyszukiwania, gdzie wpisuje się duże litery wyrazów składających się na pełną nazwę (na przykład wpisujemy WPE, a Resharper znajdzie WordProcessorExtensions). Za to doskonale działa przeskakiwanie pomiędzy wyrazami będącymi członami dłuższych, wielowyrazowych nazw. Bardzo przydatne podczas edycji kodu. Wymaga własnej konfiguracji skrótów klawiaturowych w ustawieniach VS (standardowo "Ctrl+Left" i "Ctrl+Right").

Productivity Power Tools

Tego dodatku chyba nie muszę opisywać, gdyż dostępny jest od dawna, nawet dla starszych wersji VS. Pomimo zainstalowanego Resharpera zawsze ten dodatek był pod ręką. Lista opcji jest naprawdę spora. Sam dodatek jest stworzony przez "Visual Studio Product Team".

Clr Heap Allocation Analyzer

Tu dodatek odstający od reszty, bo skupia się na problemach związanych z wydajnością pisanego kodu. Odkryłem go dopiero co i szczerze polecam. A dlaczego polecam? Obejrzyjcie video z wystąpienia Bartka Adamczewskiego na warszawskiej grupie .net.

NUnit Test Adapter

Uruchamianie testów to jest coś co mnie najbardziej boli. Wbudowane narzędzie w Visual Studio jest naprawdę skromne. Na szczęście nikt teraz nie tworzy oprogramowania bez CI, więc jest to do przeżycia. Lokalnie odpalam tylko i wyłącznie szybkie testy jednostkowe. Odpowiednie nazewnictwo daje w miarę dobry pogląd na tej prostej liście jaką daje nam studio.

Warto tu jeszcze wspomnieć o kilku usprawnieniach w samym Visual Studio, które także w ostatniej wersji zyskało kilka fajnych opcji wspomagających kodowanie. To także dzięki nim mogę kliknąć "Suspend Now". :)

Find Usages

Ciężko znaleźć poprawnie działający odpowiednik w dodatkach, ale jest fajna opcja w VS. Nazywa się "View Call Hierarchy". Wystarczy ustawić swój znany skrót klawiaturowy - u mnie jest to "Shift+F12" (Find Usages z Resharpera).

Wyszukiwanie

Wyszukiwanie Resharper ma rozwiązane naprawdę koncertowo, ale jak się okazuje Visual Studio też ma się czym pochwalić. Po pierwsze mamy "Ctrl+;", aby wyszukiwać po strukturze projektu. Na dodatek mamy opcję "Navigate To". Pod tą opcję mam podpięty skrót "Ctrl+T" znany z opcji wyszukiwania po typach w Resharperze. :)

Alt+Enter

Co zastępuję Alt+Enter? Visual Studio posiada listę opcji zależnych od kontekstu kryjącą się pod skrótem klawiaturowym "Ctrl+.". Tam też podpinają się niektóre dodatki, o których pisałem wcześniej.

To chyba na razie tyle. Jak coś mi się przypomni to wrzucę update. Studio teraz działa mi o wiele sprawniej i praca jest przyjemniejsza.

Jeśli znacie jakieś inne fajne dodatki/nieznane opcje VS to dajcie znać w komentarzach. :)

PS 1

Ja wiem, że mamy tu do czynienia z sytuacją typu "coś za coś". Każdy patrzy na to pod swoim kontem. Ja wybieram wydajne środowisko. Po za tym poczytajcie co o narzędziach takich jak Resharper ma do powiedzenia Mark Seemann. Można popaść w lekką zadumę ;)

PS 2

Resharpera nie odinstalowałem całkowicie. On cały czas tu jest, ale wyłączony. Wystarczy kliknąć w ustawieniach przycisk "Suspend Now", o którym wspominałem powyżej. Może się przydać kiedy będę musiał dokonać większej modyfikacji w jakimś bardziej złożonym projekcie. :)

Prawdopodobnie po całkowitym odinstalowaniu studio działało by jeszcze lepiej i kto wie, może to kiedyś zrobię.

PS 3

Omawiane wyżej rozwiązania opisywałem w oparciu o Visual Studio 2015. Część z nich może nie być dostępna w starszych wersjach lub jest dużo bardziej uboga.

Moje trzy słowa o Wrocsharp

konferencja

Moje trzy słowa o Wrocsharp

Było bardzo fajnie :)

Wrocsharp

No dobra. Zdecydowałem jednak, że napiszę coś więcej. Organizacja imprezy na bardzo wysokim poziomie. Wydarzenie miało miejsce na stadionie we Wrocławiu, a dokładniej rzecz ujmując w części specjalnie przygotowanej na tego typu eventy. Ogromny hall, gdzie w jednym miejscu pomieściło się masę wygodnych krzeseł, scena, gdzie występowali prelegenci, a także tuż obok, pod ręką, catering (kawa, herbata, woda, soki i jedzonko). Żyć nie umierać.

Część merytoryczna wyszła nieźle. Od najbardziej przebojowego Mark'a Rendle do najbardziej technicznego Ian'a Cooper'a. Gdybym miał przypisać kolory w zależności od poziomu merytorycznego całej konferencji to powiedziałbym, że było zielono. Ogólnie rzecz ujmując zobaczyliśmy i posłuchaliśmy o rzeczach, których już nie raz wałkowano lub były to podstawy.

Były też smaczki. Julie Lerman pokazała, że na Macu da się swobodnie uruchomić program napisany w c#, który poprzez Entity Framework Core czytał i zapisywał do bazy Postgres. Czy też mogliśmy się dowiedzieć od Enrico Campidoglio o kilku zawiłych kombinacjach w działaniu z git'em stosując odpowiednio proste komendy. No i na koniec oczywiście panel dyskusyjny, który przyćmił wcześniejsze wystąpienia ;) Mark Rendle największym szoł-menem wydarzenia.

Jednak wszystko to to za mało, abym wyszedł z tej konferencji z efektem wow i leciał do kompa kodować.

Ja rozumiem, że są ludzie, którzy dopiero wchodzą w świat programowania i to wydarzenie mogło na Nich wywrzeć takie wrażenie. I bardzo fajnie, dla każdego coś miłego. Osobiście cieszę się, że Wrocsharp się odbył i że tam byłem.

Od pewnego czasu uważam, że tak duże konferencje nie służą do tego, aby słuchać na nich o szczególnych rozwiązaniach stricte technicznych. Wskazanie kierunku i próba przekonania do danych rozwiązań - to jest to co najczęściej jest pokazywane.

Głębiej rozmyślając o tym, rozważyłbym może nawet zamienienie długości prezentacji z długością przerwy pomiędzy nimi. W przerwach toczyły się różne zawiłe rozmowy i tam było słychać to, tzw. "programistyczne mięcho", które wygłoszone ze sceny mogło by znużyć. :)

Na mięcho to się przede wszystkim chodzi na spotkania organizowane przez grupy pasjonackie (wg.net, wroc.net, łódź.net, bstok.net itp, itd) .

Organizatorów należy pochwalić także za wspaniały i jakże pomysłowy katering. Hot-Dogi były strzałem w dziesiątkę ;) Ot takie niby nic, a miało duże wzięcie. Owszem na słodko też było, ale był wybór. Get.Net bierzcie przykład. Niedługo ludzie Was znów zweryfikują. :)

Wroc.net

Dzień przed konferencją dobyło się spotkanie grupy wroc.net. Jako, że na konferencję dotarłem dzień wcześniej (dzięki Piotr) to udało mi się zawitać i na to spotkanie. Pub pomimo wady jaką było nagłośnienie (a raczej jego brak) posiada swój klimat. Było sporo ludzi i zrobiło się w pewnym momencie jakoś tak tłoczno i głośno co spowodowało pewne rozluźnienie. Skupić się na tym co mówili chłopaki było dosyć trudno.

Mimo wszystko pub to bardzo fajne miejsce na organizowanie takich imprez, ale brak nagłośnienia przełożyło się na brak pewnej dyscypliny u słuchających i zaczęli rozmawiać między sobą. Szkoda, bo omawiane były Micro-serwisy przez kogoś, kto zrobił projekt (pet-project) i starał się zastosować do wszelkich wskazówek jakie można znaleźć w sieci projektując takie rozwiązanie.

Jako, że był to pet-project to niestety pomimo zdobytego przez Nich doświadczenia (przy budowaniu micro-serwisowego kalkulatora), nie odważyłbym się pójść w ciemno tą samą drogą. Ale to temat na zupełnie inny post.

Event Sourcing - CQRS w użyciu

architektura, cqrs, eventsourcing

Event Sourcing  - CQRS w użyciu

No i stało się. Choć chwilkę się zastanawiałem, ale ostatecznie użyłem w nowym projekcie architekturę opartą o EventSourcing. Nawet pomimo tego iż projekt wcale nie jest duży. Pomyślałem, że przy takiej skali projektu jak będzie coś nie tak to łatwo będzie to wywalić i zastąpić standardowym podejściem do trzymania bieżącego stanu w tabelach.

Pierwsze odczucia po kilkunastodniowym kodowaniu to chęć powrotu do standardowego podejścia. Kiedy nachodziły mnie takie myśli wmawiałem sobie, że EventSourcing to po prostu taki inny sposób na trzymanie danych w bazie, i tyle. No bo... co może pójść źle? :)

Myśli takie nachodziły mnie z kilku powodów, ale przewodni to zwiększona ilość czasu na kodowanie. Defacto musisz stworzyć dwa modele. Tak, tak. Bez CQRS tego nie ma jak w prosty sposób ogarnąć. Chyba, że robisz aplikację, która nie zwraca żadnych danych i nic nie wyświetla.

Pierwszy model w części zapisu to tzw. logika biznesowa. Ona jest odpowiedzialna za przetwarzanie komend i generowanie zdarzeń. Drugi model to tzw. Read-Store, czyli część systemu odpowiedzialna za odczyt danych, na przykład do wyświetlania ich w UI czy generowania raportów.

Drugi powód to konieczność tworzenia sporej ilości klas. No bo tak:

  • Command - intencja wykonania zmiany
  • CommandHandler
  • Metoda przetwarzająca żądanie w Aggregate i generująca zdarzenie (część modelu w części zapisu)
  • EventHandler wewnątrz agregatu
  • Projection (tzw. projekcja) EventHandler w celu zapisu zmiany stanu w częściu odczytu (jeden projection łapie jedno lub więcej zdarzeń)

Uzbierało się trochę.

Jednak po pewnym czasie zacząłem dostrzegać plusy i to nie małe.

  • Tworzone klasy są małe. Wręcz bardzo małe, ale dzięki temu proste, szybko zrozumiałe.
  • Banalne do testowania. Nawet przetestowanie agregatu jest proste, gdyż zakładany poprawny wynik testowanej metody to wygenerowanie i zwrócenie przez niego odpowiedniego zdarzenia. :)
  • Projection okazał się także banalny i choć dotyka on już świata zewnętrznego (baza danych) to obsłużenie przechwyconego zdarzenia w 99% przypadkach składa się z pojedynczego i bardzo prostego strzału do bazy (Create, Update, Delete).

I tu dochodzimy do dwóch plusów, które są (jak dla mnie) potężne w swej prostocie:

  • Refactor agregatów w części zapisu (czyli logiki biznesowej) może się odbyć zupełnie bez dotykania całej reszty aplikacji (przy założeniu, że generowane zdarzenia nadal są kompatybilne z dotychczasowymi).
  • Dodawanie kolejnych ekranów/raportów/itp. jest diabelnie proste. Dodajemy kolejną projekcję, która słucha na zdarzenia, które są jej potrzebne do odpisania stanu i już. Bez dotykania tego co już wcześniej zostało zrobione. Co więcej. Jak często spotykaliście się z taką sytuacją, że nowo dodany raport prezentował dane od momentu jego uruchomienia? Mi się zdarzało. Z nowo dodaną projekcją tego problemu nie ma. Zasysa zdarzenia od początku działania systemu i generuje obecny stan potrzebny do wygenerowania raportu tak jakby był on stworzony od samego początku istnienia projektu.

Teraz już nawet nie odczuwam, że coś zajmuje mi troszkę więcej czasu. A może już nie zajmuje więcej czasu, bo wszystko mam obcykane? To wcale nie jest takie trudne jak się na początku wydaje. Zobaczymy jak będzie dalej... :)

Event Sourcing - początki

Event Sourcing  - początki

Od pewnego czasu chodzi mi po głowie użycie architektury CQRS+Event Sourcing (w skrócie ES) w oparciu o bazę MS SQL Server. W pracy kroi mi się "rewrite" (podyktowany zmianą bazowych założeń do projektu) jednego z systemów, ale sprawa jest odwlekana przez klienta. Drugą acz niewielką aplikację już zacząłem przerabiać (i tak ją dosyć mocno musiałem zmodyfikować), a tylko po to, aby sprawdzić czy takie combo po prostu zadziała i czy sam się w tym wszystkim nie pogubię. Puściłem nawet tweeta z pytaniem, ale jak na razie zero odzewu. Mimo to zakasałem rękawy i wziąłem się do roboty.

Mechanizm ma być prosty. Żadnej szyny danych, żadnego MSMQ, Rabbita, NServiceBus czy MassTransit. Wszystko oparte o prosty i szybki zapis zdarzeń do tabeli sqlowej. Komponent zainteresowany przetwarzaniem zdarzeń po prostu czyta tą tabelę, i tyle :)

Całe rozwiązanie oparte o wiedzę zebraną do tej pory od Szymona, Jego prezentacji na wg.net oraz z wielu innych postów czy video, a także z grupy DDD/CQRS.

Oczywiście tworząc to rozwiązanie rodzi się szereg... nie, nie szereg... pierdyliard pytań i wątpliwości. Na szczęście na sporą ich ilość da się znaleźć odpowiedzi w internecie, choć odnalezienie ich nie jest łatwe. Trzeba pytać, dociekać i próbować. Ale o tym innym razem.

PS

Zauważyłem, że pisanie długich postów mi nie wychodzi. Poza tym ostatnio nie miałem żadnej weny na pisanie. W związku z czym nie będę się zmuszał do czegoś specjalnie. Jak mi przyjdzie ochota na wrzucenie notki, choć zawierającej zaledwie kilka zdań, to będę wrzucał i tyle. :)