SlideShare a Scribd company logo
1 of 33
Mirosław Wołoszyn Przemysław Kowalczyk Jarorcon Sp. z o.o. ul. Wałbrzyska 12 52-314 Wrocław email: info@jarorcon.pl
www.susuh.de Użyte technologie:  Ruby on Rails, Ajax, JavaScrip, XML, MySql, Apache, Mongrel, Memcache, Ferret, GetText, RCov, Test Driven Development  Serwisy zintegrowane z portalem:  Jajah, Twistage, Sevenload, HiClip, Google Maps Api, Ad Sense, Octazen Invite Sender & Contact Importer Runek usług Susuh.
www.define-finance.com Użyte technologie:  Ruby on Rails, Behaviour Driven Development (RSpec), Ajax, Javascript, XML, MySql, Apache, Mongrel, Memcache, Ferret, GetText, BackgrounDRb  Serwisy zintegrowane z portalem:  Sevenload Portal dla osób działających na europejskim rynku finansów i ubezpieczeń.
www.absolventa.de Portal pracy przeznaczony dla absolwentów.  Użyte technologie:  Ruby on Rails, Behaviour Driven Development (RSpec), Ajax, Javascript, XML, MySql, Apache, Mongrel, Memcache, BackgrounDRb  Serwisy zintegrowane z portalem:  Amazon S3
Praca, praktyka w  Jarorcon Sp. z o.o. ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Ruby i Rails Przemysław Kowalczyk Jarorcon sp. z o.o.
O mnie ,[object Object],[object Object],[object Object],[object Object]
Plan prezentacji ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
[object Object],[object Object]
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Ruby  <=>  Java ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Ruby  <=>  Java ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Przyjazna składnia ,[object Object],[object Object],[object Object],[object Object],Nawiasy opcjonalne int  też obiekt i swoje metody ma Składnia dla tworzenia tablic Składnia dla tworzenia tablic asocjacyjnych Metody mogą mieć blok kodu jako parametr Średniki opcjonalne
Przyjazna składnia ,[object Object],[object Object],[object Object],[object Object],[object Object],Skrócona forma  if return  zbędny na końcu metody Interpretowane wewnątrz napisu Tworzy obiekt klasy  Range
Zwięzły kod ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Dostępne w Rails i Ruby 1.9 top5 = users.   sort_by(&:activity).   last(5).   collect(&:login)‏ Podejrzane! Błędy! Accidental complexity!
DSL – Domain Specific Language ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Otwarte klasy ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Osobna klasa! Metoda statyczna! Brak konsekwencji!
Metaprogramowanie ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Metaprogramowanie ,[object Object],[object Object],[object Object]
Ruby on Rails ,[object Object],[object Object],[object Object],[object Object]
Ruby on Rails – buzzwords ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Web development that doesn't hurt! Optimized for programmer happiness Does it scale? YES! ,[object Object]
Ruby on Rails – enterprise ready? ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],YES!
Convention over Configuration MessageFoldersController (klasa kontrolera) message_folders (tabela) MessageFolder (klasa modelu) app/models/ message_folder .rb (plik) MessageFolderTest (klasa testowa dla modelu) test/unit/ message_folder_test .rb (plik) app/controllers/ message_folders_controller .rb (plik) app/views/ message_folders / index.rhtml edit.rhtml show.rhtml (widoki) MessageFoldersControllerTest (klasa testowa dla kontrolera) test/functional/ message_folders_controller_test .rb (plik)
Ruby on Rails – model class Campaign < ActiveRecord::Base has_many :codes, :dependent => :destroy   has_many :free_codes, :class_name => &quot;Code&quot;,    :conditions => &quot;user_id is null&quot;   belongs_to :creator, :class_name => &quot;User&quot; validates_presence_of :name, :valid_from, :valid_to, :invitations_no   validates_uniqueness_of :name def initialize *args   super   if @new_record   valid_from ||= Time.now.tomorrow.midnight   valid_to ||= 2.weeks.since(valid_from)   invitations_no ||= 5   end   end  def active?   Time.now >= valid_from && Time.now <= valid_to   end end Operacje na czasie i datach Nazwa klasy na podstawie nazwy relacji
Ruby on Rails – controller class AdminCampaignsController < ApplicationController   before_filter :admin_required   caches_page :index, :show   cache_sweeper :campaign_sweeper, :only => [:create, :update, :destroy] def index   @campaigns = Campaign.paginate :all, :page=>params[:page],   :per_page=>25   end def edit   @campaign = Campaign.find(params[:id])   end def update   @campaign = Campaign.find(params[:id])   if @campaign.update_attributes(params[:campaign])   flash[:notice] = _('Campaign was successfully updated.')   redirect_to admin_campaign_url(@campaign)   else   render :action => &quot;edit&quot;   end   end ... Cache'owanie!
Ruby on Rails – view  <h1>New campaign</h1> <%= error_messages_for :campaign %> <% form_for(:campaign, :url => admin_campaigns_path) do |f| %>   <%= render :partial => 'form', :locals => { :f => f } %>   <p>   <%= submit_tag &quot;Create&quot; %>   </p> <% end %> <%= link_to 'Back', admin_campaigns_path %> <p>   <b>Name</b><br />  <%= f.text_field :name %> </p> <p>   <b>Valid from</b><br /><%= f.datetime_select :valid_from %> </p> <p>   <b>Valid to</b><br />  <%= f.datetime_select :valid_to %> </p> Formularz dla modelu Wstawienie fragmentu strony Partial '_form.rhtml' Widok 'new.rhtml'
Ruby on Rails – test  class AdminCampaignsControllerTest < Test::Unit::TestCase fixtures :campaigns, :campaign_codes def test_should_get_index   get :index   assert_response :success   assert assigns(:campaigns)   end def test_should_create_campaign   assert_difference Campaign, :count, 1 do   post :create, :campaign => { :name => 'test campaign' }   end assert_redirected_to admin_campaign_path(assigns(:campaign))   end def test_shouldnt_create_campaign_without_name   assert_difference Campaign, :count, 0 do   post :create, :campaign => { :name => '' }   end   assert_not_nil assigns(:campaign).errors.on(:name)   end Fixtures – predefiniowane dane w bazie testowej Wykonanie żądania HTTP:  GET index Blok kodu powinien zwiększyć  Campaign.count  o 1 Wykonanie żądania HTTP:  POST create  z parametrami
ActiveRecord  <=> JPA ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
ActiveRecord find(:first, :conditions => [ &quot;user_name = ? AND password = ?&quot;, user_name, password ]) find(:first, :conditions => { :user_name => user_name, :password => password }) find(:first, :conditions => params[:user]) find_by_user_name_and_password(user_name, password) Tag.find_or_create_by_name(&quot;Summer&quot;) user.manager.projects.find(project_id) manager.projects.create(:name => 'new project') Dynamic finder Znajdź lub stwórz User belongs_to :manager Manager has_many :projects Znajduje projekt, ale tylko wtedy, gdy ma go manager danego użytkownika
ActiveRecord (2)‏ Person.find(:all, :include => [ :account, :friends ]) Company.find(:first, :conditions => [   &quot;id = :id AND name = :name AND division = :division AND    created_at > :accounting_date&quot;,   { :id => 3, :name => &quot;37signals&quot;, :division => &quot;First&quot;,    :accounting_date => '2005-01-01' }] Message.find(all,    :select => &quot;messages.*&quot;,   :joins => &quot;INNER JOIN message_folder_items mfi ON (mfi.message_id = messages.id)&quot;,   :conditions => [&quot;mfi.message_folder_id = ?&quot;, self.id],   :order => 'messages.sent_at desc',   :limit => 20) Eager loading
YAML  <=>  XML ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Przydatne adresy ,[object Object],[object Object],[object Object],[object Object]
Pytania?

More Related Content

Similar to Jarorcon Sp

Modularny JavaScript - meet.js
Modularny JavaScript - meet.jsModularny JavaScript - meet.js
Modularny JavaScript - meet.jsPatryk Jar
 
WebDeveloper - Yesterday, Today, Tomorrow
WebDeveloper - Yesterday, Today, TomorrowWebDeveloper - Yesterday, Today, Tomorrow
WebDeveloper - Yesterday, Today, TomorrowMarcin Dembowski
 
Zwiększanie produktywności programisty php (v2)
Zwiększanie produktywności programisty php (v2)Zwiększanie produktywności programisty php (v2)
Zwiększanie produktywności programisty php (v2)adamhmetal
 
Zwiększanie produktywności programisty php
Zwiększanie produktywności programisty phpZwiększanie produktywności programisty php
Zwiększanie produktywności programisty phpadamhmetal
 
Migrate API w Drupalu [PL]
Migrate API w Drupalu [PL]Migrate API w Drupalu [PL]
Migrate API w Drupalu [PL]Droptica
 
Angular 4 pragmatycznie
Angular 4 pragmatycznieAngular 4 pragmatycznie
Angular 4 pragmatycznieSages
 
Functional widgets in Rails
Functional widgets in RailsFunctional widgets in Rails
Functional widgets in RailsSebastian Sito
 
NK API - Przykłady
NK API - PrzykładyNK API - Przykłady
NK API - Przykładynasza-klasa
 
tRPC - czy to koniec GraphQL?
tRPC - czy to koniec GraphQL?tRPC - czy to koniec GraphQL?
tRPC - czy to koniec GraphQL?Brainhub
 
Warsztaty: Podstawy PHP - część 2 - omówienie składni języka PHP (wersja 7)
Warsztaty: Podstawy PHP - część 2 - omówienie składni języka PHP (wersja 7)Warsztaty: Podstawy PHP - część 2 - omówienie składni języka PHP (wersja 7)
Warsztaty: Podstawy PHP - część 2 - omówienie składni języka PHP (wersja 7)Codesushi.co (CODESUSHI LLC)
 
Testowanie bezpieczenstwa aplikacji mobilnych
Testowanie bezpieczenstwa aplikacji mobilnychTestowanie bezpieczenstwa aplikacji mobilnych
Testowanie bezpieczenstwa aplikacji mobilnychSecuRing
 
Pokaż kotku, co masz w środku profilowanie aplikacji z xhprof
Pokaż kotku, co masz w środku   profilowanie aplikacji z xhprofPokaż kotku, co masz w środku   profilowanie aplikacji z xhprof
Pokaż kotku, co masz w środku profilowanie aplikacji z xhprofPatryk Szlagowski
 
TGT#14 - @Before – Nie będę automatyzować @After – No dobra, to nie jest taki...
TGT#14 - @Before – Nie będę automatyzować @After – No dobra, to nie jest taki...TGT#14 - @Before – Nie będę automatyzować @After – No dobra, to nie jest taki...
TGT#14 - @Before – Nie będę automatyzować @After – No dobra, to nie jest taki...Trójmiejska Grupa Testerska
 
Testy API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięciTesty API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięciThe Software House
 
Testowanie bezpieczeństwa aplikacji dedykowanych na platformę Android
Testowanie bezpieczeństwa aplikacji dedykowanych na platformę AndroidTestowanie bezpieczeństwa aplikacji dedykowanych na platformę Android
Testowanie bezpieczeństwa aplikacji dedykowanych na platformę AndroidSecuRing
 

Similar to Jarorcon Sp (20)

Php P.Jar
Php P.JarPhp P.Jar
Php P.Jar
 
Podstawy PHP
Podstawy PHPPodstawy PHP
Podstawy PHP
 
Modularny JavaScript - meet.js
Modularny JavaScript - meet.jsModularny JavaScript - meet.js
Modularny JavaScript - meet.js
 
WebDeveloper - Yesterday, Today, Tomorrow
WebDeveloper - Yesterday, Today, TomorrowWebDeveloper - Yesterday, Today, Tomorrow
WebDeveloper - Yesterday, Today, Tomorrow
 
Zwiększanie produktywności programisty php (v2)
Zwiększanie produktywności programisty php (v2)Zwiększanie produktywności programisty php (v2)
Zwiększanie produktywności programisty php (v2)
 
Zwiększanie produktywności programisty php
Zwiększanie produktywności programisty phpZwiększanie produktywności programisty php
Zwiększanie produktywności programisty php
 
Migrate API w Drupalu [PL]
Migrate API w Drupalu [PL]Migrate API w Drupalu [PL]
Migrate API w Drupalu [PL]
 
Angular 4 pragmatycznie
Angular 4 pragmatycznieAngular 4 pragmatycznie
Angular 4 pragmatycznie
 
Functional widgets in Rails
Functional widgets in RailsFunctional widgets in Rails
Functional widgets in Rails
 
NK API - Przykłady
NK API - PrzykładyNK API - Przykłady
NK API - Przykłady
 
tRPC - czy to koniec GraphQL?
tRPC - czy to koniec GraphQL?tRPC - czy to koniec GraphQL?
tRPC - czy to koniec GraphQL?
 
react-pl.pdf
react-pl.pdfreact-pl.pdf
react-pl.pdf
 
Warsztaty: Podstawy PHP - część 2 - omówienie składni języka PHP (wersja 7)
Warsztaty: Podstawy PHP - część 2 - omówienie składni języka PHP (wersja 7)Warsztaty: Podstawy PHP - część 2 - omówienie składni języka PHP (wersja 7)
Warsztaty: Podstawy PHP - część 2 - omówienie składni języka PHP (wersja 7)
 
Testowanie bezpieczenstwa aplikacji mobilnych
Testowanie bezpieczenstwa aplikacji mobilnychTestowanie bezpieczenstwa aplikacji mobilnych
Testowanie bezpieczenstwa aplikacji mobilnych
 
Pokaż kotku, co masz w środku profilowanie aplikacji z xhprof
Pokaż kotku, co masz w środku   profilowanie aplikacji z xhprofPokaż kotku, co masz w środku   profilowanie aplikacji z xhprof
Pokaż kotku, co masz w środku profilowanie aplikacji z xhprof
 
TGT#14 - @Before – Nie będę automatyzować @After – No dobra, to nie jest taki...
TGT#14 - @Before – Nie będę automatyzować @After – No dobra, to nie jest taki...TGT#14 - @Before – Nie będę automatyzować @After – No dobra, to nie jest taki...
TGT#14 - @Before – Nie będę automatyzować @After – No dobra, to nie jest taki...
 
Testy API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięciTesty API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięci
 
Android i REST
Android i RESTAndroid i REST
Android i REST
 
Testowanie bezpieczeństwa aplikacji dedykowanych na platformę Android
Testowanie bezpieczeństwa aplikacji dedykowanych na platformę AndroidTestowanie bezpieczeństwa aplikacji dedykowanych na platformę Android
Testowanie bezpieczeństwa aplikacji dedykowanych na platformę Android
 
Wprowadzenie do PHPUnit
Wprowadzenie do PHPUnitWprowadzenie do PHPUnit
Wprowadzenie do PHPUnit
 

Jarorcon Sp

  • 1. Mirosław Wołoszyn Przemysław Kowalczyk Jarorcon Sp. z o.o. ul. Wałbrzyska 12 52-314 Wrocław email: info@jarorcon.pl
  • 2. www.susuh.de Użyte technologie: Ruby on Rails, Ajax, JavaScrip, XML, MySql, Apache, Mongrel, Memcache, Ferret, GetText, RCov, Test Driven Development Serwisy zintegrowane z portalem: Jajah, Twistage, Sevenload, HiClip, Google Maps Api, Ad Sense, Octazen Invite Sender & Contact Importer Runek usług Susuh.
  • 3. www.define-finance.com Użyte technologie: Ruby on Rails, Behaviour Driven Development (RSpec), Ajax, Javascript, XML, MySql, Apache, Mongrel, Memcache, Ferret, GetText, BackgrounDRb Serwisy zintegrowane z portalem: Sevenload Portal dla osób działających na europejskim rynku finansów i ubezpieczeń.
  • 4. www.absolventa.de Portal pracy przeznaczony dla absolwentów. Użyte technologie: Ruby on Rails, Behaviour Driven Development (RSpec), Ajax, Javascript, XML, MySql, Apache, Mongrel, Memcache, BackgrounDRb Serwisy zintegrowane z portalem: Amazon S3
  • 5.
  • 6. Ruby i Rails Przemysław Kowalczyk Jarorcon sp. z o.o.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23. Convention over Configuration MessageFoldersController (klasa kontrolera) message_folders (tabela) MessageFolder (klasa modelu) app/models/ message_folder .rb (plik) MessageFolderTest (klasa testowa dla modelu) test/unit/ message_folder_test .rb (plik) app/controllers/ message_folders_controller .rb (plik) app/views/ message_folders / index.rhtml edit.rhtml show.rhtml (widoki) MessageFoldersControllerTest (klasa testowa dla kontrolera) test/functional/ message_folders_controller_test .rb (plik)
  • 24. Ruby on Rails – model class Campaign < ActiveRecord::Base has_many :codes, :dependent => :destroy has_many :free_codes, :class_name => &quot;Code&quot;, :conditions => &quot;user_id is null&quot; belongs_to :creator, :class_name => &quot;User&quot; validates_presence_of :name, :valid_from, :valid_to, :invitations_no validates_uniqueness_of :name def initialize *args super if @new_record valid_from ||= Time.now.tomorrow.midnight valid_to ||= 2.weeks.since(valid_from) invitations_no ||= 5 end end def active? Time.now >= valid_from && Time.now <= valid_to end end Operacje na czasie i datach Nazwa klasy na podstawie nazwy relacji
  • 25. Ruby on Rails – controller class AdminCampaignsController < ApplicationController before_filter :admin_required caches_page :index, :show cache_sweeper :campaign_sweeper, :only => [:create, :update, :destroy] def index @campaigns = Campaign.paginate :all, :page=>params[:page], :per_page=>25 end def edit @campaign = Campaign.find(params[:id]) end def update @campaign = Campaign.find(params[:id]) if @campaign.update_attributes(params[:campaign]) flash[:notice] = _('Campaign was successfully updated.') redirect_to admin_campaign_url(@campaign) else render :action => &quot;edit&quot; end end ... Cache'owanie!
  • 26. Ruby on Rails – view <h1>New campaign</h1> <%= error_messages_for :campaign %> <% form_for(:campaign, :url => admin_campaigns_path) do |f| %> <%= render :partial => 'form', :locals => { :f => f } %> <p> <%= submit_tag &quot;Create&quot; %> </p> <% end %> <%= link_to 'Back', admin_campaigns_path %> <p> <b>Name</b><br /> <%= f.text_field :name %> </p> <p> <b>Valid from</b><br /><%= f.datetime_select :valid_from %> </p> <p> <b>Valid to</b><br /> <%= f.datetime_select :valid_to %> </p> Formularz dla modelu Wstawienie fragmentu strony Partial '_form.rhtml' Widok 'new.rhtml'
  • 27. Ruby on Rails – test class AdminCampaignsControllerTest < Test::Unit::TestCase fixtures :campaigns, :campaign_codes def test_should_get_index get :index assert_response :success assert assigns(:campaigns) end def test_should_create_campaign assert_difference Campaign, :count, 1 do post :create, :campaign => { :name => 'test campaign' } end assert_redirected_to admin_campaign_path(assigns(:campaign)) end def test_shouldnt_create_campaign_without_name assert_difference Campaign, :count, 0 do post :create, :campaign => { :name => '' } end assert_not_nil assigns(:campaign).errors.on(:name) end Fixtures – predefiniowane dane w bazie testowej Wykonanie żądania HTTP: GET index Blok kodu powinien zwiększyć Campaign.count o 1 Wykonanie żądania HTTP: POST create z parametrami
  • 28.
  • 29. ActiveRecord find(:first, :conditions => [ &quot;user_name = ? AND password = ?&quot;, user_name, password ]) find(:first, :conditions => { :user_name => user_name, :password => password }) find(:first, :conditions => params[:user]) find_by_user_name_and_password(user_name, password) Tag.find_or_create_by_name(&quot;Summer&quot;) user.manager.projects.find(project_id) manager.projects.create(:name => 'new project') Dynamic finder Znajdź lub stwórz User belongs_to :manager Manager has_many :projects Znajduje projekt, ale tylko wtedy, gdy ma go manager danego użytkownika
  • 30. ActiveRecord (2)‏ Person.find(:all, :include => [ :account, :friends ]) Company.find(:first, :conditions => [ &quot;id = :id AND name = :name AND division = :division AND created_at > :accounting_date&quot;, { :id => 3, :name => &quot;37signals&quot;, :division => &quot;First&quot;, :accounting_date => '2005-01-01' }] Message.find(all, :select => &quot;messages.*&quot;, :joins => &quot;INNER JOIN message_folder_items mfi ON (mfi.message_id = messages.id)&quot;, :conditions => [&quot;mfi.message_folder_id = ?&quot;, self.id], :order => 'messages.sent_at desc', :limit => 20) Eager loading
  • 31.
  • 32.