Bardzo prost logi w asp mvc

Nigdy nie ciągnęło mnie do logowania. Zawsze miałem problem z określeniem poziomu na jaki zasługiwała dana informacja, a może ostrzeżenie. Czy to błąd, czy to już krytyczny błąd. Jak mam to dobrze zalogować. Czemu te okrutne logi tak strasznie mieszają mi się w aplikacje, wtedy jeszcze nie znałem podejścia AO.
Pisanie własnego logera też nigdy nie sprawiało mi przyjemności, zawsze czułem że robię coś nie tak. Jak już poznałem nloga czy log4net i próbowałem go zaprząc do aplikacji, to konfiguracja jednego i drugiego też zawsze szła po gruzie. Summa summarum życie szło powoli, a z logów nie korzystałem i nadal nie najczęściej nie korzystam (czasem żałuje). W projektach dziedziczonych logowanie już jest i wszystko jest już ustawione i postanowione i tak ma być – a że wszyscy referują do logera, to też jest “spoko”. Ale nie o tym miałem pisać. Często się zdarza, że mi tego brakuje i wtedy albo na chwilę dodaje logowanie, a potem usuwam, a potem jak znowu potrzebuje to usuwam, albo zostawiam bo może kiedyś mi się przyda i strasznie mnie to wkurza. Dlatego gdy odkryłem tracing musiałem się tym podzielić. Otóż taram taram – ( dla części z was oczywista oczywistość), w asp.net mvc jest wbudowane proste tracowanie, które spełnia moje podstawowe wymagania i włącza się to niebotycznie prosto.

Wystarczy tyle, żeby móc przejść na stronę myWebApp/trace.axd i móc oglądać szczegóły request’ów, które otrzymuje aplikacja. Jest tam więcej przełączników, które można poznać na internecie, np. na msdn.
Oto co dostajemy za darmoszke:

Faking hel – i to praktycznie za darmo?! Oczywiście możemy dorzucać trochę swojego logowania jeśli trzeba robi się to przez taką linikę kodu:
HttpContext.Trace.Write(“Category”, “Text to log”);
Dodatkowe wpisy znajdą się w sekcji TraceInformation. Dla mnie bóstwo. Włączyć, dodać kilka linijek w kodzie na szybko, sprawdzić i wywalić.
Podobną funkcjonalność można uzyskać przy pomocy Glimpse – też wypas. Jeszcze inna opcja to F12 developers tools w każdej przeglądarce, ale tam nie dostaniemy informacji o stanie serwera. No i tyle, krótko i na temat.

Polskie znaki w MVC

Tworzy się wszystko po angielsku, a przez to nie ma problemów ze znakami “zażółć gęślą jaźń”. Ja popełniłem ostatnio małą aplikację, gdzie postanowiłem że cały UI będzie po polsku, ponieważ do takich odbiorców kieruje swój projekt. Skoro jedno języczne to będzie to proste. HTML i opisy po polsku, atrybuty i informacje po polsku.

Nic nie zapowiadało małej katastrofy, ale ta nadeszła całkiem szybko:

 

Plik zapisany w UTF-8, przynajmniej VS2015 tak twierdzi (słaba ta wersja). Html meta też mówi, że to UTF-8. Ciekawie zaczyna się dopiero gdy w spojrzy się do source tree (aktualnie tego używam):

 

Nie zastanawiając się za długo, pomyślałem sobie walić to, kiedyś jak (nie jeśli, tylko kiedy!) będzie więcej użytkowników trzeba będzie to wyświetlić w innym języku. Zasoby! Pomyślałem i stop, bo nie pamiętam jak to się dokładnie robiło i właśnie dlatego wpis.
Prawy na projekcie, dodaj nowy resource. Z automatu dodaj się domyślny język, u mnie domyślny jest taki który nie będzie posiadać tłumaczenia, po to, żeby znaleźć braki w tłumaczeniu. Chciałem przez chwile, mieć “———-” zamiast tekstu, ale potem pomyślałem że będzie trudniej znaleźć klucz dla wartości “———“, jeśli taka będzie wszędzie. Przyjąłem na razie konwencja, że wartość odpowiada kluczowi, czyli dla klucza ViewModel_LoginViewModel_Password domyślnym tłumaczeniem jest także ViewModel_LoginViewModel_Password. Bo: nie wygląda to strasznie źle w przypadku fakapa, łatwo daje się znaleźć w wielkim pliku z zasobami, a jednocześnie szybko daje się odnaleźć w kodzie. ViewModele, klasa LoginViewModel, właściwość Password. Nie które z właściwości posiadają także błędy, wtedy dodaje do klucza informacje o błędzie np. required. Poniżej inna klasa, bo LoginViewModel okazał się nie przetłumaczony do końca – ot uroki pracy samemu i braku reviewu.

Przykład z właściwością która posiada więcej niż jeden atrybut z tłumaczeniem i klucz użyty:
ViewModel_VerifyPhoneNumberViewModel_Code_Required
ViewModel_VerifyPhoneNumberViewModel_Code
Itd, itp, etc i wiecie – rozumiecie.
Tak tylko dla wyjaśnienia: Translations to klasa, która zawiera tłumaczenia.

Co jeszcze jest ważne? Dodatkowe wersje językowe (inne niż domyśla) powinny zawierać język, które mają wspierać – u mnie .pl. I ostatnia ważna ważność: plik *.Designer.cs dla wersji językowej innej niż domyślna będzie pusty – tak ma być. Tylko domyślny designer posiada wygenerowany kod.
Korzystanie z zasobów jest proste, w przypadku atrybutów kod powyżej pokazal jak korzystać – uwaga na ErrorMessageResourceType i ResourceType. Natomiast w przypadku razora, z którego ja aktualnie korzystam wygląda to tak:

W przypadku l> pamiętamy o wcześniejszym using. I tyle, pozostaje tylko dodać tłumaczenie wszędzie i będzie po krzyku.

App settings w portalu azure

Drogi pamiętniku.
Pamiętam gdy mówili: konfiguracja w środowisku, nie wrzucaj sekretów do repozytorium, bądź mądry, nie czyń zła. Nie pamiętam tylko, żeby tłumaczyli jak to zrobić. Ja zrobiłem to tak na początku:

I fajnie, myślę sobie, u siebie ustawie wartość na 1 a na produkcji ustawie na 2 i będzie cacy. Tak jak mówili, wszyscy będą zadowoleni a ja będę cutting edge i secure.
Zrobiłem deploy na produkcje, która jest na azure i szukam i szukam i nie ma. Nie da się, lub nie umiem znaleźć ustawienie środowiska na azure. W takim razie szukam na google i szukam, i znalazłem. Że best practices to posiadanie dodatkowego zewnętrznego pliku .config, w którym umieszcza się wszystkie krytyczne ustawienia, linkuje się do niego, na środowisku programistycznym a na produkcje się tego nie wysyła. Zamiast tego ustawia się zmienne ręcznie w azure application setting. No i dodatkowo lekka zmiana w aplikacji:



ConfigReader działa teraz w oparciu o trochę inną metodę:

W starym portalu azure klikamy:


Później przewijamy w dół, aż do sekcji app settings:

Tam ustawiamy app settings, których nie załączyliśmy w czasie produkcji paczki. Podobnie czynimy np. z connection settings, jeśli zawierać będą hasło zapisane czystym tekstem (sic!) czy inne ważne dane.

Jeśli potrzebujecie poznać jeszcze więcej szczegółów można przeczytać na stronie http://www.asp.net/identity/overview/features-api/best-practices-for-deploying-passwords-and-other-sensitive-data-to-aspnet-and-azurewww.asp.net
A dodatkowo dobry przyjaciel Scott Hanselman też popełnił w podobnym temacie hanselman.com

Dziękuje, do widzenia, dobranoc.

Continous Code Retreat

Byliście kiedyś na CodeRetreat? Bardzo fajna impreza, której ideą jest pisanie kodu  w możliwe najlepszy sposób. Na koniec dnia nie trzeba dostarczyć produktu, przede wszystkim trzeba poznać nowe sposoby na rozwiązywanie tego samego problemu. Oczywiście w trakcie trwania imprezy, żeby nie było za nudno, mistrz ceremonii rzuca pod nogi kolejne kłody: krótkie metody, brak ifów, brak czegoś innego, itp-itd, fajna sprawa która powoduje, że uczestnik ciągle poszukuje, a przez to poznaje nowe różne rozwiązania. Często okazuje się, że ograniczenia które były wprowadzana, wymuszały chwilę rozmyślenia jak napisać kawałek kodu inaczej, a to powodowało dużo lepszy kod. Do czego zmierzam? Otóż po pierwsze primo, już za nie długo odbędzie się kolejna już edycja Global Day of Coderetreat we Wrocławiu, po drugie primo: takie ograniczenia z code retreat można wprowadzić sobie w życie także w pracy w normalnym projekcie. Otóż na każde rozpoczęcie sprintu lub tygodnia, można ustalić reguły: np. w tym tygodniu decydujemy się, że metody nie mogą przekroczyć np. siedmiu linijek, albo nie używamy typów prostych, wersja dla profesjonalnych graczy: nie używamy if’ów, etc. Dlaczego? W ten oto prosty sposób, możemy nie jako wymusić na swoich kolegach pisanie lepszego kodu, nie trzeba im wtedy mówić, o SOLID, czy dobrych praktykach, czy czymś innym, po prostu ustalacie wspólnie, że to i tamto i przez tydzień macie taką “grę”, potem retrospekcja i nowe reguły, nowe doświadczenia, nowy tydzień i nowe reguły i znowu retrospekcja – aż wszyscy zrozumieją jak pisać dobrze. Tym sposobem i sprint przyjemniejszy i kod lepszy. Takie moje luźne myśli na kolejny tydzień.

.net developers days – myśli zebrane

Tym razem udałem się do warszawy na konferencje .net developers days i zrobiłem sobie słit focie ze Scottem – yey! yey! yey! 
Wiem, mam zamknięte oczy (smuteczek) Ale! Ze Scottem!!! Mam jeszcze jedno, ale tak niewyraźne, że nie uwierzycie że to ja.
A teraz część z myśli, które zebrałem słuchając różnych wykładów i rozmyślając też o różnych rzeczach podczas słuchania:
Nie mieszać klas które służą do czystego przechowywania danych oraz tych, które na nich operują. Powinno to ułatwić skalowalność systemu, utrzymanie systemu, jest też spora szansa na to że system stanie się mniej stanowy, a przez to mniej awaryjny.

Value objects z DDD to fajna sprawa, nawet jeśli nie korzysta się z pełnego dobrodziejstwa które oferuje ddd, to warto wprowadzić przynajmniej część. Duża zaletą jest to że string który może się kryć z User.Firstname oraz User.Address i który normalnie możemy ze sobą porównać, nagle stanie się nie porównywalny ponieważ stringa ukryjemy w klasie UserAddress, a stringa odpowiedzialnego za Firstname ukryjemy w klasie UserFirstname i pomimo tego że w środku są to stringi, to dla kompilatora będą to dwie zupełnie inne typy, przez co nie da się ich ze sobą porównać. Dodatkową zaletą jest to, że podczas definiowania parametrów metody, czytelniej będzie czytać foo(UserFirstname name, UserAddress address){…} niż foo(string name, string address){…}
Dostając projekt, wymagania, nowego klienta, etc możemy się wkurzać na wiele rzeczy,  naprawdę wiele. Ale warto sobie zdać posiedzieć przez chwilę i pomyśleć. Znaleźć wszystkie rzeczy, które są dla nas/was/mnie denerwujące, następnie podzielić je na dwie grupy: 1-mogę to zmienić, 2- nie mogę tego zmienić. I teraz wszystkie dwójeczki lądują w kuble, skoro nie można tego zmienić, to się trzeba przyzwyczaić. A wszystkie 1 lądują na naszej tapecie i robimy tak, żeby było lepiej. Do dwójeczek nigdy nie wracamy i godzimy się z losem jaki nas/was/mnie spotkał. Podobną myśl powiedział mi kiedyś znajomy, nie przejmuj się rzeczami na które nie masz wpływu – świetnie działa.
Wszyscy jesteśmy ludźmi i musimy się pogodzić z tym, że czasem coś nam nie wyjdzie – musimy się z tym pogodzić. Nie warto zakładać, że wszystko co robimy skończy się spektakularnym sukcesem i nie każdy z nas skończy tak jak Marek Zuckerberg czy inne Grycanki. Czasem słońce, czasem deszcze – takie jest życie. 
Jeśli prowadzicie retrospekcje, gdzie programiści mogą się spotkać i porozmawiać o tym co się udało, co było dobre, co się sprawdza, ale i to co się nie udało, co złe, co się nie sprawdza (patrz punkt poprzedni). To samo dotyczy menadżerów projektu, oni także mają swoje przemyślenia (tak tak, oni też myślą). Jeśli macie takie spotkania, to może warto aby podzielić się decyzjami, przemyśleniami, ustaleniami, próbami, sukcesami i porażkami z resztą ludzi którzy z wami pracują w firmie. W ten sposób, może udało by się ustrzec przed najczęstszymi błędami, może decyzje które podejmujecie na nowy sprint okażą się nie najlepsze, ponieważ inny zespół już próbował, a może dostaniecie wskazówki na co warto zwrócić uwagę próbując nowego rozwiązania. Dzielenie się wiedzą jest sexi!
Input w obiekcie na poziomie konstruktora – ? Co ja miałem na myśli? Walidacja? Zagadka – stawiam że tak. Jak sobie przypomnę to dopiszę.
Breakstorming – fajna pomysł nie tylko dla testerów. Pracujecie w zespole? Spotkajcie się od czasu do czasu, ale nie za rzadko i zróbcie sobie code review, gdzie główną ideą jest zepsucie kodu innego kolegi; na zasadzie: pacz Stefan, jak wyślę takie parametry i wystąpi taki warunek, to twój serwis rzuca wyjątkiem. Można wymyślać najbardziej złośliwe ścieżki, najmniej prawdopodobne do spełnienia, etc. Chodzi o możliwie najefektywniejsze wysadzenie jeźdźca z siodła
Aplikacje webowe powinny być w stanie “zadziałać” bez połączenia z serwerem. Tak! Chodzi oczywiście o aplikację którą mamy już u nas, lub o taką która zaciąga statyczne html plus javascript, natomiast mięsko kryje się gdzieś głęboko na serwerach. Wtedy zamiast rzucania magicznymi kodami błędów, użytkownik powinien być w przyjazny sposób poinformowany, że nie da rady teraz wykonać tego trudnego zadania. Ale może popatrzeć na nasz spinner czy coś, który mówi: wiemy że nie działa i walczymy, próbuj dalej.
Nie ładować konfiguracji podczas wykonywania kodu – już spieszę ze szczegółami. Chodzi o przypadek, gdy ustawienia miałby być ładowane przez samą metodę podczas wykonywania kodu. Czyli mogłoby dojść do sytuacji, że metoda foo(“jarek”, “wrocław”){…} raz wykona logikę_1 a raz wykona logikę_2, ponieważ pomiędzy poszczególnymi wywołaniami metod, plik z konfiguracją został zmieniony i teraz zachowuję się inaczej. Prowadzi to do niespójności w aplikacji. Konfiguracja powinna być zaczytana raz na początku działania aplikacji i tyle. Aby zmienić ustawienia, należy wykonać restart aplikacji.
Dlannybecon – nie mam pojęcia co napisałem na kartce ^.^
Robiąc sobie zdjęcie ze Scottem :):):):) patrz na górze, doszły mnie słuchy, że przygotowywane są learniing box dla nowego asp i mvc na poziomie novice, regular, master – i powinny być oficjalnie dostępne w styczniu 2016 roku. Mają umożliwić samokształcenie jak i przygotowanie sesji dla innych ludzi. Wersje novice są chyba na mva. Nie szukałem więc nie posiadam linka.
Klasycznie czekam na komentarze lub nie zgody z moim rozumowaniem. Chętnie przyznam się do błędu jeśli taki popełniłem.
ps.
Poznałem fajny podcast: