Jarorcon Sp

Loading...

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

1 comments

Comments 1 - 1 of 1 previous next Post a comment

  • + guesta0576a guesta0576a 2 years ago
    Mirek & Przemek,

    thanks a lot for this presentation, pretty good job !

    Thomas
Post a comment
Embed Video
Edit your comment Cancel

Favorites, Groups & Events

Jarorcon Sp - Presentation Transcript

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

+ jarorconjarorcon, 2 years ago

custom

575 views, 0 favs, 1 embeds more stats

Jarorcon company introducing Ruby on Rails

More info about this document

© All Rights Reserved

Go to text version

  • Total Views 575
    • 574 on SlideShare
    • 1 from embeds
  • Comments 1
  • Favorites 0
  • Downloads 5
Most viewed embeds
  • 1 views on http://www.jarorcon.de

more

All embeds
  • 1 views on http://www.jarorcon.de

less

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate. If needed, use the feedback form to let us know more details.

Cancel
File a copyright complaint
Having problems? Go to our helpdesk?

Categories