Hej,
mój pierwszy post na forum i od razu zwracam się do Was z gorącą prośbą o podzielenie się opinią na temat aplikacji, którą tworzę.
Wersja live: http://marketdata.com.pl (powinna działać poprawnie w Safari, Chrome, Firefox)
Repozytorium: https://bitbucket.org/olafd/bossadatareader/src/master/
Na wstępie dodam, że doświadczenia zawodowego nie mam (a sama aplikacja ma mi pomóc w znalezieniu pracy jako programista), a uczę się programować od dobrego roku.
Wrzuciłem do repo plik .jar więc do uruchomienia powinna wystarczyć komenda:
java -Dspring.profiles.active=h2 -jar bossaDataReader-0.0.1-SNAPSHOT.jar
W takim wypadku aplikacja korzysta z bazy testowej H2, dla MySQL potrzebna jest konfiguracja pliku application.properties
Dane można załadować w wersji podstawowej lub rozszerzonej wówczas dodatkowe informacje są scrapowane z zewnętrznego serwisu.
Przetestowałem przed chwilą powyższą opcję i okazuje się, że na słabszej maszynie może pojawić się problem z pamięcią. Domyślam się zresztą, że taki sposób ładowania danych do bazy jest raczej mocno naiwny. Włączyłem i zwiększyłem batch oraz alokację id do absurdalnych rozmiarów co przyśpieszyło cały proces o jakieś +/- 50%, ale na końcu w starciu z darmowym AWS i tak takie rozwiązanie nie zdało egzaminu i obecnie dane ładuje lokalnie, łączę się zdalnie z bazą AWS i wrzucam już istniejącą DB. Wiem, że można wrzucić dane bezpośrednio z plików CSV, ale co wówczas z tworzeniem relacji oraz mapowaniem w Javie? Jak ktoś ma jakieś sugestie jak to lepiej rozwiązać to zapraszam do dyskusji.
Podstawowym celem jest umożliwienie użytkownikowi pobieranie historycznych notowań:
- spółek z rynku głównego GPW;
- spółek z rynku NewConnect;
- indeksów GPW;
- wybranych indeksów giełd światowych.
Jak i również wycen/kursów:
- jednostek uczestnictwa funduszy inwestycyjnych;
- OFE;
- kursów walut NBP.
Bardziej szczegółowy opis można znaleźć w pliku ReadMe w repo.
Stack: Java 8, Spring, Spring Boot, Thymeleaf + jQuery i odrobina Bootstrapa oraz AWS jako hosting. Dlaczego tak, a nie inaczej? Bo w tym potrafiłem to zrealizować.
Obecnie jestem całkiem zadowolony z całej tej konstrukcji zwłaszcza gdy porównam wersje obecną z tą, która jako pierwsza trafiła na AWS. Ostatnie 2 miesiące to ciągły refactoring, który gdy spojrzałem na liczby (wszystko poszło w jednym komincie, a jak) skończyło się na 207 stworzonych/edytowanych plikach czyli, o zgrozo, prawie cała aplikacja powstała od nowa.
Z czego nie jestem zadowolony to na pewno mam sporo rzutowania, którego nie potrafiłem wyeliminować. Najbardziej jednak nie podoba mi się zastosowanie tabeli pośredniczącej dla każdego typu aktywa, która zawiera id każdego profilu oraz id ostatniego notowania/wyceny/kursu. Próbowałem to rozwiązać. Miałem JoinColumn, które mi fajnie wyciągało ostatnie dane, ale wówczas nie mogłem wyciągnąć jednym zapytaniem wszystkich aktywów z ostatnimi danymi, a było to kluczowe dla aktualizacji.
@ManyToOne
@JoinFormula(value = "(SELECT s.id FROM single_listing_days s where s.company = id ORDER BY s.date DESC LIMIT 1)")
private SingleListingDay singleListingDay;
Nie wiem, może trzeba by użyć bezpośrednio EntityManagera chociaż pewnie jest sposób żeby to zrobić przy użyciu samego springowego repo. Dodatkowo też w kilku miejsca interfejs ma metodę, która ma faktyczną implementację tylko w niektórych implementujących go klasach. Średnio mi się takie rozwiązanie podoba.
Domyślam się również, że sporo może być uwag odnośnie frontendu. Przede wszystkim nie jest to element na którym chce się skupiać i powstał przede wszystkim żeby móc testować i zaprezentować funkcjonalności. Jest to również temat w którym mam najmniej godzin przy kodzie dlatego wiele elementów sprawiało mi problem. Można więc uznać to bardziej za prototyp. Nie wykluczam jednak, że wraz z dodaniem kolejnych funkcji zdecyduję się na przebudowę i być może wykorzystam to jako pole do nauki jakiegoś frameworka. Zdaje sobie również sprawę, że punktowe wykorzystanie Bootstrapa z jego wyizolowanym CSS nie jest zbyt fortunnym rozwiązaniem, ale na ten moment jest jak jest bo bym nie skończył ciągle czegoś poprawiać.
Generalnie to co możecie obejrzeć to dla mnie core aplikacji, który musiałem stworzyć żeby móc dalej myśleć o tworzeniu tego co było moim celem od początku czyli przetwarzanie tych danych. Chcę zacząć od podstaw jak stopy zwrotu, inne miary statystyczne, możliwość porównywania poszczególnych spółek, być może symulacje wyników danego portfela. Jeszcze nie mam pojęcia jak to zrobię, ale bez tego co do tej pory stworzyłem nie byłbym w stanie nic zrobić. Dlatego proszę Was o podzielenie się sugestiami przede wszystkim w tym kontekście co by można teraz jeszcze poprawić żeby później nie wpaść na minę.
Za wszelkie sugestie/opinie z góry dziękuję.