0
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, R...
www.define-finance.com Użyte technologie:  Ruby on Rails, Behaviour Driven Development (RSpec), Ajax, Javascript, XML, MyS...
www.absolventa.de Portal pracy przeznaczony dla absolwentów.  Użyte technologie:  Ruby on Rails, Behaviour Driven Developm...
Praca, praktyka w  Jarorcon Sp. z o.o. <ul><li>Wrocław  - praca we Wrocławskim biurze firmy </li></ul><ul><li>  Jarorcon S...
Ruby i Rails Przemysław Kowalczyk Jarorcon sp. z o.o.
O mnie <ul><li>Absolwent Uniwersytetu Wr., 1999 r.,  kierunek: Informatyka,  specjalizacja: Inżynieria Oprogramowania </li...
Plan prezentacji <ul><li>Ruby </li></ul><ul><ul><li>Ruby <=> Java </li></ul></ul><ul><ul><li>przykłady </li></ul></ul><ul>...
<ul><li>Stworzony w 1995 r. przez Yukihiro Matsumoto (a.k.a. &quot;Matz&quot;) </li></ul><ul><li>“ Designed for programmer...
<ul><li>Ogólnego zastosowania </li></ul><ul><li>Wieloplatformowy </li></ul><ul><li>Open source </li></ul><ul><li>Obiektowy...
Ruby  <=>  Java <ul><li>Kompilowany </li></ul><ul><li>Statyczne typowanie   </li></ul><ul><li>Wszystko jest obiektem  (opr...
Ruby  <=>  Java <ul><li>Ruby > Java </li></ul><ul><ul><li>Zwięzły, wyrazisty kod  => szybsze tworzenie, niższe koszty utrz...
Przyjazna składnia <ul><li>puts 'Hello World!' </li></ul><ul><li>10.times {puts 'Hello'} </li></ul><ul><li>array = [1, 'hi...
Przyjazna składnia <ul><li>def fib n   return 1 if n < 2   fib(n-1) + fib(n-2) end </li></ul><ul><li>n = 5 </li></ul><ul><...
Zwięzły kod <ul><li>top5 = users.   sort_by{|u| u.activity}.   last(5).   collect{|u| u.login} </li></ul><ul><li>Collectio...
DSL – Domain Specific Language <ul><li>class User < ActiveRecord::Base </li></ul><ul><li>has_many :projects </li></ul><ul>...
Otwarte klasy <ul><li>class String   def blank?   self.strip == ''   end end </li></ul><ul><li>class NilClass   def blank?...
Metaprogramowanie <ul><li>xml = XmlGenerator.new </li></ul><ul><li>puts xml.people { </li></ul><ul><li>xml.person { </li><...
Metaprogramowanie <ul><li>Person = Struct.new(:name, :phone, :email) p1 = Person.new(:name => &quot;DHH&quot;)‏ </li></ul>...
Ruby on Rails <ul><li>Twórca: David Heinemeier Hansson </li></ul><ul><li>Data opublikowania: lipiec 2004 r. </li></ul><ul>...
Ruby on Rails – buzzwords <ul><li>MVC </li></ul><ul><li>AJAX </li></ul><ul><li>REST </li></ul><ul><li>DRY </li></ul><ul><l...
Ruby on Rails – enterprise ready? <ul><li>amazon.com </li></ul><ul><li>BBC </li></ul><ul><li>CapGemini </li></ul><ul><li>C...
Convention over Configuration MessageFoldersController (klasa kontrolera) message_folders (tabela) MessageFolder (klasa mo...
Ruby on Rails – model class Campaign < ActiveRecord::Base has_many :codes, :dependent => :destroy   has_many :free_codes, ...
Ruby on Rails – controller class AdminCampaignsController < ApplicationController   before_filter :admin_required   caches...
Ruby on Rails – view  <h1>New campaign</h1> <%= error_messages_for :campaign %> <% form_for(:campaign, :url => admin_campa...
Ruby on Rails – test  class AdminCampaignsControllerTest < Test::Unit::TestCase fixtures :campaigns, :campaign_codes def t...
ActiveRecord  <=> JPA <ul><li>Wzorzec projektowy: ActiveRecord </li></ul><ul><li>Atrybuty zdefiniowane w tabeli </li></ul>...
ActiveRecord find(:first, :conditions => [ &quot;user_name = ? AND password = ?&quot;, user_name, password ]) find(:first,...
ActiveRecord (2)‏ Person.find(:all, :include => [ :account, :friends ]) Company.find(:first, :conditions => [   &quot;id =...
YAML  <=>  XML <ul><li>dates:  </li></ul><ul><li>month names: [sty, lut, mar, kwi, ...] </li></ul><ul><li>day names: [Nie,...
Przydatne adresy <ul><li>http://www.ruby-lang.org/pl/ </li></ul><ul><li>http://www.rubyonrails.org/ </li></ul><ul><li>http...
Pytania?
Upcoming SlideShare
Loading in...5
×

Jarorcon Sp

1,685

Published on

Jarorcon company introducing Ruby on Rails

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,685
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
6
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
  • Transcript of "Jarorcon Sp"

    1. 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. 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. 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. 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. 5. Praca, praktyka w Jarorcon Sp. z o.o. <ul><li>Wrocław - praca we Wrocławskim biurze firmy </li></ul><ul><li> Jarorcon Sp. z o.o. </li></ul><ul><li>Hamburg - praca w niemieckiej firmie AKRA GmbH. </li></ul><ul><li>Kontakt: </li></ul><ul><li> [email_address] </li></ul><ul><li> www.jarorcon.pl </li></ul>
    6. 6. Ruby i Rails Przemysław Kowalczyk Jarorcon sp. z o.o.
    7. 7. O mnie <ul><li>Absolwent Uniwersytetu Wr., 1999 r., kierunek: Informatyka, specjalizacja: Inżynieria Oprogramowania </li></ul><ul><li>Pracuję jako programista od 1997 r. </li></ul><ul><li>Java: 6 lat, C++: 4 lata, Ruby: prawie rok </li></ul><ul><li>Aplikacje WWW: prawie 7 lat </li></ul>
    8. 8. Plan prezentacji <ul><li>Ruby </li></ul><ul><ul><li>Ruby <=> Java </li></ul></ul><ul><ul><li>przykłady </li></ul></ul><ul><li>Ruby on Rails </li></ul><ul><ul><li>wprowadzenie </li></ul></ul><ul><ul><li>przykłady </li></ul></ul><ul><li>ActiveRecord </li></ul><ul><ul><li>ActiveRecord <=> JPA </li></ul></ul><ul><ul><li>przykłady </li></ul></ul>
    9. 9. <ul><li>Stworzony w 1995 r. przez Yukihiro Matsumoto (a.k.a. &quot;Matz&quot;) </li></ul><ul><li>“ Designed for programmer productivity and fun!” </li></ul>
    10. 10. <ul><li>Ogólnego zastosowania </li></ul><ul><li>Wieloplatformowy </li></ul><ul><li>Open source </li></ul><ul><li>Obiektowy </li></ul><ul><li>Elastyczny </li></ul><ul><li>Automatyczne zarządzanie pamięcią </li></ul><ul><li>Refleksja </li></ul><ul><li>Inspiracje: </li></ul><ul><ul><li>Smalltalk </li></ul></ul><ul><ul><li>Perl </li></ul></ul><ul><ul><li>Lisp </li></ul></ul><ul><ul><li>Python </li></ul></ul>
    11. 11. Ruby <=> Java <ul><li>Kompilowany </li></ul><ul><li>Statyczne typowanie </li></ul><ul><li>Wszystko jest obiektem (oprócz typów prymitywnych, tablic, interfejsów, enumów, adnotacji) ☺ </li></ul><ul><li>Wywoływanie metod </li></ul><ul><li>Interpretowany </li></ul><ul><li>Dynamiczne typowanie (duck-typing) </li></ul><ul><li>Wszystko jest obiektem (klasy, moduły) </li></ul><ul><li>Wysyłanie komunikatów </li></ul>
    12. 12. Ruby <=> Java <ul><li>Ruby > Java </li></ul><ul><ul><li>Zwięzły, wyrazisty kod => szybsze tworzenie, niższe koszty utrzymania </li></ul></ul><ul><ul><li>DSL (Domain Specific Language) => myślenie pojęciami z dziedziny problemu </li></ul></ul><ul><ul><li>Otwarte klasy, metaprogramowanie => łatwość tworzenia DSL, frameworków, AOP (programowanie aspektowe)‏ </li></ul></ul><ul><ul><li>Przyjazny dla programisty : składnia, Principle of Least Surprise </li></ul></ul><ul><li>Ruby < Java </li></ul><ul><ul><li>Wolniejszy (ale: JRuby, wiele innych implementacji w toku) </li></ul></ul><ul><ul><li>Słabe wsparcie Unicode (tylko UTF-8, poprawione w Ruby 1.9) </li></ul></ul><ul><ul><li>Trudniejszy refactoring </li></ul></ul><ul><ul><li>Bardziej wymagający (łatwiej sobie zrobić krzywdę) </li></ul></ul>
    13. 13. Przyjazna składnia <ul><li>puts 'Hello World!' </li></ul><ul><li>10.times {puts 'Hello'} </li></ul><ul><li>array = [1, 'hi', 3.14, 1, 2, [4, 5]] </li></ul><ul><li>hash = {'water' => 'wet', 'fire' => 'hot'} puts hash['water'] </li></ul>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
    14. 14. Przyjazna składnia <ul><li>def fib n return 1 if n < 2 fib(n-1) + fib(n-2) end </li></ul><ul><li>n = 5 </li></ul><ul><li>puts &quot;#{n}-th Fibonacci number is #{fib n}&quot; </li></ul><ul><li>(1..10).map {|i| i * 2}.find_all {|i| i%3 == 0} </li></ul><ul><li>=> [6, 12, 18] </li></ul>Skrócona forma if return zbędny na końcu metody Interpretowane wewnątrz napisu Tworzy obiekt klasy Range
    15. 15. Zwięzły kod <ul><li>top5 = users. sort_by{|u| u.activity}. last(5). collect{|u| u.login} </li></ul><ul><li>Collections.sort(users, new Comparator<User>() { </li></ul><ul><li>public int compare(User u1, User u2) { </li></ul><ul><li>return u1.getActivity() - u2.getActivity(); </li></ul><ul><li>} </li></ul><ul><li>}); </li></ul><ul><li>List<String> top5 = new ArrayList<String>(5); </li></ul><ul><li>for (User user : users.subList(users.size() - 5, users.size())) { </li></ul><ul><li>top5.add(user.getLogin()); </li></ul><ul><li>} </li></ul>Dostępne w Rails i Ruby 1.9 top5 = users. sort_by(&:activity). last(5). collect(&:login)‏ Podejrzane! Błędy! Accidental complexity!
    16. 16. DSL – Domain Specific Language <ul><li>class User < ActiveRecord::Base </li></ul><ul><li>has_many :projects </li></ul><ul><li>belongs_to :department </li></ul><ul><li>validates_presence_of :name </li></ul><ul><li>validates_uniqueness_of :login </li></ul><ul><li>validate :blacklisted_login? </li></ul><ul><li>before_save :encrypt_password </li></ul><ul><li>... </li></ul>
    17. 17. Otwarte klasy <ul><li>class String def blank? self.strip == '' end end </li></ul><ul><li>class NilClass def blank?; true; end end </li></ul><ul><li>&quot;RUBY&quot;.length </li></ul><ul><li>&quot;RUBY&quot;.blank? </li></ul><ul><li>nil.blank? </li></ul><ul><li>public class StringUtils { public static boolean isBlank(String str) { return str == null || str.trim().equals(&quot;&quot;); } } </li></ul><ul><li>&quot;JAVA&quot;.length(); </li></ul><ul><li>StringUtils.isBlank(&quot;JAVA&quot;); </li></ul><ul><li>StringUtils.isBlank(null); </li></ul>Osobna klasa! Metoda statyczna! Brak konsekwencji!
    18. 18. Metaprogramowanie <ul><li>xml = XmlGenerator.new </li></ul><ul><li>puts xml.people { </li></ul><ul><li>xml.person { </li></ul><ul><li>xml.name {&quot;Gallagher&quot;} + </li></ul><ul><li>xml.profession {&quot;inventor&quot;} + </li></ul><ul><li>xml.fictional </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li><people><person><name>Gallegher</name><profession>inventor</profession><fictional/></person></people> </li></ul><ul><li>class XmlGenerator </li></ul><ul><li>def method_missing m, *args </li></ul><ul><li>if block_given? </li></ul><ul><li>&quot;<#{m}>#{yield}</#{m}>&quot; </li></ul><ul><li>else </li></ul><ul><li>&quot;<#{m}/>&quot; </li></ul><ul><li>end </li></ul><ul><li>end </li></ul><ul><li>end </li></ul>
    19. 19. Metaprogramowanie <ul><li>Person = Struct.new(:name, :phone, :email) p1 = Person.new(:name => &quot;DHH&quot;)‏ </li></ul><ul><li>#Camping class Post < R '/post/(d+)' def get post_id ... end end </li></ul><ul><li>def run_tests methods.grep /^test_/ do |m| self.send m end end </li></ul>
    20. 20. Ruby on Rails <ul><li>Twórca: David Heinemeier Hansson </li></ul><ul><li>Data opublikowania: lipiec 2004 r. </li></ul><ul><li>Obecna wersja stabilna: 2.0.2 </li></ul><ul><li>Stworzony przez wydzielenie z istniejącej aplikacji (Basecamp)‏ </li></ul>
    21. 21. Ruby on Rails – buzzwords <ul><li>MVC </li></ul><ul><li>AJAX </li></ul><ul><li>REST </li></ul><ul><li>DRY </li></ul><ul><li>Convention over Configuration </li></ul><ul><li>Generatory plików </li></ul><ul><li>plugins </li></ul><ul><li>wsparcie dla TDD </li></ul>Web development that doesn't hurt! Optimized for programmer happiness Does it scale? YES! <ul><ul><li>Ruby will reach 4 million programmers by 2013 (Gartner)‏ </li></ul></ul>
    22. 22. Ruby on Rails – enterprise ready? <ul><li>amazon.com </li></ul><ul><li>BBC </li></ul><ul><li>CapGemini </li></ul><ul><li>Cisco </li></ul><ul><li>C|Net </li></ul><ul><li>EA (Electronic Arts) </li></ul><ul><li>IBM </li></ul><ul><li>JP Morgan </li></ul><ul><li>NASA </li></ul><ul><li>Oracle </li></ul><ul><li>New York Times </li></ul><ul><li>NBC </li></ul><ul><li>Barclays </li></ul><ul><li>LA Times </li></ul><ul><li>Chicago Tribune </li></ul><ul><li>Orbitz </li></ul><ul><li>Google </li></ul><ul><li>Turner Media </li></ul><ul><li>Siemens </li></ul><ul><li>Yahoo! </li></ul>YES!
    23. 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. 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. 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. 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. 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. 28. ActiveRecord <=> JPA <ul><li>Wzorzec projektowy: ActiveRecord </li></ul><ul><li>Atrybuty zdefiniowane w tabeli </li></ul><ul><li>Relacje zdefiniowane w klasie </li></ul><ul><li>Mapowanie automatyczne </li></ul><ul><li>Finders, dynamic finders, SQL </li></ul><ul><li>Wzorzec projektowy: DataMapper </li></ul><ul><li>Atrybuty zdefiniowane w klasie </li></ul><ul><li>Relacje zdefiniowane w klasie lub XML </li></ul><ul><li>Mapowanie przez adnotacje lub XML </li></ul><ul><li>Criteria, HQL, SQL </li></ul>
    29. 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. 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. 31. YAML <=> XML <ul><li>dates: </li></ul><ul><li>month names: [sty, lut, mar, kwi, ...] </li></ul><ul><li>day names: [Nie, Pon, Wto, Śro, ...] </li></ul><ul><li>date formats: </li></ul><ul><li>short: '%e %b' </li></ul><ul><li>long: '%e %B %Y' </li></ul><ul><li>numbers: </li></ul><ul><li>separator: '.' </li></ul><ul><li>delimiter: ',' </li></ul><ul><li>precision: 3 </li></ul><ul><li><format> <dates> <month-names> <month-name>sty</month-name> <month-name>lut</month-name> <month-name>mar</month-name> <month-name>kwi</month-name> <month-name>...</month-name> </month-names> <day-names> <day-name>Nie</day-name> <day-name>Pon</day-name> <day-name>Wto</day-name> <day-name>Śro</day-name> <day-name>...</day-name> </day-names> <date-formats> <short>%e %b</short> <long>%e %B %Y</long> </date-formats> </dates> <numbers> <separator>.</separator> <delimiter>,</delimiter> <precision>3</precision> </numbers> </format> </li></ul>
    32. 32. Przydatne adresy <ul><li>http://www.ruby-lang.org/pl/ </li></ul><ul><li>http://www.rubyonrails.org/ </li></ul><ul><li>http://jarorcon.pl/ </li></ul><ul><li>http://szeryf.wordpress.com/ </li></ul>
    33. 33. Pytania?
    1. A particular slide catching your eye?

      Clipping is a handy way to collect important slides you want to go back to later.

    ×