SlideShare a Scribd company logo
1 of 36
Download to read offline
Łukasz Adamczak
http://czak.pl




Co nowego
w świecie Ruby’ego
Na czym stoimy?
Luty 1993
Matz zaczyna pracę nad Rubym

   Grudzień 1996
   Ruby 1.0


       Grudzień 2001
       “Programming Ruby”


        Lipiec 2004
        Ruby on Rails
                         Zdjęcia: Marcin Bajer, Roo Reynolds
Marzec 2007
Ruby 1.8.6

     Grudzień 2007
     Ruby 1.9.0

              Tu jesteś

        Maj 2008
        Ruby 1.8.7

              Koniec 2008 (?)
              Ruby 2.0
Quo vadis, Ruby?
Wydajność




6
       Unicode
       Kolekcje
    Lambdy i Proce
        Fibers
       Perełki
Wydajność
Stan na dziś




           Źródło: Ruby vs PHP Performance Revisited
YARV na ratunek


     • Autor - Koichi Sasada

     • “Yet Another Ruby VM”

     • Merge - styczeń 2007

     • Standard od 1.9


                         Zdjęcie: Marcin Bajer
Efekt?




         Źródło: The Great Ruby Shootout
Inne implementacje




                Źródło: The Great Ruby Shootout
Unicode
Gżegżółka?

‫ﻛﻴﻒ ﺣﺎﻟﻚ؟‬       •   Wiele standardów
                    kodowania

                •   String - ciąg znaków,
                    nie bajtów
                •   Klasa Encoding
                •   String < Enumerable
                •   Rozbudowa API
Przykład
                                                    !
                                                 NEW
> quot;Łukaszquot;.length          > quot;Łukaszquot;.length
=> 7                       => 6

> quot;Łukaszquot;.reverse         > quot;Łukaszquot;.reverse
=> quot;zsaku201305quot;         => quot;zsakuŁquot;

> quot;Łukaszquot;[0]              > quot;Łukaszquot;[0]
=> 197                     => quot;Łquot;
                Ruby 1.8                   Ruby 1.9
Przykład c.d.
                                                    !
                                                 NEW
> quot;Łukaszquot;[0]              > quot;Łukaszquot;[0]
=> 197                     => quot;Łquot;

> ?u                       > ?u
=> 117                     => quot;uquot;

> quot;piesquot;[1]                > quot;małpaquot;[2]
=> 105                     => quot;łquot;
                Ruby 1.8                   Ruby 1.9
Encoding

            •   Odwzorowanie
                bajty znaki

0101101     •   Atrybut każdego Stringa
            •   Standardowe:
                ASCII_8BIT, UTF_8,
                EUC_JP, SHIFT_JIS

            •   Narzucenie, konwersja
                kodowania
Przykład c.d.
# coding: utf-8

# w pliku źródłowym:
quot;Łukaszquot;.encoding      # => <Encoding: UTF-8>
quot;Lukaszquot;.encoding      # => <Encoding: ASCII-8BIT>

# z zewnętrznego źródła:
text = stream.readline.force_encoding(quot;utf-8quot;)
f = File.open(quot;data.txtquot;, quot;r:utf-8quot;)

# konwersja:
euro = quot;€quot;
euroiso = euro.encode(quot;iso-8859-15quot;)


                                                 Ruby 1.9
Kolekcje
Enumerator
 •   Klasa
     Enumerable::Enumerator

 •   Proxy dla kolekcji

 •   Kolekcje z “byle czego”

 •   Automatyczna konstrukcja

 •   Zewnętrzne iteratory
Przykład
# zwykłe proxy
enum = [1, 2, 3].to_enum

# konkretny iterator
enum = quot;helloquot;.enum_for(:each_byte)
                        :each_char
                        :each_line



# automatycznie (tylko 1.9)
enum = quot;helloquot;.each_char    # => Enumerable::Enumerator
enum = quot;helloquot;.chars
enum = 1.upto(10)

# mniam
quot;helloquot;.chars.map {|c| c.succ}.join    # => quot;ifmmpquot;

                                                          Ruby 1.9
Przykład c.d.
# zewnętrzny iterator
iter = quot;helloquot;.chars
begin
  puts iter.next while true
rescue StopIteration
  puts quot;koniecquot;
end

# quot;przewinięciequot; iteratora
iter.rewind

# Kernel.loop przechwytuje StopIteration
loop do
  puts iter.next
end
puts quot;i znowu koniecquot;

                                           Ruby 1.9
Lambdy i Proce
Lambdy i Proce
    • Metody
     Kernel.proc, Kernel.lambda

    • Lambda literals

    • Domyślne wartości
      parametrów

    • Uproszczone wywołanie
    • lambda?
Tworzenie proc / lambda
                                                  !
                                               NEW
# tworzenie procy         # tworzenie procy
p = Proc.new { … }        p = Proc.new { … }
                          p = proc { … }
# tworzenie lambdy
l = lambda { … }          # tworzenie lambdy
l = proc { … }            l = lambda { … }



               Ruby 1.8                  Ruby 1.9
Lambda literals
# dotychczas
square = lambda { |x| x**2 }

# nowość
square = ->(x){ x**2 }

# domyślne parametry
pow = ->(x, exp=2){ x**exp }

# można też tak:
pow = -> x, exp=2 { x**exp }




                               Ruby 1.9
Wywoływanie
square = ->(x){ x**2 }

# można tak:
square.call(14)

# albo tak:
square[14]

# a teraz dodatkowo tak:
square.(14)




                            Ruby 1.9
Włókna
Fiber

 • Co-routines
   (współprogramy)

 • Tworzenie generatorów

 • Konwersja zewnętrzne -
   - wewnętrzne iteratory
Przykład
# generator ciągu Fibonacciego:
f = Fiber.new do
  x, y = 0, 1
  loop do
    Fiber.yield y
    x, y = y, x+y
  end
end


# użycie:
10.times { puts f.resume }




                                  Ruby 1.9
Przykład
# wymiana danych między włóknem a głównym wątkiem
f = Fiber.new do |message|
  puts quot;Program mówi: #{message}quot;
  message2 = Fiber.yield quot;No witam!quot;
  puts quot;Program mówi: #{message2}quot;
  quot;Pozdroquot;
end

# wykonanie:
response = f.resume(quot;Cześćquot;)
puts quot;A włókno na to: #{response}quot;
response2 = f.resume(quot;Muszę leciećquot;)
puts quot;A włókno na to: #{response}quot;


                                              Ruby 1.9
Przykład c.d.
class Generator
  def initialize(enumerable)
    @enumerable = enumerable
    @fiber = Fiber.new do
      @enumerable.each do |i|
        Fiber.yield i
      end
      raise StopIteration
    end
  end

  def next
    @fiber.resume
  end
end

# użycie:
g = Generator.new([1, 3, 5])
loop { puts g.next }

                                Ruby 1.9
Perełki
Nowa składnia Hashy
Zmienne lokalne dla bloku
                                { name: quot;Annaquot;, age: 27 }
arr.each do |i;x,y|
  # …
end


                            Domyślne wartości parametrów.succ


   reduce                     def foo(x, y=10, z)
                                quot;#{x}, #{y}, #{z}quot;
                              end
   [1, 2, 3].reduce(:+)
                              foo(1, 2)   # => quot;1, 10, 2quot;
Permutacje i kombinacje


a = [1, 2, 3]
a.permutation(2)
a.combination(2)
                                                 tap


                          quot;helloquot;.chomp.tap {|s| p s}.reverse




 with_index


quot;helloquot;.each_char.with_index {|c,i| … }
Pytania?
Dziękuję
© 2008 Łukasz Adamczak

More Related Content

Viewers also liked (8)

Colecciones
ColeccionesColecciones
Colecciones
 
DéCalogo
DéCalogoDéCalogo
DéCalogo
 
Programação dia 25 26-27-28 de fevereiro de 2013
Programação dia  25 26-27-28 de fevereiro de 2013Programação dia  25 26-27-28 de fevereiro de 2013
Programação dia 25 26-27-28 de fevereiro de 2013
 
Tendències de consum per al 2015
Tendències de consum per al 2015Tendències de consum per al 2015
Tendències de consum per al 2015
 
Com negociar amb el meu banc
Com negociar amb el meu bancCom negociar amb el meu banc
Com negociar amb el meu banc
 
Caracterització
CaracteritzacióCaracterització
Caracterització
 
Aabenhed Talk-It (21-10-2009)
Aabenhed Talk-It (21-10-2009)Aabenhed Talk-It (21-10-2009)
Aabenhed Talk-It (21-10-2009)
 
A fuga do judeu
A fuga do judeuA fuga do judeu
A fuga do judeu
 

More from Bootstrap

Rapid Prototyping With J Query
Rapid Prototyping With J QueryRapid Prototyping With J Query
Rapid Prototyping With J QueryBootstrap
 
Flash & web standards, Krzysztof Szafranek (Bootstrap 9.6)
Flash & web standards, Krzysztof Szafranek (Bootstrap 9.6)Flash & web standards, Krzysztof Szafranek (Bootstrap 9.6)
Flash & web standards, Krzysztof Szafranek (Bootstrap 9.6)Bootstrap
 
Salesguru.Pl na Bootstrapie
Salesguru.Pl na BootstrapieSalesguru.Pl na Bootstrapie
Salesguru.Pl na BootstrapieBootstrap
 
Bootstrap 9.4 - Hackerspaces - Christoffer Jerkeby, Olle Jonsson
Bootstrap 9.4 - Hackerspaces - Christoffer Jerkeby, Olle JonssonBootstrap 9.4 - Hackerspaces - Christoffer Jerkeby, Olle Jonsson
Bootstrap 9.4 - Hackerspaces - Christoffer Jerkeby, Olle JonssonBootstrap
 
Bootstrap 9.4 - Arduino - Witold Rugowski
Bootstrap 9.4 - Arduino - Witold RugowskiBootstrap 9.4 - Arduino - Witold Rugowski
Bootstrap 9.4 - Arduino - Witold RugowskiBootstrap
 
Getting Physical - Tomasz Kolinko (Bootstrap 9.4, Arduino)
Getting Physical - Tomasz Kolinko (Bootstrap 9.4, Arduino)Getting Physical - Tomasz Kolinko (Bootstrap 9.4, Arduino)
Getting Physical - Tomasz Kolinko (Bootstrap 9.4, Arduino)Bootstrap
 
Programowanie Gier MMO
Programowanie Gier MMOProgramowanie Gier MMO
Programowanie Gier MMOBootstrap
 
Kokon a trzon. o2.pl 2005-2010
Kokon a trzon. o2.pl 2005-2010Kokon a trzon. o2.pl 2005-2010
Kokon a trzon. o2.pl 2005-2010Bootstrap
 
Monika Mosiewicz, Jak administrować społecznością i nie trafić przed sąd
Monika Mosiewicz, Jak administrować społecznością i nie trafić przed sądMonika Mosiewicz, Jak administrować społecznością i nie trafić przed sąd
Monika Mosiewicz, Jak administrować społecznością i nie trafić przed sądBootstrap
 
Andrzej Wichrowski, Społeczności internetowe okiem psychologa
Andrzej Wichrowski, Społeczności internetowe okiem psychologaAndrzej Wichrowski, Społeczności internetowe okiem psychologa
Andrzej Wichrowski, Społeczności internetowe okiem psychologaBootstrap
 
Doliny Krzemowej to tu nie będzie…
Doliny Krzemowej to tu nie będzie…Doliny Krzemowej to tu nie będzie…
Doliny Krzemowej to tu nie będzie…Bootstrap
 
Blip technicznie, czyli inżynieria uzależnień...
Blip technicznie, czyli inżynieria uzależnień...Blip technicznie, czyli inżynieria uzależnień...
Blip technicznie, czyli inżynieria uzależnień...Bootstrap
 
Rails 2 - web aplikacje bardziej subiektywnie
Rails 2 - web aplikacje bardziej subiektywnieRails 2 - web aplikacje bardziej subiektywnie
Rails 2 - web aplikacje bardziej subiektywnieBootstrap
 
Mikroblogging, czyli jak się pisze twitteroida
Mikroblogging, czyli jak się pisze twitteroidaMikroblogging, czyli jak się pisze twitteroida
Mikroblogging, czyli jak się pisze twitteroidaBootstrap
 

More from Bootstrap (18)

Rapid Prototyping With J Query
Rapid Prototyping With J QueryRapid Prototyping With J Query
Rapid Prototyping With J Query
 
Flash & web standards, Krzysztof Szafranek (Bootstrap 9.6)
Flash & web standards, Krzysztof Szafranek (Bootstrap 9.6)Flash & web standards, Krzysztof Szafranek (Bootstrap 9.6)
Flash & web standards, Krzysztof Szafranek (Bootstrap 9.6)
 
dobry dizajn
dobry dizajndobry dizajn
dobry dizajn
 
Salesguru.Pl na Bootstrapie
Salesguru.Pl na BootstrapieSalesguru.Pl na Bootstrapie
Salesguru.Pl na Bootstrapie
 
Bootstrap 9.4 - Hackerspaces - Christoffer Jerkeby, Olle Jonsson
Bootstrap 9.4 - Hackerspaces - Christoffer Jerkeby, Olle JonssonBootstrap 9.4 - Hackerspaces - Christoffer Jerkeby, Olle Jonsson
Bootstrap 9.4 - Hackerspaces - Christoffer Jerkeby, Olle Jonsson
 
Bootstrap 9.4 - Arduino - Witold Rugowski
Bootstrap 9.4 - Arduino - Witold RugowskiBootstrap 9.4 - Arduino - Witold Rugowski
Bootstrap 9.4 - Arduino - Witold Rugowski
 
Getting Physical - Tomasz Kolinko (Bootstrap 9.4, Arduino)
Getting Physical - Tomasz Kolinko (Bootstrap 9.4, Arduino)Getting Physical - Tomasz Kolinko (Bootstrap 9.4, Arduino)
Getting Physical - Tomasz Kolinko (Bootstrap 9.4, Arduino)
 
Programowanie Gier MMO
Programowanie Gier MMOProgramowanie Gier MMO
Programowanie Gier MMO
 
Kokon a trzon. o2.pl 2005-2010
Kokon a trzon. o2.pl 2005-2010Kokon a trzon. o2.pl 2005-2010
Kokon a trzon. o2.pl 2005-2010
 
Szuku.pl
Szuku.plSzuku.pl
Szuku.pl
 
Monika Mosiewicz, Jak administrować społecznością i nie trafić przed sąd
Monika Mosiewicz, Jak administrować społecznością i nie trafić przed sądMonika Mosiewicz, Jak administrować społecznością i nie trafić przed sąd
Monika Mosiewicz, Jak administrować społecznością i nie trafić przed sąd
 
Andrzej Wichrowski, Społeczności internetowe okiem psychologa
Andrzej Wichrowski, Społeczności internetowe okiem psychologaAndrzej Wichrowski, Społeczności internetowe okiem psychologa
Andrzej Wichrowski, Społeczności internetowe okiem psychologa
 
Doliny Krzemowej to tu nie będzie…
Doliny Krzemowej to tu nie będzie…Doliny Krzemowej to tu nie będzie…
Doliny Krzemowej to tu nie będzie…
 
Textilla 15
Textilla 15Textilla 15
Textilla 15
 
Livechat 2008
Livechat 2008Livechat 2008
Livechat 2008
 
Blip technicznie, czyli inżynieria uzależnień...
Blip technicznie, czyli inżynieria uzależnień...Blip technicznie, czyli inżynieria uzależnień...
Blip technicznie, czyli inżynieria uzależnień...
 
Rails 2 - web aplikacje bardziej subiektywnie
Rails 2 - web aplikacje bardziej subiektywnieRails 2 - web aplikacje bardziej subiektywnie
Rails 2 - web aplikacje bardziej subiektywnie
 
Mikroblogging, czyli jak się pisze twitteroida
Mikroblogging, czyli jak się pisze twitteroidaMikroblogging, czyli jak się pisze twitteroida
Mikroblogging, czyli jak się pisze twitteroida
 

Co nowego w świecie Ruby\'ego

  • 3. Luty 1993 Matz zaczyna pracę nad Rubym Grudzień 1996 Ruby 1.0 Grudzień 2001 “Programming Ruby” Lipiec 2004 Ruby on Rails Zdjęcia: Marcin Bajer, Roo Reynolds
  • 4. Marzec 2007 Ruby 1.8.6 Grudzień 2007 Ruby 1.9.0 Tu jesteś Maj 2008 Ruby 1.8.7 Koniec 2008 (?) Ruby 2.0
  • 6. Wydajność 6 Unicode Kolekcje Lambdy i Proce Fibers Perełki
  • 8. Stan na dziś Źródło: Ruby vs PHP Performance Revisited
  • 9. YARV na ratunek • Autor - Koichi Sasada • “Yet Another Ruby VM” • Merge - styczeń 2007 • Standard od 1.9 Zdjęcie: Marcin Bajer
  • 10. Efekt? Źródło: The Great Ruby Shootout
  • 11. Inne implementacje Źródło: The Great Ruby Shootout
  • 13. Gżegżółka? ‫ﻛﻴﻒ ﺣﺎﻟﻚ؟‬ • Wiele standardów kodowania • String - ciąg znaków, nie bajtów • Klasa Encoding • String < Enumerable • Rozbudowa API
  • 14. Przykład ! NEW > quot;Łukaszquot;.length > quot;Łukaszquot;.length => 7 => 6 > quot;Łukaszquot;.reverse > quot;Łukaszquot;.reverse => quot;zsaku201305quot; => quot;zsakuŁquot; > quot;Łukaszquot;[0] > quot;Łukaszquot;[0] => 197 => quot;Łquot; Ruby 1.8 Ruby 1.9
  • 15. Przykład c.d. ! NEW > quot;Łukaszquot;[0] > quot;Łukaszquot;[0] => 197 => quot;Łquot; > ?u > ?u => 117 => quot;uquot; > quot;piesquot;[1] > quot;małpaquot;[2] => 105 => quot;łquot; Ruby 1.8 Ruby 1.9
  • 16. Encoding • Odwzorowanie bajty znaki 0101101 • Atrybut każdego Stringa • Standardowe: ASCII_8BIT, UTF_8, EUC_JP, SHIFT_JIS • Narzucenie, konwersja kodowania
  • 17. Przykład c.d. # coding: utf-8 # w pliku źródłowym: quot;Łukaszquot;.encoding # => <Encoding: UTF-8> quot;Lukaszquot;.encoding # => <Encoding: ASCII-8BIT> # z zewnętrznego źródła: text = stream.readline.force_encoding(quot;utf-8quot;) f = File.open(quot;data.txtquot;, quot;r:utf-8quot;) # konwersja: euro = quot;€quot; euroiso = euro.encode(quot;iso-8859-15quot;) Ruby 1.9
  • 19. Enumerator • Klasa Enumerable::Enumerator • Proxy dla kolekcji • Kolekcje z “byle czego” • Automatyczna konstrukcja • Zewnętrzne iteratory
  • 20. Przykład # zwykłe proxy enum = [1, 2, 3].to_enum # konkretny iterator enum = quot;helloquot;.enum_for(:each_byte) :each_char :each_line # automatycznie (tylko 1.9) enum = quot;helloquot;.each_char # => Enumerable::Enumerator enum = quot;helloquot;.chars enum = 1.upto(10) # mniam quot;helloquot;.chars.map {|c| c.succ}.join # => quot;ifmmpquot; Ruby 1.9
  • 21. Przykład c.d. # zewnętrzny iterator iter = quot;helloquot;.chars begin puts iter.next while true rescue StopIteration puts quot;koniecquot; end # quot;przewinięciequot; iteratora iter.rewind # Kernel.loop przechwytuje StopIteration loop do puts iter.next end puts quot;i znowu koniecquot; Ruby 1.9
  • 23. Lambdy i Proce • Metody Kernel.proc, Kernel.lambda • Lambda literals • Domyślne wartości parametrów • Uproszczone wywołanie • lambda?
  • 24. Tworzenie proc / lambda ! NEW # tworzenie procy # tworzenie procy p = Proc.new { … } p = Proc.new { … } p = proc { … } # tworzenie lambdy l = lambda { … } # tworzenie lambdy l = proc { … } l = lambda { … } Ruby 1.8 Ruby 1.9
  • 25. Lambda literals # dotychczas square = lambda { |x| x**2 } # nowość square = ->(x){ x**2 } # domyślne parametry pow = ->(x, exp=2){ x**exp } # można też tak: pow = -> x, exp=2 { x**exp } Ruby 1.9
  • 26. Wywoływanie square = ->(x){ x**2 } # można tak: square.call(14) # albo tak: square[14] # a teraz dodatkowo tak: square.(14) Ruby 1.9
  • 28. Fiber • Co-routines (współprogramy) • Tworzenie generatorów • Konwersja zewnętrzne - - wewnętrzne iteratory
  • 29. Przykład # generator ciągu Fibonacciego: f = Fiber.new do x, y = 0, 1 loop do Fiber.yield y x, y = y, x+y end end # użycie: 10.times { puts f.resume } Ruby 1.9
  • 30. Przykład # wymiana danych między włóknem a głównym wątkiem f = Fiber.new do |message| puts quot;Program mówi: #{message}quot; message2 = Fiber.yield quot;No witam!quot; puts quot;Program mówi: #{message2}quot; quot;Pozdroquot; end # wykonanie: response = f.resume(quot;Cześćquot;) puts quot;A włókno na to: #{response}quot; response2 = f.resume(quot;Muszę leciećquot;) puts quot;A włókno na to: #{response}quot; Ruby 1.9
  • 31. Przykład c.d. class Generator def initialize(enumerable) @enumerable = enumerable @fiber = Fiber.new do @enumerable.each do |i| Fiber.yield i end raise StopIteration end end def next @fiber.resume end end # użycie: g = Generator.new([1, 3, 5]) loop { puts g.next } Ruby 1.9
  • 33. Nowa składnia Hashy Zmienne lokalne dla bloku { name: quot;Annaquot;, age: 27 } arr.each do |i;x,y| # … end Domyślne wartości parametrów.succ reduce def foo(x, y=10, z) quot;#{x}, #{y}, #{z}quot; end [1, 2, 3].reduce(:+) foo(1, 2) # => quot;1, 10, 2quot;
  • 34. Permutacje i kombinacje a = [1, 2, 3] a.permutation(2) a.combination(2) tap quot;helloquot;.chomp.tap {|s| p s}.reverse with_index quot;helloquot;.each_char.with_index {|c,i| … }