Posty

Wyświetlanie postów z marzec, 2017

Import konferencji - zmagania z Angularem

Minęło trochę czasu od moich ostatnich doświadczeń z Angularem, więc nie było łatwo dopisać nową funkcjonalność, ale udało się! Można już importować pojedynczą konferencję do Speech Rank 'a! Esteci nie będą jeszcze zachwyceni, ale działa, więc się pochwalę.  Przygotowałam podstawowy formularz zbierający dane konferencji: rok, nazwę i ID (ID playlisty z Youtuba, póki co), który odpala funkcję  importConference na kontrolerze: <h4 class="import-title">Import conference</h4> <div class="form-group"> <label>Name</label> <input type="text" class="form-control" ng-model="conference.name" placeholder="Boiling Frogs" /> </div> <div class="form-group"> <label>Year</label> <input type="text" class="form-control" ng-model="conference.year" placeholder="2016" /> </div> <div class="form-

RED -> GREEN, czyli jak Travis wykrył NPE

Jak pisałam ostatnio , zepsułam builda mojego pierwszego builda w Travisie. W zasadzie zepsułam ich kilka. Najpierw nie miałam pliku travis.yml i budowniczy nie bardzo wiedział, co ma zrobić z moim kodem. Później dodałam najprostszą możliwą postać pliku language: java Niestety to nie pomogło, bo Travis nie bardzo rozumiał Javę 8 i znalazł 100(!) błędów. Dodałam kolejną wersję konfiguracji: language: java jdk:       - oraclejdk8 addons:        apt:             packages:                   - oracle-java8-installer I tym razem wszystko się ładnie zbudowało, ale jeden test się zaczerwienił (i to jest prawdziwa faza RED). Okazało się, że w przypadku braku API Key do Youtube'a, o którym pisałam jakiś czas temu , importer rzuca NullPointerException , zamiast zwracać pustą listę. Był to błąd w implementacji i mogło się to przydarzyć w przypadku braku klucza lub jego przeterminowania. Wielkie brawa dla Travisa, również za ogarnięcie adnotacji Lomboka! Oczywiście nie omiesz

You broke the build - mój pierwszy czerwony build w Travisie

Kiedy pracuje się nad projektem w pojedynkę bardzo łatwo odłożyć Continuous Integration i pisanie testów na później. Dużo później. Mały projekt testuje się głównie manualnie, zwracając uwagę na nowe funkcjonalności. I niech pierwszy rzuci kamień ten, kto nigdy tak nie robił. To oczywiście nie jest dobre, bo kiedy już wyjdziemy z projektowej piwnicy i pokażemy projekt światu, a nawet zaprosimy świat do projektu, fajnie jest mieć jakieś narzędzie monitorujące stan kodu. Nie ma chyba programisty, który nie zna pana Jenkinsa i jego czerwonej muszki. On, jak nikt inny, potrafi powiedzieć z klasą, że popełniliśmy błąd i byłoby elegancko go naprawić, zanim nasz projekt dopadnie syndrom rozbitej szyby. Miałam jeszcze przyjemność pracować z Bamboo , które jest trochę bardziej intuicyjnie i pozwala na łatwiejszą integrację z innymi zabawkami Atlassiana (typu Jira i Bitbucket). Ostatnio dowiedziałam się o  Travisie . To znaczy, widziałam go już w wielu projektach, ale nigdy w swoim.  Postano

Ratpack dla szybkich i czytelnych RESTów

Jeszcze niedawno Ratpack był rozwiązaniem hipsterkim (co podkreśla domena .io), ale w O'Reilly wydali książkę Learning Ratpack i nieodwracalnie dołączył do mainsteamu. I słusznie, bo jest prostym, ale wielofunkcyjnym narzędziem, takim szwajcarskim scyzorykiem HTTP. Dla mnie chyba największą jego zaletą jest czytelność kodu. Po wejściu do klasy  RatpackRestServer po roku, nie musiałam się zastanawiać, co się tam wydarzyło.  Ratpack opiera swoje działanie o handlery. Handler jest opakowaniem dla funkcji działającym na zadanym kontekście. Implementuje tylko metodę  handle(final Context ctx) . Może zwrócić odpowiedź, albo wykonać swoją pracę i oddelegować kontekst, podając listę handlerów lub wywołać context.next() . Speech Rank  póki co, używa jednego handlera, zarządzającego kontrolą dostępu (Access-Control), ale pewnie w przyszłości będzie potrzeba dodania innych. public class CORSHandler implements Handler {     @Override     public void handle(final Context ctx) throws E

Praca z Youtube Data API

Pierwszym właścicielem danych, które są udostępniane w Speech Rank jest YouTube, a właściwie Google. Żeby móc komunikować się z ich API, potrzebny będzie klucz (API Key), który można samodzielnie wygenerować w  Google Developers Console . Najlepiej generować klucz dla każdego projektu osobno. Jeśli jesteśmy już szczęśliwymi posiadaczami klucza, najlepiej jest go umieścić w bezpiecznym miejscu poza kodem, najlepiej poza gitowym repozytorium, żeby przypadkiem nie dodać go do commita. Uwierzcie, to nie jest takie nieprawdopodobne jak się wydaje, a czyszczenie repo z historii jest dość skomplikowaną i mało elegancką akcją. Po publicznych repozytoriach krążą crawlery, które szukają kluczy. Jeśli więc zdarzy się push do repo, najlepiej wygenerować nowy klucz. Żeby pracować z samym kodem i rzutować zaciągnięte dane do obiektów, niezbędna jest biblioteka YouTube Data API . W gradle jest to dodanie jednej linijki: compile 'com.google.apis:google-api-services-youtube:{version}' O

Fullstack, czyli party hard, like it's 2016

Obiecałam szczegóły techniczne, więc dzisiaj będzie o technikaliach. Applikacja Speech Rank jest podzielona na frontend i backend. Frontend serwuje obrazy i filmy oraz wysyła zapytania do RESTowego API na backendzie. Backend odpowiada za komunikację z zewnętrznymi stronami serwującymi filmy z wystąpieniami z konferencji, typu Youtube i Vimeo. Za budowanie frontendu odpowiada Gulp , a backend budowany jest przez Gradle . Aplikacja działa jako SPA ( Single-page application ), co zapewnia Angular 1.6. Style CSS są preprocesowane przez  Less . Restowe API jest napisane w Javie, ale z użyciem ciekawych bibliotek i pluginów, które sprawiają, że kodu jest mniej i jest bardziej czytelny. Przede wszystkim JavaSlang , czyli biblioteka, która czyni Javę bardziej "funkcyjną". Jest to tylko cukier syntaktyczny, ale pisze się przyjemniej. Po drugie, Lombok . Jeśli jak ja uważacie, że gettery, settery i konstruktory są szumem, to pokochacie ten plugin. Ich strona jest jak wyjęta z lat 9

Speech Rank, czyli veni, vidi, inspiratum a ...

Pomysł na Speech Rank narodził się przy obiedzie. Chcieliśmy oglądać wystąpienia z konferencji w jednym miejscu, bez względu na platformę, czy organizatora wydarzenia. Chcieliśmy inspirować się tym, co oglądają inni i zobaczyć najlepsze filmy wszech czasów. Obecnie w IT jest tak dużo spotkań i konferencji, że ciężko nadążyć za tym, że są (bo ciągle pojawiają się nowe), nie mówiąc o obejrzeniu wszystkiego. Tym bardziej, że punkt ciężkości przesuwa się z kilkudniowych imprez z udziałem gwiazd ze świata, w stronę lokalnych, mniej znanych, ale wypchanych po brzegi nową wiedzą spotkań. Postanowiliśmy stworzyć platformę wymiany wiedzy i inspiracji, która pozwala nie tylko na oglądanie wystąpień, ale przede wszystkim na tworzenie grup i śledzenie tego, co oglądają inni. Prosty system punktacji pozwoli nam na ocenianie każdego obejrzanego filmu i wyłuskanie tych najciekawszych. Podczas zeszłorocznego hack.summit()  stworzyliśmy szkielet aplikacji, który dostał się do pierwszej setki najl