Posty

Wyświetlanie postów z 2017

Heroku: Lesson learned

Podczas moich kilkudniowych zmagań z postawieniem aplikacji na Heroku były komendy i zaklęcia, których używałam częściej, niż innych. Były też przekleństwa, których używałam równie często, ale to nie czas i miejsce na taki post. Napotkałam też kilka problemów, które wymagały mniej lub więcej googlowania. Na przykład: app[web.1]: Exception in thread "main" com.typesafe.config.ConfigException$Missing: No configuration setting found for key 'youtube' Rozwiązaniem jest dodanie zmiennej środowiskowej. Można to wyklikać w Heroku, ale najprostsze rozwiązanie to: $ heroku config:set youtube.apiKey="xyz" # dla jednej z kilku aplikacji, będzie analogicznie heroku config:set youtube.apiKey="xyz" --remote speech-rank-api Innym problelem, który napotlałam na początku był brak dyno'sów, objawiający się takimi oto błędami: heroku[router]: at=error code=H14 desc="No web processes running" method=GET path="/favicon.ico" host=sp

Ola:Heroku 1:1 - wprowadzka do Heroku cz. 3

Trochę się nagimnastykowałam, próbując różnych rozwiązań, żeby uruchomić równocześnie Gradle i NodeJS na tej samej platformie. Niestety w darmowej wersji Heroku jest to niewykonalne. Każdy z tych wątków musi być uruchomiony na dyno typu web , żeby posiadał adres inny, niż localhost. Postanowiłam stworzyć dwie aplikacje na Heroku, speech-rank i speech-rank-api . Składnia jest dość toporna, bo przy tworzeniu wielu aplikacji dla tego samego repo trzeba  $ heroku create --remote speech-rank-api speech-rank-api pierwsze speech-rank-api odwołuje się do nazwy roboczej, której będziemy używać w konsoli, drugie do nazwy aplikacji na Heroku.  Zmieniłam też sposób uruchamiania aplikacji na Express , żeby łatwiej było ładować statyczny kontent i mój index.js wygląda następująco: var express = require('express') const path = require('path'); var app = express() app.set('port', (process.env.PORT || 80)) app.use(express.static(path.join('.', 'build

Historia z pola bitwy - wprowadzka do Heroku cz. 2

Słowa na dziś: dyno i buildpack . Walka z Heroku trwa, deployowanie aplikacji w kilku technologiach jest dość skomplikowane, albo wielkanocne babki uruchomiły już bombę insulinową... Zaczęłam trochę od końca, bo najpierw ustawiłam buildpacki  $ heroku buildpacks:set heroku/nodejs $ heroku buildpacks:add --index 1 heroku/gradle Później zorientowałam się, że potrzebuję coś, co nazywa się Procfile  (nie mylić z   procfile , Procfile.txt , albo Procfile.conf ). Tam należy określić, jakie komendy mają być wywołane, żeby stworzyć dynos . Dyno to linuxowy kontener, który wywołuje pojedynczą komendę, taka zakładka terminala.  Ja określiłam najpierw buildpacki. Pięknie wykonywał mi się build, najpierw gradle, później node na podstawie skryptów z package.json "scripts": { "local-web-server": "ws -d build/web", "gulp": "gulp", "build": "gulp", "start": "npm install", "postin

Aplikacjo, wo wohnst du? Wprowadzka na Heroku cz. 1

Postanowiłam dodać logowanie do SpeechRank za pomocą Twittera. Do tego potrzebna jest implementacja OAuth, która wymaga własnego kawałka miejsca w internecie. Można tego dokonać z poziomu localhost'a, ale skoro już rzucam się na głęboką wodę i jest to dla mnie czas nauki, postanowiłam, że miejscem dla mojej aplikacji będzie Heroku . Kiedyś postawiłam tam projekt w Railsach, ale jeszcze nigdy nie budowałam tam gradlowo-nodowej aplikacji.  Heroku jest platformą, która pozwala na budowanie i deploy'owanie aplikacji w chmurze. Można ją skonfigurować, żeby współpracowała z Travisem, o którym pisałam niedawno . Heroku trzeba zainstalować, na przykład za pomocą brew , a potem stworzyć projekt, ja wpisałam w ścieżce do mojej aplikacji $ heroku create speech-rank $ git push heroku master Zauważ, że wskazujesz, jaki branch ma być deployowany. Czyż to nie cudowne, że mogę to modyfikować i wrzucać feature branch'e, żeby je tam przetestować? Zwłaszcza, kiedy testowanie wymaga ki

Pokaż mi kod z produkcji, a powiem ci... że się niczego nie boisz

Odkąd rozwijam aplikację SpeechRank  do oglądania wystąpień z konferencji, inaczej patrzę na prelekcje. Akurat trwa  Scalar , podczas którego nagrywani prelegenci  uczą i  bawią  publiczność monadami, makrami, typeclass'ami i innymi czeluściami języka. Tyle, że wszystkie te elementy (jak kiedyś wspominał Michał Płachta ) wchodzą w skład złożoności przypadkowej. Natomiast złożoności właściwej, mającej związek z problemami natury biznesowej w wystąpieniach jest jak na lekarstwo. Historie z bitew i wojen wygranych na produkcji po krwawych starciach z kompilatorem, bibliotekami, lambdami, aktorami i Future' ami są raczej w mniejszości.  Myślałam przez chwilę, że może ta społeczność gardzi kodem produkcyjnym, uznając za punk honoru pull requesty do Akki . Albo, że to przez fakt związania Scalara z jedną technologią. Ale jak sięgam do wspomnień z innych konferencji, to wszędzie jest podobnie. Co ciekawe, najchętniej oglądamy wystąpienia z praktycznymi wskazówkami, płynącymi z boga

Karotkowe Wyzwanie Technologiczne - dodam OAuth2.0 do mojej aplikacji

Mamy kwiecień i coraz trudniej jest stać przy komputerze, kiedy na zewnątrz słońce i wybuchająca wiosna... Postanowiłam więc określić cel na ten miesiąc, takie minimum, które muszę osiągnąć, żeby mieć poczucie postępu. Takim elementem, który jest kluczowy dla aplikacji Speech Rank , a jeszcze nie został dotknięty, jest autoryzacja. Użytkownicy mają mieć możliwość logowania za pomocą Twittera, ewentualnie GitHuba, więc potrzebny będzie standart OAuth2.0. Miałam go już w kilku projektach, ale nigdy nie pisałam go własnoręcznie, więc to chyba dobre wyzwanie. Dlaczego akurat Twitter? Celem aplikacji jest nie tylko oglądanie filmików, ale przede wszystkim inspirowanie się tym, co oglądają inni. Na Twitterze obserwujemy zazwyczaj swoich mentorów, swoje autorytety i inżynierów ze swojej lokalnej społeczności. Jestem przekonana, że odkrywanie wystąpień, które zostały wysoko ocenione przez te osoby byłoby cenną wiedzą i wielką oszczędnością czasu.  Tak się świetnie złożyło, że startuje Karo

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

Hello World!

Cześć, mam na imię Ola i jestem programistką.