Tydzień drugi pod znakiem Codepote’u

Tydzień I : 29.08-04.09.2015

PLAN:

  1. Gem Pry
  2. Ciekawostki z konferencji Codepot
  3. AWD with Rails 4: 91..106?! Caching!

1. Gem PRY

Nie pamiętam kiedy ostatnio byłam pod tak wielkim wrażeniem jakiegoś narzędzia i kiedy czytając o nim właściwie przy co drugiej linijce myślałam „Kurczę. Brakowało mi tego kiedyś”

Czym jest Pry?

  • bardzo rozbudowaną alternatywą dla IRB – aspiruje do bycia REPL-em dla Ruby’ego (interaktywnym środowiskiem programowania)
  • może świetnie służyć jako debugger dzięki tzw. runtime invocation (o tym niżej)
  • przydatny w konsoli Rails
  • najważniejsze features’y: kolorowanie składni (może wydawać się trywialne, ale wbrew pozorom jest bardzo przydatne), łatwy dostęp do dokumentacji i kodów źródłowych, wspomniany runtime invocation

Instalacja: gem install pry
Uruchomienie: pry

Wybrane* możliwości

*oczywiście – nie opisuję wszystkiego, co daje Pry. Starałam się wybrać rzeczy najważniejsze, których potencjalna potrzeba użycia jest spora 😉

User input, przydatne przy pisaniu metod, iteratorów itp.
  • ! – pozwala na przerwanie definiowania metody, pętli
  • ; – wykonanie działania bez wypisywania co zwraca (przydatne przy działaniach, gdzie output byłby ogromny typu „test” * 1000)
  • show-input – wypisanie „co napisaliśmy do tej pory” – przydatne przy wieloliniowych definicjach
  • amend-line 2 puts „poprawna wersja” – kiedy w czasie definiowania chcemy zmienić drugą linijkę na puts „poprawna wersja”, bo zauważyliśmy, że wkradł się tam błąd
  • amend-line 2..3 ! – usunięcie wskazanych linijek
  • edit – w czasie definiowania – przejście do edytora: pojawiają się w nim jako plik tymczasowy dotychczas napisane linijki kodu; po zapisaniu i zamknięciu – powrót do konsoli ze zdefiniowaną
Source browsing, Documentation browsing
  • pry pozwala na łatwe przeglądanie kodu źródłowego oraz dokumentacji metod i klas
  • show-source – bez argumentu – związane z runtime invocation – źródło obecnie odpalonej metody
  • show-source -l – kod z ponumerowanymi liniami ( -b – od 1)
  • show-source gem-install – możemy podejrzeć również kody źródłowe komend
  • show-doc – podobna obsługa argumentów co show-source
  • stat – podstawowe informacje o metodzie m.in.: argumenty, właściciela
Special locals, specjalne zmienne lokalne
  • _ – wynik ostatniego wywołania
  • _ex_ – ostatni wychwycony wyjątek
  • _in_ , _out_ – tablice zawierające historię inputów i outputów
Shell Integration, powiązanie z komendami konsoli
  • zaczynają się od .
  • .ls -l
  • .git status – pozwala na odpalanie poleceń gita czy rake z poziomy Pry
  • możliwość wykorzystania interpolacji ruby’ego #{}
  • wbudowany cat Pry – zapewnia podświetlenie składni wielu formatów
Runtime invocation, czyli uruchamianie w czasie działania programu
  • binding.pry – wywołanie Pry w danym momencie wykonywania
  • równoczesne wywołanie z wherami – mamy od razu wyświetlony context w jakim zostało zatrzymane działanie
  • w momencie kiedy natrafia na binding.pry – wstrzymanie działania, a my możemy operować na lokalnych zmiennych, sprawdzić je, spróbować coś na nich wykonać…
  • pry-backtrace pozwala na prześledzenie „jak trafiliśmy” na nasze binding.pry
  • exit przejście dalej
  • WAŻNE: można używać w Railsach! – dostęp do lokalnych zmiennych mamy wtedy w oknie konsoli, gdzie odpalony jest nasz serwer

+ b. przydanta integracja z Gistem: gist-method run_command
+ możliwość customizacji Pry : plik .pryrc – dodanie aliasów, własnych metod, zmiana promptu…

gem pry-rails : „Upgrade” konsoli rails

Instalując gem pry-rails powiążemy wywołanie rails c z wywołaniem pry

Dostajemy:

  • show-models – dostajemy listę modeli wraz z ich atrybutami i relacjami względem innych modeli; tradycyjnie, jak to w pry: bardzo czytelny sposób prezentacji
  • show-routes bez żadnych argumentów – wyższość nad rake routes to sposób prezentacji
  • show-routes bez żadnych argumentów – wyższość nad rake routes to sposób prezentacji
  • show-routes -G sign pozwoli na filtrowanie wyników przy pomocy wyrażeń regularnych (signup, signin…)
  • show-routes -G POST filter – wszystkie ścieżki POST
  • zadziała nam tutaj: show-doc, show-source, edit-method

Przydatne linki:

2. Ciekawostki z konferencji Codepot

Codepot, czyli wydarzenie 100% workshops to event dwudniowy, podczas którego uczestnicy wybierają 3 warsztaty dziennie, w których chcieliby uczestniczyć. W czasie każdej z sesji (3h – 1h – 3h) do wyboru było odbywających się równolegle ok. 15 (!) różnych warsztatów. Decyzja jak można się domyślić – nie była łatwa. Ostatecznie, zdecydowałam się na:

  1. From the void into the graph with Neo4j
  2. Ansible – zarządzanie konfiguracją w końcu zrobione jak trzeba
  3. Multi-model Databases
  4. Docker starter – from zero to container hero!
  5. Data Mining z Weką: pierwsze kroki / First steps in Data Mining with Weka
  6. Elasticsearch – the ultimate tutorial – from basics to creating clusters and common tricks

Postaram się o każdym z warsztatów powiedzieć kilka słów, bliżej skupię się na dwóch z nich, niektóre będą moim celem na któryś z kolejnych tygodni… ale do rzeczy!

2.1. Graph with Neo4j

BY:
Jarosław Pałka
Code mangler @Allegro.pl

…czyli kto jest moim kumplem?

Podstawowe informacje

Zacznijmy od dwóch podstawowych terminów:

Neo4j – grafowa baza danych napisana w Javie
Cypher (query language) – język zapytań pozwalający na korzystanie z grafowej bazy danych

Specyfika grafów jako baz danych

  • wstęp matematyczny – pojęcia: węzeł, krawędź, czy graf skierowany – koniecznie do przypomnienia
  • dane są przechowywane w węzłach, z których każdy posiada etykiety oraz własności; posiadają również ID nadawane przez Neo4j (przykład: węzeł o etykiecie człowiek i własnościach imię: ola, nazwisko: makota)
  • węzły połączone są za pomocą relacji, które mają swój typ i które również mogą mieć własności. Relacja może być skierowana lub obustronna. (przykład: typ relacji lubi, własność jak bardzo: 3/10

Podstawy składni Cyphera

  • przypomina SQL, ale nim nie jest!
  • pattern-matching
  • Przeszukiwanie grafu – podstawowe przykłady
    • MATCH (n:Person) RETURN n;
      – zwróć mi wszystkie węzły o etykiecie Person
    • MATCH (n)-[:LIKES]->m return m;
      – zwróć mi wszystkie węzły które są połączone relacją LIKES z jakimś węzłem, przy czym kierunek jest określony – zwracany węzeł ma być odbiorcą relacji
    • MATCH (n)-[r:LIKES]->m return r;
      – zwróć mi wszystkie połączenia typu LKIES pomiędzy dwoma węzłami
    • MATCH (n:Person:Man)-[:LIKES]->(m:Person) WHERE NOT m-[:LIKES]->n RETURN n;
      – zwróć mi wszystkich mężczyzn, którzy lubią kogoś przez kogo nie są lubiani
    • MATCH (me {name:”MojeImie”})-[:LIKES]->(myfriends)
      RETURN me, myfriends

      – zwróć „mnie i ludzi, których lubię”
    • … i wiele, wiele bardziej zaawansowanych : http://neo4j.com/developer/cypher-query-language/
  • Tworzenie elementów grafu
    • CREATE (n:Person { name : ‚Ola’, position : ‚Doctor’ })
    • MATCH (a:Person),(b:Person)
      WHERE a.name = ‚Ola’ AND b.name = ‚Ela’
      CREATE (a)-[r:LIKES]->(b)
      RETURN r

A teraz najważniejsze – jak wystartować z Neo4j? [Linux]

  • ściągamy odpowiednią paczkę ze strony Neo4j, rozpakowujemy
  • przechodzimy w konsoli do folderu, w którym rozpakowaliśmy paczkę, uruchamiamy ./bin/neo4j console
  • …i w przeglądarce możemy odwiedzić już [defaultowy, widoczny w konsoli] localhost:7474 !

neo4j

2.2., 2.4. Ansible, Docker

BY:
Ansible:
Grzegorz Nosek
Chief Tinkering Officer @ MegiTeam

Docker:
Przemysław Hejman
Senior Systems Engineer @ Applause, Inc.

Są to dwa narzędzia, którym chciałabym poświęcić osobne posty jako że są tematami bardzo złożonymi (a przy okazji bardzo istotnymi) i chociaż zafascynowana – nie czuję się jeszcze na siłach napisać o nich teraz.
Warto jednak teraz wspomnieć czym w ogóle one są (… i stanie się jasne skąd moje ogromne zainteresowanie tematem)
Ansible – narzędzie do automatyzacji zadań i zarządzania konfiguracją
Docker – tutaj aż boję się napisać jak rozumiem działanie Dockera, żeby czegoś nie przekręcić, ale równocześnie nie użyć masy niezrozumiałych słów.
Docker pozwala na odizolowanie puli procesów i na przykład uruchamianie usług w tle, bez ingerencji w nasz system operacyjny. Te „odizolowane pule procesów” trzymane są w dockerowych kontenerach. Z hub.docker.com możemy zaciągnać gotowe obrazy stworzone przez community (zarówno oficjalne, jak te „mniej”) a następnie z nich korzystać. Najczytelniejszy przykład? Jeżeli chcemy odpalić aplikację, która potrzebuje postresql-a, a my akurat nie mamy (i nie chcemy mieć 😉 ) go u siebie – zaciągamy odpowiedni obraz i odpalamy proces pg nie ingerując w nasz OS, ale mogąc się posługiwać postgresem! Co bardzo ważne – Docker nie jest wirtualizacją – ma to ogromne znaczenie dla kwestii wydajnościowych

Na tym jednak zakończę, bo są to tematy, które muszę jeszcze zbadać, żeby móc napisać o nich coś więcej. Zdecydowanie zasługują na osobne posty 🙂

2.3. Multi-model Databases

BY:
Marcin Karkocha
Software Engineer @ Intel

Myśleć o danych i co chcemy z nimi zrobić, a nie jak upchnąć dane do relacyjnej bazy danych

Kiedy już dumna z siebie napisałam post, w którym przyjrzałam się PostgreSQL oraz SQLite – okazało się, że o bazach danych wiem jeszcze mniej niż sobie wyobrażałam.

Warsztaty miały na celu przybliżenie nam kilka rodzajów baz danych, a właściwie na zmuszeniu nas do nieco odmiennej ścieżki myślenia – dokładnego zastanowienia się nad tym jakie dane będziemy chcieli obsługiwać i co będziemy z nimi chcieli robić i dopiero na tej podstawie – powinniśmy wybrać rodzaj bazy danych.
Nie ukrywam, że nie tylko do samego końca nie mogłam się uwolnić od „relacyjnego myślenia”, ale przede wszystkim – o istnieniu części z nich po prostu nie wiedziałam. Podobnie było z kilkoma pojęciami…

Modele spójności danych

(spójność = dokładność & prawdziwość & aktualność)

  • Silny w momencie odczytu – dane w takim stanie jak przy ost. zapisie; blokada danych na czas zapisu
  • Casual – blokada odczytu nie obejmuje danych nie powiązanych
  • Eventual Consistency – możemy założyć, że odczytywane dane są nieaktualne, jednak mamy pewność, że aktualizacja zostanie wprowadzona
  • Delta – á la rezerwacja miejsc – mamy delta czasu na dokonanie operacji – potem cofnięta
  • Rewizja – zapisywanie „co uległo zmianie”; dostęp do poprzednich wersji danych
  • RYOW – Read-your-own-writes – dostęp do odczytu dla zapisującego
Modele replikacji

– określamy rozkład danych wśród el. klastra bazodanowego

  • Replica-set – wszystkie dane na wszystkich serwerach
  • Master/master – każdy z el. klastra może służyć do zapuisu i odczyt
  • Master/slave – jeden węzeł główny do zapisu
  • Sharding – zapis danych w zależności od klucza; przykład: geolokalizacjyjny – serwery i umieszone na nich dane w zalezności od położenia geograficznego
Bazy danych
  • RDBMS – relacyjne bazy danych, np.:
    • PostgreSQL
    • MySQL
    • SQLite
    • Oracle
  • Dokumentowe – struktura dokumentu przypominająca format JSON
    każdy atrybut opisuje jakąś wartość
    dokumenty można zagnieżdżać w sobie
    każdy el. ma swój unikatowy klucz
    • MongoDB – polecam: opracowanie prezentujące różnice i zalety w porównaniu z RDBMS (oraz po części K/V)
    • Elasticsearch
    • CouchDB
  • Klucz-wartość K/V – bardzo prosty model danych, jak sama nazwa wskazuje – zbiór par klucz-wartość, ~odpowiednik tablicy (polecam: publikacja o nierelacyjnych BD: Łukasz Strobin, Adam Niewiadomski )
    • Redis
    • Riak
  • Grafowe – wspomniane już wyżej; poza polami – pojawiają się również relacje między nimi
    • Neo4j (a jakże 😉 )
    • OrientDB
  • Multi-model MMDB – łączenie razem wspomnianych wyżej modeli
    • ArrangoDB
    • FoundationDB

2.5. Data-mining z Weką

BY:
Łukasz Kobyliński
Co-founder @ Sages, Researcher @ IPI PAN

Radosław Szmit
Trener @ Sages

Aby zrozumieć istotę data miningu należy przede wszystkim rozróżnić dane od informacji
dane – surowe pomiary, obserwacje
informacje – wnioski wyciągnięte z dokładnego przestudiowania danych
=> data-mining – odkrywanie zależności, informacji ukrytych w danych

Dzięki takiemu działaniu możemy na przykład odpowiedzieć na pytanie na których z naszych klientów warto skupić działania marketingowe, ponieważ jest największa szansa, że zwiększą ilośc zakupów?

Co ważne – dane nie muszą mieć formu numerycznej (autmatyczna ocena opinii – ma wydźwięk pozytywny, czy negatywny (dane: tekt), który z moich kontaktów jest na zdjęciach (obraz))

Większość programów dostępnych na rynku posługuje się tymim samymi, powszechnie znanymi algorytmami. Różnią sią „sposobem użytkowania” (niektóre sa na przykład konsolowe)

W czasie warsztatów (które niestety były tylko godzinne), poznaliśmy podstawowe działanie intuicyjnego i przyjemnego w obsługdze programu Weka. Osoby bliżej zainteresowane tematem odsyłam do strony głównej projektu Weka, z której można ściągnąć wersję zarówno na Windowsa jak i Mac-a czy system Linuxowy.

2.6. Elasticsearch

BY:
Ekipa z Growbots:
Tomek Roda
Kuba Kucharski
Przemek Łyszczarz
Tomek Marmołowski



Świetnie zorganizowane! Każdy z uczestników dostał „swój własny serwer”, na którym mógł pracować i zestaw ćwiczeń do wykonania.

Tempo przekazywania materiału było zawrotne, a równocześnie – na bieżąco wykonywaliśmy ćwiczenia od tych banalnych, aż po szalenie trudne, nawiązujące do prezentowanych tematów.

Elasticsearch – pojawił się już dzisiaj jako przykład dokumentowej bazy danych
Kilka rzeczy, które warto wiedzieć

  • Przechowuje dane w postaci dokumentów JSON
  • Możemy: tworzyć, pobierać, usuwać i wyszukiwać
  • Nie możemy edytować dokumentów – możemy zastąpic dokument pod danym kluczem
  • Dane automatycznie indeksowane
  • Ocena trafności (scoring) wyników wyszukiwania
  • Nie wymaga (z początku) skomplikowanej konfiguracji
  • Skalowalny
  • Korzystają: Ebay, Stackoverflow, Facebook

Startujemy z Elasticsearch

  • Instalacja ES wraz z wszystkim czego „potrzebuje” (Ubuntu)
  • Warto zainstalować Postmana (Chrome) lub RESTclient (Firefox)
  • odpalamy ES: sudo /etc/init.d/elasticsearch start – domyślny port 9200
  • TWORZYMY za pomocą PUT
    • Stworzenie nowego indeksu: PUT …:9200/my_new_index
    • Stworzenie nowego dokumentu: PUT …:9200/my_new_index/my_new_type/1 i w body
      {
      „user”: „Olaf”,
      „age”: 22,
      „skills”: [
      „flying”,
      „eating”
      ]
      }
  • POBIERAMY za pomocą GET
    • GET …:9200/my_new_index/my_new_type/1 zwróci
      {
      „_index” : „my_new_index”,
      „_type” : „my_new_type”,
      „_id” : „1”,
      „_version” : 1,
      „found” : true,
      „_source” : {
      „user”: „Olaf”,
      „age”: 22,
      „skills”: [
      „flying”,
      „eating”
      ]
      }
      }
  • postman

  • ZASTĘPUJEMY za pomocą PUT
    • PUT …:9200/my_new_index/my_new_type/1 i w body
      {
      „user”: „Staszek”
      }

      ! teraz pobierz i zwróc uwagę na _version

  • USUWAMY za pomocą DELETE
    • DELETE …:9200/my_new_index/my_new_type/1
  • WSZYUKUJEMY za pomocą POST/GET
    • prosta lista GET …:9200/_search
    • wyszukiwanie wszędzie danego tekstu GET …:9200/_search?q=Staszek
    • szukanie po konkretnym polu POST /_search
      {
      „query” : {
      „match” : {
      „age” : 22
      }
      }
      }
    • szukanie frazy – match_query zamiast query
    • … i wiele, wiele innych, dużo bardziej zaawansowanych, których nie sposób tutaj pokazać
      przydatne linki:
      Oficjalna strona ES – zapytania
      Joel Abrahamsson – blog
      Open knowledge labs – blog

3. AWD, R4: 91-106 + Caching

Na pierwszy rzut oka możnaby pomyśleć, że zaatakowało mnie lenistwo. 15 stron…?
Nic bardziej mylnego 😉

Zaczęłam kolejny podrozdział, w którym autor tworzy nowy kontroler, ustala ścieżkę root, tworzy wspólny layout dla podstron, pierwszą metodę helpera, dla ładnego wyświetlania ceny produktu oraz pisze functional tests*

*tutaj poznajemy: assert_select, który pozwala na sprawdzenie zawartości widoku.
Sprawdzamy go „grzebiąc” w HTML-u za pomocną znaczników CSS a następnie sprawdzając ilośc występujących elementów, oraz ich treść (tu też: regexpy)

  • assert_select ‚#wrapper #left a’, minimum: 3
  • assert_select ‚h2’, ‚Tytuł rozdziału’
  • assert_select ‚.kod-pocztowy’, /\d{2}(\s|\-)?\d{3}/



Jednak powodem, dla którego zatrzymałam się po 15 stronach jest CACHING, słowo-klucz, które nic mi nie mówiło.
I chociaż obiecałam sobie zasiadając do książki, że nie będę rzucała się na każdą „nową rzecz”, na którą trafię, a jedynie będę dopisywała ją do listy to do – tym razem nie mogłam sobie odmówić, żeby nie zająć się tym tematem.

Wstęp: czym jest caching?

  • można określić jako gromadzenie odpowiedzi (responses) na zapytania (requests)
  • „odpowiedziami” mogą być strony HTML, obrazki, pliki…
  • przy kolejnym requescie – możemy skorzystać ze scachowanych danych zamiast znowu pukać do serwera
  • zysk: przede wszystkim szybkość – jako że odpowiadamy na request za pomocą cache (bliżej klienta) zamiast bezp. z serwera – jest to dużo szybsze!

Trzy podstawowe techniki cachowania

  1. Browser Caches
  2. – nazwa mówi sama za siebie (sprawdź ustawienia swojej przeglądarki 🙂 ) – siłą rzeczy: dla pojedynczego usera

  3. Proxy Caches
  4. – cachowanie na większą skalę; proxy caches nie są częścią serwera ani klienta

  5. Gateway Caches
  6. – lokowane przez webmasterów, dla lepszej wydajności stron

Cache w Railsach

Warto pamiętać, że domyślnie, w trybie development – cachowanie jest wyłączone
zmiana config.action_controller.perform_caching = true

Formy cachowania (RailsGuides)

  1. Page Caching (Rails 4: gem)
  2. -odp zapewniona przez serwer, bez przechodzenia przez Railsy
    -nie zawsze może być zastosowane (np. strony wymagające autoryzacji)

  3. Action Caching (Rails 4: gem)
  4. – działa jak Page Caching ale puka do Railsów; możliwe wykonanie before filters

  5. Fragment Caching
  6. możemy tworzyć bloki cache, w których będzie umieszczony fragment logiki widoku
    Przykład: jeżeli część strony ma być zawsze ładowana z serwera, ale lista wszystkich produktów – ma być scachowana

    +

  7. Low-Level Caching
  8. cachowanie wartości, wyniku działania: Rails.cache.fetch

  9. SQL Caching
  10. -wewnątrz danej akcji, wykonywanie tego samego zapytania np @acritcles = Aricle.all – jest cachowane automatycznie
    -nie uderzamy ponownie do bazy

1. Page Caching

– cachowanie całej strony, request nie dochodzi do kontrolera
– kod umieszczamy w kontrolerze
– instalujemy gema : gem ‚actionpack-page_caching’
– ustawiamy folder : config.action_controller.page_cache_directory = „#{Rails.root.to_s}/public/deploy”

caches_page :action_name

caches_page :welcome
def welcome

end

„update” cache’a
expire_page action: action_name

def update
expire_page action: welcome
end

2. Action Caching

-cachowanie tylko działania danej akcji; poradzi sobie z autoryzacją czy before filters
– kod umieszczamy w kontrolerze
– instalujemy gema : gem ‚actionpack-action_caching’

before_filter :authenticate

caches_action :action_name

caches_action :profile
def profile
@user = current_user
end

„update” cache’a
expire_action action: action_name

def update
expire_action action: profile
end

3. Fragment Caching

-cachowanie jedynie fragmentów strony
– część kodu cachowania pojawi się w widoku, część w kontrolerze

Wyobrazmy sobie, że chcemy ładować każdorazowo opinie na temat produktu, ale sam produkt – może być scachowany

WIDOK

% cache(„product”) do %
%= render product %
% end %>

% @product.opinions.each do |opinion| %
%= opinion.author %
%= opinion.text %
% end %

KONTROLER

def product
@product = Product.find(params[:id])
end

def update

expire_fragment(„product”)
end

Przydatne linki:


Pomysły na przyszły tydzień:
1. Książka Fearless refactoring
2. Form builders
3. Turbolinks

Advertisements
Tydzień drugi pod znakiem Codepote’u

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s