27 kwi 2017

Hosting aplikacji Angular w Github Pages

Dziś o tym, jak można za darmo opublikować stronę napisaną w Angular (a tak naprawdę każdą statyczną stronę) przy użyciu infrastruktury GitHub. Tytułowe GitHub Pages to po prostu kolejne repozytorium gita, które zakładamy w serwisie, a jego zawartość jest prezentowana jako strona w domenie github.io.

24 kwi 2017

Raport z placu boju - 8 tydzień konkursu Daj Się Poznać

Mija kolejny tydzień konkursu Daj Się Poznać, pora zatem na raport co się dzieje z aplikacją Portfela Emerytalnego. Poprzedni raport wypadał prawie dokładnie w środku kwietnia i po jego napisaniu zostały 2 tygodnie miesiąca, sprawdziłem więc jak idzie realizacja listy moich planów na ten miesiąc. Wniosek był prosty - niestety nie dam rady zrobić wszystkiego co zaplanowałem. Więcej o tym będzie w podsumowaniu całego miesiąca, ale w tym tygodniu pozwoliło mi to podjąć decyzję, że na razie skupiam się tylko na odczycie danych.

Aplikacja w trybie read-only będzie prezentowała to co ma zapisane w bazie, ale bez możliwości zmiany czy dodania kolejnych informacji. Skoro zatem zrezygnowałem na razie m.in. z możliwości dodawania portfeli i operacji w portfelach, to musiałem dodać je ręcznie bezpośrednio w bazie danych. Spisanie kilku moich zakupów z systemów transakcyjnych TFI nie było większym problemem, ale myślę, że kiedyś będzie musiała się pojawić opcja importu danych. Dodawanie kilkudziesięciu operacji nawet przez najwygodniejszy interfejs może skutecznie zniechęcić do użycia Portfela Emerytalnego.
Oprócz uzupełnienia stanu portfela dodałem też wszystkie fundusze prowadzone przez moich dostawców IKE i IKZE oraz kursy funduszy, które posiadam lub posiadałem. Dzięki temu baza jest już gotowa do policzenia wartości wszystkich moich funduszy w czasie.

Utworzyłem też strukturę, która będzie przechowywała dane o dostawcach produktów emerytalnych oraz samych produktach które oferują. Strukturę tworzą 3 tabele:
  1. FinancialInstitutionType - rodzaj instytucji finansowej, na początek są to
    • Towarzystwa funduszy inwestycyjnych (TFI)
    • Powszechne towarzystwa emerytalne (PTE)
    CREATE TABLE `FinancialInstitutionType` (
      `Id` int(11) NOT NULL AUTO_INCREMENT,
      `Code` varchar(10) NOT NULL,
      `Name` varchar(250) NOT NULL,
      PRIMARY KEY (`Id`)
    )
  2. FinancialInstitution - instytucje finansowe prowadzące IKE lub IKZE, przykładowo NN Investment Partners TFI S.A. lub PTE PZU SA
    CREATE TABLE `FinancialInstitution` (
      `Id` int(11) NOT NULL AUTO_INCREMENT,
      `Name` varchar(250) NOT NULL,
      `TypeId` int(11) NOT NULL,
      PRIMARY KEY (`Id`)
    )
  3. InvestmentProduct - w tej tabeli znajdą się konkretne produkty IKE i IKZE, które można założyć. Przykładowo będzie to IKE Plus prowadzone przez wymienione wcześniej NN TFI
    CREATE TABLE `InvestmentProduct` (
      `Id` int(11) NOT NULL AUTO_INCREMENT,
      `Name` varchar(250) NOT NULL,
      `Type` varchar(10) DEFAULT NULL,
      `FinancialInstitutionId` int(11) NOT NULL,
      PRIMARY KEY (`Id`)
    )
Poza dodanymi wierszami i nowymi tabelami pojawiło się również kilka kosmetycznych zmian. Są to np. zmiana pierwszych liter w nazwach tabel na duże i dodanie w tabeli Fund do jakiego InvestmentProduct należy. Tabela Wallet również dostała pole InvestmentProductId, ale tutaj będzie ono mogło być NULLem - do portfela można będzie dodać też np. gotówkę, która nie jest związana z żadnym produktem inwestycyjnym.

Mam nadzieję, że to koniec zmian i uzupełniania bazy, bo pora w końcu zabrać się za wyświetlanie tych wszystkich danych w interfejsie użytkownika - i to jest plan na najbliższy tydzień.

20 kwi 2017

Jakie jest najlepsze IDE dla Angular i dlaczego moim zdaniem jest to WebStorm

Chyba każdy programista lubi i potrzebuje dobrego środowiska programistycznego. Oczywiście pisać kod można nawet w notatniku i też będzie działało, ale zdecydowanie nie jest to produktywna droga. Dziś będę chwalił oprogramowanie ze stajni JetBrains - tytułowy WebStorm, który zdecydowanie wspomaga pracę i zwiększa tempo rozwoju aplikacji.

17 kwi 2017

Raport z placu boju - 7 tydzień DSP

Upłynął kolejny tydzień, więc pora na raport co z moim projektem konkursowym.

Ostatnio pisałem, że nie mogę dodać operacji w API które modyfikują bazę, dopóki nie będę mógł w jakiś sposób uwierzytelniać i autoryzować użytkowników. Naturalnie otwierałoby to możliwość zmian każdemu użytkownikowi w każdym portfelu. Nie chciałem pisać całego modułu użytkowników, logowanie przez Facebook czy innego dostawcę też wydawało się czasochłonne jak na potrzeby prostego demo do którego dążę. Zdecydowałem się na tymczasowe rozwiązanie w postaci tokenów. Założenie tego rozwiązania są następujące:
  • użytkownik odwiedza stronę bez tokena - dostaje informację o projekcie, być może wyświetla mu się przykładowy portfel
  • użytkownik bez tokena robi akcję na stronie (np. założenie swojego portfela) - jest generowany dla niego token, który zostaje dopisany do adresu url strony
  • użytkownik odwiedza stronę z tokenem w url - widzi swój portfel
System jest prosty (można by nawet powiedzieć, że prostacki), ale spełni swoje zadanie na ten moment. Jest otwarty na udoskonalenia (np. token można zapisać w cookie zamiast url), po dodaniu innego systemu uwierzytelnienia można go łatwo zintegrować z nowym rozwiązaniem. No i najważniejsza jego zaleta - mieści się w kilku liniach kodu
@app.route("/token", methods=['GET', 'POST'])
def token():
    if request.method == 'POST' and 'token' in request.json:
        query = "INSERT INTO user (Token, Admin) VALUES ('{0}', 0)"
        query = query.format(request.json['token'])
        try:
            insertedId = insertToDb(query)
            return jsonify(userid=insertedId, error=None)
        except:
            error = "Error: unable to insert token"
            return jsonify(userid=None, error=error)
    else:
        return jsonify(token=uuid.uuid4())
        
def insertToDb(query):
    cursor = mysql.connection.cursor()
    cursor.execute(query)
    mysql.connection.commit()
    return cursor.lastrowid

Drugą zmianą z ubiegłego tygodnia jest pojawienie się serwisu, który ma automatycznie pobierać i zapisywać kursy funduszy inwestycyjnych. Tydzień temu wspomniałem, że udało mi się znaleźć na stronie TFI Nationale-Nederlanden adres pod jakim są dostępne pliki json z potrzebnymi mi danymi. Dodany przeze mnie do projektu DataDownloader wykorzystuje te właśnie adresy i dla trzech przykładowych funduszy pobiera i zapisuje pliki z wartościami funduszy w czasie. Do zrobienia pozostaje interpretacja tych danych i wysłanie ich do zapisu do API, a kolejne kroki to dodanie pobierania dla innych TFI. Nie wiem jednak od jakich zacząć, więc daj proszę znać w komentarzu pod tym postem na jakich funduszach by Ci zależało.

14 kwi 2017

Jak oszczędzać na emeryturę?

Kolejny raz opóźnia się mój założony cykl wydawniczy i znowu publikuję z jednodniowym poślizgiem. Nie wiem czy są tu jacyś czytelnicy, którzy co poniedziałek i czwartek ze zniecierpliwieniem odświeżają stronę w oczekiwaniu na posta - jeśli są to przepraszam za tę sytuację. Postaram się poprawić :) Do rzeczy jednak. Dziś chciałbym poruszyć temat rzekę - czyli jak oszczędzać na emeryturę.

Ale zanim o tym jak oszczędzać, to najpierw odpowiem na pytanie czy oszczędzać i dlaczego. Jeśli czytasz ten artykuł to prawdopodobnie wiesz już, że oszczędzać na emeryturę należy. W mediach zaczęło się o tym mówić, pojawiają się reklamy o młodych bogach itd. Wydaje mi się, że obecni 20-30-40 latkowie mają świadomość tego, jak będą wyglądały ich emerytury z ZUS - szczególnie w kontekście ostatniego obniżenia wieku emerytalnego. Jeśli jednak ktoś ma jeszcze jakieś wątpliwości, to polecam uważne przyjrzenie się poniższemu wykresowi
Źródło: http://grape.org.pl/blog/co-dokladnie-oznacza-obnizanie-wieku-emerytalnego-w-polsce/

Jeśli zatem masz 20-30 lat, to masz około 70% szans na to, że twoja emerytura od państwa będzie minimalna. Na tę chwilę jest to chyba 880zł, od 1 października 1000zł. Co prawda co roku coś się zmienia w systemie emerytalnym, ale myślę że najbezpieczniej jest założyć, że większość emerytury (jeśli nie całość) musimy sobie zapewnić samemu.

Powróćmy jednak do głównego wątku. Tytułowe pytanie usłyszałem ostatnio od jednej ze znajomych i w pierwszej chwili nie wiedziałem co odpowiedzieć. Jest tyle możliwości, że mógłbym opowiadać o tym przez kilka godzin. Jak streścić te wszystkie opcje tak, żeby nie przytłoczyć i nie zniechęcić? Czy zagłębiać się w inwestowanie na giełdzie albo w kupno funduszy inwestycyjnych? Dużo przecież zależy też od profilu danej osoby i tego, ile czasu chce poświęcić na zarządzanie swoimi oszczędnościami.

Najlepszą odpowiedzią jaka mi przyszła do głowy jest: przede wszystkim oszczędzaj. Odkładaj co miesiąc stałą kwotę, najlepiej około 10% swoich dochodów na oddzielne konto. Nie możesz odkładać aż tyle? Odłóż najpierw 100 zł miesięcznie i w miarę możliwości (np. po otrzymaniu podwyżki wynagrodzenia) zwiększaj tę kwotę. Utwórz zlecenie stałe, które zaraz po wypłacie przeleje pieniądze na ten cel - jeśli zostaną odłożone już wtedy, to na pewno ich nie wydasz. Ważna jest przede wszystkim systematyczność. Jeśli osiągniesz ten krok, to dopiero wtedy możesz przejść dalej.

Drugą ważną rzeczą jest korzystne oprocentowanie Twoich środków na emeryturę. Magia procentu składanego naprawdę działa. Na początku (przynajmniej mi) wydawało się, że oszczędności przyrastają powoli - trzeba jednak pozwolić im pracować, a przez kilkadziesiąt lat odsetki od zgromadzonej kwoty prawdopodobnie przekroczą wpłacony kapitał. Dla przykładu wezmę opcję minimum z poprzedniego punktu (czyli 100 zł). Na poniższych wykresach widać, jak zachowuje się zaoszczędzona kwota kiedy odkładamy ją regularnie przez 30 lat. Pokazuję dwa warianty - rachunek oprocentowany na 3% i 5% rocznie z naliczaniem odsetek co miesiąc.
Jak na dłoni widać, jak dużą różnicę robi każdy punkt procentowy więcej w kwestii ostatecznej kwoty jaką otrzymamy. Celowo pominąłem na powyższych obliczeniach podatek Belki, czyli 19% podatku od zysku. Pominąłem go dlatego, żeby teraz pokazać jak zachowa się zaoszczędzona kwota kiedy ten podatek uwzględnię
W tym wariancie jest to ponad 13000 zł różnicy pomiędzy tymi dwiema opcjami i to odkładając jedyne 100 zł miesięcznie. Piszę o tym dlatego, bo chcę pokazać wymierne korzyści z posiadania konta IKE lub IKZE, które są zwolnione z podatku od zysków kapitałowych. Nawet odkładając niewielkie kwoty z myślą o zabezpieczeniu emerytury warto założyć jedno z tych kont. Jest to najłatwiejsza metoda na korzystniejsze efektywne oprocentowanie i poprawienie ostatecznego wyniku jaki osiągniesz. Najprostszą wersją takiego konta (bezpieczną i nie zajmującą czasu) będzie lokata bankowa pod "parasolem" IKE. Najlepsze warunki takiego IKE ma obecnie bank Millenium, który oferuje 3% na lokacie z kapitalizacją roczną.

Opisałem dwa punkty na drodze do spokojnej emerytury, o które moim zdaniem każdy powinien zadbać. To jednak nie koniec, bo sposobów na poprawienie ostatecznego wyniku jest więcej. Ja nie zamierzam zadowolić się maksymalnie 3% które płacą banki na IKE w postaci lokaty. W kolejnej części opiszę, jak można próbować wyciągnąć więcej i jak może się do tego przydać Portfel Emerytalny który piszę.

11 kwi 2017

Raport z placu boju - 6 tydzień DSP

Dzisiejszy raport wyjątkowo pojawia się we wtorek, czyli dzień później niż wynikałoby to z mojego planu i wcześniejszych zapowiedzi. W ubiegłym tygodniu sprawy prywatne zajęły mi cały dostępny czas i niestety nie udało mi się nic zrobić w projekcie. Nie chciałem wrzucać wpisu tylko po to, żeby opisać w nim, że nic nie zrobiłem - dlatego właśnie postanowiłem odłożyć posta na dzień później, a w międzyczasie postarać się o materiał na niego. Właśnie z tego względu nie mam dziś do opisania zbyt wiele, ale lepsze to niż nic :)

W projekcie pojawiły się nowe tabele w bazie danych: wallet i asset . Będą one służyły do przechowywania odpowiednio:
  • portfeli, czyli zbioru inwestycji danego użytkownika. W portfelach na razie będą mogły być tylko jednostki funduszy inwestycyjnych, ale docelowo również akcje, obligacje, gotówka itp.
  • pojedynczych składników z których jest zbudowany portfel. W tej tabeli znajdą się posiadane ilości jednostek funduszy oraz daty ich zakupu i ewentualnej sprzedaży. Zawartość tej tabeli można także rozumieć jako operacje wykonywane w portfelach
Zostały również dodane nowe metody w API, które także dotyczą portfela i operacji na nim. Można więc za pomocą API pobrać listę aktualnie posiadanych walorów i historię operacji. Musiałem dopisać też kilka pomocniczych metod jak np. pobranie listy dostępnych funduszy. Dodałem również możliwość wysłania do API informacji o kupnie i sprzedaży jednostek funduszy. Tu jednak musiałem się zatrzymać, bo zanim będę mógł dodawać kolejne operacje, które można wykonać, to muszę przemyśleć jak będzie wyglądała autentykacja i autoryzacja użytkowników.

Ostatnią rzeczą na którą poświęciłem kilka chwil to badanie możliwości automatycznego pobierania kursów funduszy. Każde towarzystwo funduszy inwestycyjnych ma obowiązek publikowania wyników prowadzonych przez siebie inwestycji, więc te dane są publicznie dostępne. Problemem pozostaje ich pobranie, bo prawdopodobnie będzie trzeba pisać dedykowaną metodę dla każdego TFI. Rozważałem również użycie narzędzi do testowania interfejsów użytkownika (jak np. Selenium), któremu mógłbym wskazać jaką stronę ma otworzyć, jaki przycisk kliknąć i gdzie zapisać wygenerowany plik. Zbadałem jak to wygląda w przypadku NN TFI i udało mi się wyłuskać z kodu linki pod jakimi są dostępne notowania konkretnych funduszy. Otwiera to drogę do jakiegoś prostego pobieracza tych plików, ale to już temat na kolejne tygodnie.

6 kwi 2017

4developers 2017 z mojej perspektywy

W ostatni poniedziałek miałem przyjemność uczestniczyć w interdyscyplinarnym festiwalu technologicznym 4developers, czyli jednej z największych konferencji dla programistów w Polsce. Dziś, kilka dni po tym wydarzeniu, chciałbym podzielić się moimi spostrzeżeniami i przemyśleniami na jego temat.

Konferencja odbyła się w Warszawie w hotelu Sangate Airport. Na 3 piętrach części konferencyjnej można było uczestniczyć w aż 14 ścieżkach tematycznych, dodatkowo dla uczestników została przygotowana strefa relaksu z pufami i rozrywkami w stylu ping-ponga czy konsoli. Ogólnie sporo miejsca, ale uczestników też było mnóstwo. Organizatorzy mówią o 1800 osobach, co zdecydowanie dało się odczuć. Momentami było po prostu odrobinę tłoczno, szczególnie na klatkach schodowych. Poza tą drobną niedogodnością obiekt gdzie odbywała się konferencja był bardzo dobrze przygotowany - duży plus dla organizatorów.

Co do samego przebiegu wydarzenia, to ja spędziłem go bardzo aktywnie. Ilość dostępnych ścieżek wręcz przytłaczała i niejednokrotnie stawałem przed trudną decyzją, który wykład wybrać spośród kilku opcji. Liczę na to, że pojawią się nagrania tych, które musiałem odrzucić i będę mógł nadrobić niemożliwość rozdwojenia się :) 15 minut przerwy pomiędzy kolejnymi pozycjami agendy jest w sam raz żeby wypić kawę i zmienić salę, ale jeśli czytasz to przed kolejną edycją to lepiej zaplanuj co chcesz zobaczyć już dzień wcześniej.

Jeśli chodzi o prelekcje, to te na które trafiłem merytorycznie były bardzo dobrze przygotowane. Jedyny minus - zdarzyło się, że musiałem siedzieć na podłodze, bo zabrakło miejsc. Nie mogę tu jednak nikogo winić za taki stan rzeczy, pewnie gdybym wcześniej na nie przychodził to nie byłoby tego problemu ;)

Co udało mi się wynieść z konferencji i na co warto zwrócić uwagę

  • Konrad Kokosa opowiedział o ETW, czyli mechanizmie Event Tracing for Windows. Świetne rozwiązanie do śledzenia co dzieje się z naszą aplikacją i jak współpracuje ona z systemem. Ma bardzo niewielki narzut, co pozwala stosować go nawet w środowisku produkcyjnym. Wygląda na niezwykle pomocne w szukaniu skomplikowanych błędów.
  • .NET Core - Microsoft dwoi i się i troi żeby udostępnić jedno środowisko dla wszystkich platform i idzie mu coraz lepiej. Łukasz Pyrzyk zgrabnie podsumował w jakim stanie aktualnie znajduje się .NET Core i powiedział o nowych funkcjach jak Span<T>, ArrayPool czy ValueTask. Rewolucji może nie będzie, ale ewoluuje w zdecydowanie dobrym kierunku.
  • Serverless - na ten temat był nawet więcej niż jeden wykład, ja byłem na tym gdzie prezentował Jakub Gutowski (znany jako Gutek). Serverless zmienia podejście do pojęcia serwera, niejako zwalnia z myślenia o nim. Można to określić jako nanoserwisy - wrzucamy na serwer wręcz pojedyncze funkcje które wywołujemy jak usługi. Skalowaniem rozwiązania zajmuje się dostawca, płatność jest za ilość wywołań. Ciekawy trend który warto kojarzyć.
  • GraphQL - jedna z ostatnich nowości w tworzeniu elastycznych API. Pozwala korzystającemu z naszej usługi na zdecydowanie, jak szeroki zakres danych chce otrzymać w odpowiedzi. Powinno zainteresować każdego, kto buduje API dla wielu klientów i każdy z nich potrzebuje innego zestawu danych w odpowiedzi na to samo zapytanie. Prezentował Piotr Gankiewicz - zwycięzca Daj Się Poznać 2016.
  • Porty i adaptery - architektura wręcz niezbędna dla każdej większej aplikacji biznesowej, znam i korzystam, ale Dominik Przybysz pomógł mi swoim wykładem nieco lepiej usystematyzować wiedzę.
Podsumowując - czy warto kupić wejściówkę? Moim zdaniem warto, bo konferencja jest solidnie zorganizowana, nie ma żadnego pitu-pitu tylko zastrzyk naprawdę solidnej wiedzy. Pro-tip: warto przed zakupem poszukać kodu rabatowego, można kupić bilet 15-20% taniej. Mam zatem nadzieję, że widzimy się na kolejnej edycji!

3 kwi 2017

Raport z placu boju - 5 tydzień DSP

Cześć! Tym wpisem rozpoczynam cotygodniową serię raportów z tworzenia Portfela Emerytalnego. Tak jak pisałem w ostatnim poście teraz takie podsumowania będą pojawiać się raz na tydzień w poniedziałki i będą zawierać podsumowania co udało się zrobić w ostatnim czasie w moim projekcie na konkurs Daj Się Poznać 2017.

Szablon strony

W ostatnim tygodniu znalazłem gotowy, darmowy szablon strony na podstawie którego będę budował interfejs użytkownika. Zależało mi na tym, aby mieć jak najmniej pracy związanej z  dostosowywaniem szablonu do moich potrzeb, dlatego od razu szukałem takiego, który będzie przystosowany do Angular 2. Ważne było też, żeby działał zarówno na dużych ekranach komputerów, jak i na smartfonach. Ten który znalazłem jest responsywny, zbudowany na bootstrap i wykorzystuje Material Design od Google. Material Design daje jeszcze jedną, istotną zaletę - zbiór gotowych komponentów do wykorzystania: https://material.angular.io/.
Nie może być jednak idealnie i szablon miesza trochę czystego JavaScript z TypeScriptem, ale mam nadzieję to uporządkować w trakcie rozwoju aplikacji.

Twórca zrobił tutaj kawał dobrej roboty, więc w podziękowaniu link do strony: https://www.creative-tim.com/product/material-dashboard-angular2

Dostosowanie szablonu

Pobrany szablon musiałem jeszcze zintegrować z wygenerowaną z angular-cli aplikacją i na jego podstawie zbudować zalążek tego, jak będzie się prezentował interfejs użytkownika Portfela Emerytalnego. W tej kwestii czeka mnie jeszcze sporo pracy, ale pierwsze rezultaty prezentują się następująco:

Zmiana biblioteki do wyświetlania wykresów

Ostatnią zmianą wprowadzoną w ubiegłym tygodniu jest rezygnacja z ng2-charts, którego pierwotnie chciałem użyć do wyświetlania wykresów. Podjąłem wiele prób wyświetlania danych przy użyciu tej biblioteki, rozwiązałem wiele pojawiających się problemów, ale wykresy nadal nie działały tak jak oczekiwałem. Przykładem niech będzie to, że kiedy zmieniałem ilość punktów które ma wyświetlić wykres to ten rzucał błędem parsowania.
Żeby nie zamieniać programowania w hackowanie tej biblioteki żeby działała, postanowiłem spróbować innego rozwiązania. Wybrałem angular2-highcharts, który okazał się idealnym rozwiązaniem wolnym od problemów z którymi zetknąłem się używając ng2-charts. Dodatkowo highchart od ręki obsługuje wykresy, na których możemy wybrać zakres czasu dla jakiego zostaną pokazane dane.
Kolejna rzecz mniej do napisania samemu, co ostatecznie zadecydowało o wyborze tego rozwiązania.

To tyle jeśli chodzi o dzisiejszego, opóźnionego posta. Na kolejne podsumowanie zapraszam za tydzień.