Author Archives: Jakub Skoczeń

Technika Pomodoro

pomodoro

W dzisiejszym wpisie chciałbym podzielić się z wami ciekawą techniką pracy jaką w ostatnim czasie zaczynam wdrażać w swoje życie 😉 Na pewno wiele osób już o niej słyszało, ale chciałem was zachęcić do jej używania. Jest nią Technika Pomodoro.

Nazwa Pomodoro wzięła się właśnie od pomidora, ale takiego kuchennego, używanego do odmierzania czasu. Technika polega na tym, aby nastawić sobie takiego pomidora na 25 minut i w tym czasie skupić się tylko i wyłącznie na wykonywaniu zaplanowanego zadania. Ważne jest, żeby wyłączyć wszystkie rozpraszacze, np. telefon, internet, itp. Po 25 minutach konieczne jest zrobienie sobie krótkiej przerwy 5 minutowej. Następnie powtarzamy czynność i tak do czterech razy. Po czterokrotnym powtórzeniu robimy dłuższą przerwę, np. 25 minut, po czym możemy znowu wrócić do wykonywania zadań.

Takie odcięcie się od wszystkich rozpraszaczy i skupienie w 100% na wykonywanym zadaniu bardzo korzystnie wpływa na efektywność. Jeżeli macie problemy ze zbyt dużą ilością rozpraszaczy gorąco zachęcam do spróbowania. Technika Pomodoro doskonale sprawdzi się także w pracy, gdy przykładowo pracujemy nad jakimś zadaniem, ale jesteśmy zewsząd bombardowani mailami i wiadomościami na czacie, ciężko się skupić w danej sytuacji. No właśnie, a gdyby tak sprawdzać wiadomości tylko raz na jakiś czas, np. w przerwach albo co któryś cykl pomidora?

Wydaje się to może na pierwszy rzut oka słabe, bo jak to pracować tylko 25 minut i przerwa i tak jednowątkowo, a nie lepiej robić wiele rzeczy na raz? Otóż nie, sprawdza się to bardzo dobrze. Zresztą spróbujcie sami 🙂

P.S. Nie musicie kupować pomidorów, wystarczy pobrać aplikację na telefon, np. Brain Focus na Androida.

Jak dodać kontener Autofac do aplikacji ASP.NET MVC?

IoC piękna rzecz, spójrzmy jak dodać kontener IoC Autofac do aplikacji ASP.NET MVC.

W tym celu pobieramy NuGetem paczki Autofac i Autofac.Mvc5. Ponieważ jest to projekt MVC5, konieczna jest instalacja Autofac.Mvc5, dzięki temu będziemy mogli ustawić DependencyResolver na ten z Autofaca.

autofacMvc

Następnie musimy skonfigorować nasz kontener. Przechodzimy do klasy Global.asax.cs gdzie dodajemy metodę ConfigureContainer.

A jej wywołanie dodajemy do metody Application_Start()

W metodzie ConfigureContainer rejestrujemy kontrolery oraz moduły z bieżącego projektu.

Kontrolery mamy, ale nie mamy modułów. W modułach chcielibyśmy zarejestrować wszystkie typy z danego projektu. Dla przykładu załóżmy, że mamy projekt MVC i dwa pozostałe projekty, z czego jeden z nich zawiera serwisy, a drugi repozytoria. Stworzymy więc dwa moduły. Dodamy je do projektu MVC.

Każdy moduł musi dziedziczyć z klasy Module z biblioteki Autofac. W klasie modułu przeciążamy metodę Load, aby zarejestrować odpowiednie typy.

Moduł pierwszy dotyczy serwisów, chcemy zarejestrować w nim wszystkie typy z assembly Services.

Dodajemy pusty interfejs IDetermineServicesAssembly do projektu z serwisami, służy on tylko po to aby określić z którego assembly rejestrować typy.

Kolejny moduł dotyczy repozytoriów. Analogicznie tworzymy nową klasę.

Przykład poniżej różni się od metody Load w module serwisów, ponieważ dodatkowo zarejestrowany jest typ UnitOfWork z inicjalizacją jego właściwości. Jest to przykład na to, że nic nie stoi na przeszkodzie zdefiniowania własnych customowych rejestracji.

Dodajemy pusty interfejs IDetermineRepoAssembly do projektu z repozytoriami i to wszystko. Uruchamiamy aplikacje i wszystko automagicznie działa 🙂 Autofac znajdzie wszystkie typy z danego assembly i odpowiadające im interfejsy (ponieważ zdefiniowaliśmy to w rejestracji typów).

Jak żyć z dev pasją?

W życiu każdego programisty przychodzi taki czas, że zaczyna się dużo zastanawiać co dalej zrobić ze swoim życiem, karierą. Jednym przychodzi to szybciej, innym później, ale jedno jest pewne – to jest nieuniknione (zachęcam również do przeczytania wpisu Macieja Aniserowicza). W końcu nadszedł czas i na mnie, aby poważnie zastanowić się i wybrać właściwy kierunek dalszej kariery. W ciągu tego czasu miałem okazje pracować w 2 firmach, z czego w jednej z nich dzięki, kilkumiesięcznej delegacji poznałem przy okazji inną firmę i jeszcze inną (tak, zostałem „tymczasowo wypożyczony” dla innej firmy :P)… i wiecie co? Prawie wszędzie to wygląda tak samo, na początku jest masa nowości (albo tylko trochę), człowiek się uczy nowych rzeczy albo i nie, często są problemy z komunikacją i nie ma znaczenia czy zespół pracuje zdalnie czy lokalnie! Problemem jest także definiowanie wymagań, definition of done, a potem ciągłe zmiany, zmiany, zmiany – tak tutaj pomocny może okazać się Scrum. Co potem? Potem nie ma nic, powtarzamy rozwiązania popełnione w przeszłości, dostrzegamy coraz to nowsze technologie które chcielibyśmy poznać i wykorzystać, frustrujemy się, bo nie możemy tego zrobić w pracy. Wszystko poza pracą staje się bardziej ciekawsze. Gorzej może być tylko wtedy jeśli trafimy do projektu, gdzie 90% prac będzie stanowiło utrzymanie istniejącego kolosa na glinianych nogach…
Oczywiście wszystko to zależy od projektu/firmy w jakiej się pracuje.
Tak to prawda, mała firma =  mała kasa, korpo = duża kasa. Dlaczego tak jest? 🙂 Między innymi dlatego, że w korpo większość prac to utrzymanie istniejących systemów. Kto by się skusił na taką pracę, gdyby wiedział o tym już na rozmowie rekrutacyjnej? Ja mogę tylko przytoczyć cytat: „Nie ruszaj gówna, nie będzie śmierdziało”. Właśnie dlatego czynnikiem przyciągającym musi być kasa, czasami nawet dwukrotnie większa 😉 Oczywiście praca w korpo jest czasem też bardziej na luzie, nie ma spiny (no chyba, że jest bliski deadline) i nikt nie stoi nad Tobą z batem. W pracy w małej firmie, kiedy pracuje się na rzecz innego klienta, a nie rozwija własny produkt, to nieustanny deadline

„Już skończyłeś swoje zadanie? No to Ci dołożymy, bo przecież masz jeszcze 4h capacity więc zadanie wycenione na 8h przecież zdążysz jeszcze zrobić!”.

Dlatego lepsze jest korpo, bo jest spokój. Gorzej kiedy nie ma kompletnie co robić 😀 A co robi programista jak się nudzi? Tak, zmienia pracę 😉 Devom nie dogodzisz! Fuck! Co jest z nami nie tak?
Jesteśmy twórcami, każdy projekt to takie dzieło sztuki. Właśnie to powoduje, że pracując dla kogoś można dojść do wniosku, że tak naprawdę lepiej pracować dla siebie. Stworzyć swój produkt, utrzymywać, a potem robić to na co ma się ochotę w tym programistycznym świecie. Bo przecież tyle ciekawego się dzieje. O programistok – musze tam jechać i byłem (dzięki eC za sponsoring!). O Wroc# – czemu nie!? To wszystko pochłania czas i pieniądze i to nie byle jakie (urlop, hotel, przejazd). Jak żyć? Trzeba jakoś to balansować niestety…

life...

Dev life deadlock

Podsumowanie gali finałowej „Daj się Poznać”

DSC_1421

Konkurs „Daj się Poznać” dobiegł końca. W sobotę odbyła się gala finałowa, która miała miejsce w siedzibie Microsoft Polska w Warszawie. Oczywiście nie mogło mnie tam zabraknąć 😉 Niestety nie udało mi się dostać do ścisłego finału, ale znalazłem się w finałowej siedemdziesiątce osób, co jest dla mnie i tak dużym sukcesem.

DSC_1422

Co do samej organizacji eventu, było super. Pomimo początkowych kilku minutowych zmagań z projektorem, obyło się bez problemów. Podczas całej gali mieliśmy okazję zobaczyć aż 18 prezentacji! Dwie z nich były przedstawione przez sponsorów mBank (Piotr Snapp) i SoftwareHut (Kamil Mijacz) i nie był to jakiś marketingowy bełkot tylko bardzo dobre prezentacje techniczne. Pozostałe prezentacje należały do uczestników DSP. Nie spodziewałem się, że wyjdzie to im tak dobrze, chyba większość osób miała już znaczny experience w występowaniu na scenie, bo wyszło naprawdę super.

DSC_1423

Dzięki firmie Microsoft nie byliśmy głodni, w przerwie na lunch mogliśmy zajdać się pizzą popijając coca-colą 🙂 Podziękowania należą się również firmie mBank, która dla każdego uczestnika gali zafundowała prezent w postaci gogli VR – Google Cardboard.
Po zakończeniu prezentacji udaliśmy się do Beerokracji na afterParty, fajnie że aż tyle osób się zjawiło.

IMG_20160618_200959

Dzięki wszystkim za miłe spędzienie czasu przy piwku 😉

Podsumowując, było bardzo fajnie. Dzięki wydarzeniu, a szczególnie afterparty, mogliśmy się wszyscy poznać i pogadać na luzie. Nie mogę się doczekać kolejnego eventu, gdzie będziemy mogli się spotkac ponownie. Tymczasem follow me on twitter: @qbasko, be in touch :]

Niech DEV moc będzie z wami!

IMG_20160618_211352

Podsumowanie „Daj się poznać”

Nadszedł ten dzień, koniec „Daj się poznać”, koniec ciężkich nieprzespanych nocy, wreszcie można wyjść z jaskini 😛 Ok, to teraz na poważnie. Minęły już trzy miesiące od momentu rozpoczęcia konkursu „Daj się poznać”. Dla większości był to pewnie ciężki czas pracy po godzinach nad własnym projektem, ale i przyjemny czas. Trzeba przyznać było ciężko, szczególnie, że w ciągu tych trzech miesięcy w moim przypadku było bardzo dużo zmian (zmiana pracy, itd, itp). Dlatego było bardzo mało czasu na rozwój projektu, w zasadzie to nie było go w ogóle, ale jakoś dotrwałem do końca. Jestem zadowolony, że wystartowałem w konkursie, dzięki temu mogłem w końcu zacząć przygodę z blogowaniem, co chciałem zrobić już od dawna, ale jakoś tak brakowało motywacji. Teraz się udało, trochę wpisów powstało, co prawda nie za wiele, ale to już jest coś ;). Uważam, że była to bardzo dobra decyzja. Nauczyłem się wielu nowych rzeczy, co z pewnością przydało mi się w nowej pracy, ale też chciałem je poznać dla siebie. Żałuję tylko, że nie mogłem więcej czasu znaleźć na rozwój projektu. Zdecydowanie większość czasu zajęło pochłonięcie wiedzy nt. technologii i przygotowanie wpisów, przez to trochę zaniedbałem kodowanie, ale nie wszystko stracone, bo nie zamierzam przestać blogować 🙂 Oczywiście będę to robił z mniejszą częstotliwością, ale jednak chce dalej iść za ciosem, dlatego zachęcam gorąco do odwiedzania mojego bloga i śledzenia mnie na twitterze i facebooku. Niestety nie udało się dokończyć projektu, ale z pewnością jeszcze będę go rozwijał. Podczas tego czasu nasunęło się trochę przemyśleń, czy wybrałem dobrą drogę w związku z technologiami i czy sam pomysł jest odpowiedni, dlatego koncepcja raczej ulegnie drobnej modyfikacji w przyszłości.

Pozostało jeszcze tylko kilka godzin zanim DSP oficjalnie się zakończy, dlatego chciałem serdecznie podziękować Maciejowi za organizację konkursu i dzięki temu zmotywowaniu do działania nas uczestników. Gdy tylko będzie kolejna edycja, z pewnością wystartuję jeszcze raz 😛 Dzięki wielkie!

Hello AngularJS

Planując pracę nad aplikacją, założyłem sobie cel zapoznania się z frameworkiem AngularJS. W końcu przyszedł czas przyjrzenie się tej bibliotece. Zaczniemy słowem wstępu. Z czym to jeść?

Angular jest to framework napisany w języku JavaScript i wykorzystuje on HTML. Dzięki niemu możliwe jest tworzenie dynamicznych i łatwych w utrzymaniu (wzorzec MVC) aplikacji internetowych działających po stronie klienta.
Ok wszystko super, ale to na pewno jest ciężkie do ogarnięcia, pomyślicie. Otóż nie, zobaczcie jakie to proste. Poniżej znajduje się kod pierwszej aplikacji. Nie trzeba pobierać żadnych bibliotek. Wystarczy napisać kawałek kodu w notatniku i działa. Magic 😀

Przeanalizujmy kod od początku. Jak widać wygląda jak zwykły HTML, ale coś tu dodano dodatkowo. W oczy rzuca się dyrektywa ng-app, jest ona dodana po to, aby określić jaką część drzewa DOM będzie zarządzał AngularJS. W tym przypadku Angular będzie zarządzał całością, ale nic nie stoi na przeszkodzie aby był to np. tylko jeden <div>.
Następnie mamy kontrolkę input z atrybutem ng-model, chodzi o to aby powiedzieć Angularowi, że to jest nasz model o nazwie input.
Kolejna linijka kodu zawiera takie dziwne znaki {{ input }}, to właśnie tutaj Angular wstrzyknie nową wartość, odświeży ją dynamicznie. W tym przypadku wartość z pola input.
Na końcu sekcji body określamy skrypt Angularowy, lepiej określić go w ten sposób, aby klient nie musiał go za każdym razem pobierać. Skrypt będzie przechowywany w pamięci cache przeglądarki, który jest dostępny dla wielu aplikacji.
To na tyle słowem wstępu do Angulara. W kolejnym wpisie/wpisach przyjrzymy się bliżej tej bibliotece.

Deploy web aplikacji do chmury

Jeżeli przy tworzeniu nowego projektu w Visual Studio nie zaznaczyliśmy opcji „Host in the cloud”, ale chcemy opublikować naszą aplikacje w chmurze Azure, to ten krótki poradnik może okazać się przydatny. Pierwszą rzeczą jaką musimy zrobić jest stworzenie web aplikacji w Azure.
Wybieramy Usługi aplikacji z portalu i klikamy dodaj

clip_image001

Po stworzeniu aplikacji, możemy pobrać profil jej ustawień klikając „Pobierz profil…”

clip_image002

Otwieramy solucję w Visual Studio, wybieramy projekt do deployu i wybieramy Publish, a następnie Import i wybieramy plik z profilem *.PublishSettings pobrany z portalu Azure.

clip_image003

clip_image004

clip_image005

Dla pewności możemy wykonać test połączenia oraz upragniony Publish. That’s it. Nasza aplikacja już działa na Azure, przynajmniej powinna, o ile stworzyliśmy wcześniej także bazę danych i zmieniliśmy odpowiednio ConnectionStringa w web.configu.

Logowanie za pomocą konta google

userLogin

W aplikacji ASP.NET MVC mamy możliwość rejestracji kont użytkowników, jednak co w przypadku gdy chcielibyśmy dać użytkownikom możliwość logowania kontami zewnętrznymi, takimi jak google, facebook, itp? Aby umożliwić logowanie kontami zewnętrznymi, musimy przede wszystkim zajrzeć do pliku Startup.Auth.cs i w metodzie ConfigureAuth odkomentować odpowiednie linie kodu.

Jak widać możemy użyć kont Microsoft, Twitter, Facebook oraz Google. W tym poście skupimy się na logowaniu za pomocą konta Google. Tak więc musimy odkomentować ostatnią opcję:

Niezbędne będzie podanie ClientId i ClientSecret, aby je uzyskać udajemy się pod adres: https://console.developers.google.com i tworzymy nowy projekt. Następnie przechodzimy do zakładki Credentials i wybieramy Create creadentials określając nazwę naszej aplikacji, rodzaj, itd. Należy wpisać także odpowiednie redirect Url. Authorized JavaScript origins: http://localhost:portNumber oraz Authorized redirect URls: http://localhost:portNumber/signin-google . Zamiast localhost:portNumber podajemy adres naszej aplikacji. Jeżeli uruchamiamy ją na localhoście to adres powinien tak właśnie wyglądać, tylko trzeba wpisać odpowiedni port z jakiego korzysta aplikacja. Oprócz tego musimy jeszcze aktywować Google+ API, w tym celu przechodzimy do naszego projektu i z głównego ekranu wszystkich dostępnych API wybieramy Google+ API i klikamy enable. Po przeklikaniu się przez kilka kroków dostaniemy wygenerowane klucze ClientId i ClientSecret, które należy skopiować do powyższej metody. Po uruchomieniu aplikacji naszym oczom ukaże się dodatkowa opcja logowania.

clip_image001

clip_image002

I w ten oto sposób użytkownicy będą mogli logować się do naszej aplikacji kontami google.

Atrybuty walidacji w modelu

Projektując formularze, chcielibyśmy aby użytkownik podał w polach odpowiednie dane. Co zrobić aby sprawdzić poprawność wpisywanych danych? Z pomocą przychodzą nam atrybuty walidacji, które udekorują właściwości naszego modelu. Pisząc o walidacji, trzeba wspomnieć że możliwości są dwie: walidacja po stronie klienta oraz walidacja po stronie serwera. Dobrze jest skorzystać z obu opcji i walidować dane już po stronie klienta, aby nie przesyłać żądań do serwera dla każdego pola. Aby aktywować walidację po stronie klienta w aplikacji ASP.NET MVC należy upewnić się czy w pliku web.config, w sekcji appSettings widnieje taki oto wpis:

Dzięki temu oraz atrybutom w modelu uzyskamy walidację w obu przypadkach. Jakie atrybuty mamy do dyspozycji? Poniżej przedstawiam listę, mam nadzieję że żadnego nie pominąłem 😉

[Required(ErrorMessage = „This field is required”)]

[EmailAddress(ErrorMessage=”Incorrect e-mail address”)]

[Range(1, 99, ErrorMessage = „Incorrect value, please type value 1-99″)]

[RegularExpression(@”^[A-Z]+[a-zA-Z’’-‘\s]*$”)]

[Compare(„NewValue”, ErrorMessage = „Values are not the same”)]

[DataType(DataType.Time)]

[StringLength(256, MinimumLength=3)]

[MaxLength(500)]

Przykład:
Mamy w modelu właściwość:

Spróbujmy teraz wpisać w to pole wartość z poza podanego zakresu

clip_image001

Jak widać walidacja zadziałała, bez wysyłania żądania do serwera. W przypadku wyłączonego wykonywania JavaScript w przeglądarce użytkownika, walidacja po stronie klienta nie zadziała, ale walidacja po stronie serwera się wykona.

ViewBag, ViewData, TempData

Gdy już jesteśmy w temacie kontrolerów, warto także poruszyć temat przekazywania danych do widoków. Oczywiście robimy to za pomocą ViewModeli, ale istnieją także inne metody przekazywana danych. Do dyspozycji mamy takie obiekty jak:

  • ViewBag,
  • ViewData,
  • TempData.

ViewBag i ViewData są obiektami tworzonymi tylko na czas bieżącego żądania. Podczas przekierowania pod inny adres wartości w nich zawarte przyjmują wartość null. ViewData jest to słownik, którego kluczem jest string, a wartością typ object. Podczas używania wymagane jest sprawdzanie przed nullem i rzutowanie, aby uniknąć pojawienia się błędu.
ViewBag jest typu dynamic, więc może przyjąć dowolny typ. Nie wymaga rzutowania typów.
Nieco więcej różnic zawiera TempData. Pozawala on na przekazywanie danych pomiędzy dwoma żądaniami HTTP (bieżącym i kolejnym), przechowuje on dane przez cały czas trwania żądania HTTP. Pomaga utrzymać dane podczas przemieszczania się pomiędzy kontrolerami lub akcjami. Korzystając z TempData musimy zapewnić sprawdzenie wartości przed nullem oraz rzutowanie na odpowiedni typ, w celu uniknięcia wystąpienia błędu. Obiekt ten jest używany głównie do przechowywania jednorazowych wiadomości jak np. komunikaty błędów.
Przykład: chcemy przekazać wartości lokalizacji i typów do kontrolki DropDown w widoku.
Kod zawarty w kontrolerze:

W obu przypadkach z ViewBag i ViewData wartości zostaną poprawnie przekazane do widoku.
Kod zawarty w widoku:

Możemy też bezpośrednio dobrać się do wartości zawartych w obiektach ViewBag i ViewData:

W przypadku TempData wygląda to tak samo.
Kod w kontrolerze:

Kod w widoku:

W przypadku przekazywania wartości TempData pomiędzy akcjami wygląda to tak:

Zapisujemy wartość do obiektu TempData w akcji index i przekierowujemy do akcji Create.
W akcji create pobieramy wartość TempData[„TestVal”] i sprawdzamy czy jest to „TempDataTestVal”.

clip_image001

Jak widać wartość została przekazana.