Ruby Mola (y por qué)

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.

0 comments

Post a comment

    Post a comment
    Embed Video
    Edit your comment Cancel

    4 Favorites

    Ruby Mola (y por qué) - Presentation Transcript

    1. Ruby Mola (y por qué) Sergio Gil Conferencia Rails noviembre de 2006 1
    2. Ruby
    3. Ruby
    4. Ruby • Simple
    5. Ruby • Simple • Completo
    6. Ruby • Simple • Orientado a objetos • Completo
    7. Ruby • Simple • Orientado a objetos • Completo • Dinamico ´
    8. Ruby • Simple • Orientado a objetos • Completo • Dinamico ´ Ruby y Ruby on Rails
    9. Ruby • Simple • Orientado a objetos • Completo • Dinamico ´ Ruby y Ruby on Rails • Rails aprovecha al maximo la potencia y el ´ dinamismo de Ruby
    10. Ruby • Simple • Orientado a objetos • Completo • Dinamico ´ Ruby y Ruby on Rails • Rails aprovecha al maximo la potencia y el ´ dinamismo de Ruby • DHH opina que no hubiera podido crear Rails con otro lenguaje.
    11. Ruby • Simple • Orientado a objetos • Completo • Dinamico ´ Ruby y Ruby on Rails • Rails aprovecha al maximo la potencia y el ´ dinamismo de Ruby • DHH opina que no hubiera podido crear Rails con otro lenguaje. • Y sin embargo, esta infrautilizado ´
    12. Ruby • Simple • Orientado a objetos • Completo • Dinamico ´ Ruby y Ruby on Rails • Rails aprovecha al maximo la potencia y el ´ dinamismo de Ruby • DHH opina que no hubiera podido crear Rails con otro lenguaje. • Y sin embargo, esta infrautilizado ´
    13. 1 Un lenguaje muy dulce
    14. 1 Un lenguaje muy dulce 2 ‘De serie’
    15. 1 Un lenguaje muy dulce 2 ‘De serie’ ´ 3 Orientacion a objetos
    16. 1 Un lenguaje muy dulce 2 ‘De serie’ ´ 3 Orientacion a objetos ´ 4 Un lenguaje dinamico
    17. Un lenguaje muy dulce 1 Un lenguaje muy dulce 2 ‘De serie’ ´ 3 Orientacion a objetos ´ 4 Un lenguaje dinamico
    18. Un lenguaje muy dulce “Quien no ha probado lo amargo, no sabe lo que es dulce” ´ PROVERBIO ALEM A N
    19. Un lenguaje muy dulce • Los idiomas influyen (¿determinan?) la manera de pensar de las personas
    20. Un lenguaje muy dulce • Los idiomas influyen (¿determinan?) la manera de pensar de las personas • Los lenguajes, la de los programadores
    21. Un lenguaje muy dulce • Los idiomas influyen (¿determinan?) la manera de pensar de las personas • Los lenguajes, la de los programadores Ruby
    22. Un lenguaje muy dulce • Los idiomas influyen (¿determinan?) la manera de pensar de las personas • Los lenguajes, la de los programadores Ruby • Cercano a nuestra forma de pensar
    23. Un lenguaje muy dulce • Los idiomas influyen (¿determinan?) la manera de pensar de las personas • Los lenguajes, la de los programadores Ruby • Cercano a nuestra forma de pensar • Lo cual da una experiencia mejor
    24. Un lenguaje muy dulce • Los idiomas influyen (¿determinan?) la manera de pensar de las personas • Los lenguajes, la de los programadores Ruby • Cercano a nuestra forma de pensar • Lo cual da una experiencia mejor • ¡Es divertido!
    25. Un lenguaje muy dulce • Los idiomas influyen (¿determinan?) la manera de pensar de las personas • Los lenguajes, la de los programadores Ruby • Cercano a nuestra forma de pensar • Lo cual da una experiencia mejor • ¡Es divertido! • Te hace sentir inteligente
    26. Un lenguaje muy dulce • Los idiomas influyen (¿determinan?) la manera de pensar de las personas • Los lenguajes, la de los programadores Ruby • Cercano a nuestra forma de pensar • Lo cual da una experiencia mejor • ¡Es divertido! • Te hace sentir inteligente • ‘Ruby stays out of your way’
    27. Un lenguaje muy dulce Algunos ejemplos
    28. Un lenguaje muy dulce ´ Las estructuras devuelven el valor de la ultima expresion ´ evaluada: @user = if params[:id] User.find(params[:id]) else User.new end
    29. Un lenguaje muy dulce ´ Las estructuras devuelven el valor de la ultima expresion ´ evaluada: @user = if params[:id] User.find(params[:id]) else User.new end
    30. Un lenguaje muy dulce ´ Las estructuras devuelven el valor de la ultima expresion ´ evaluada: @user = if params[:id] User.find(params[:id]) else User.new end
    31. Un lenguaje muy dulce ´ Las estructuras devuelven el valor de la ultima expresion ´ evaluada: @user = if params[:id] User.find(params[:id]) else User.new end ´ Menos codigo 1
    32. Un lenguaje muy dulce ´ Las estructuras devuelven el valor de la ultima expresion ´ evaluada: @user = if params[:id] User.find(params[:id]) else User.new end ´ Menos codigo 1 Menos errores 2
    33. Un lenguaje muy dulce ´ Las estructuras devuelven el valor de la ultima expresion ´ evaluada: @user = if params[:id] User.find(params[:id]) else User.new end ´ Menos codigo 1 Menos errores 2 ´ ¡Mas bonito! 3
    34. Un lenguaje muy dulce ´ Las asignaciones tambien devuelven el valor asignado: @post = Post.find(params[:id]) if @post @post.destroy end
    35. Un lenguaje muy dulce ´ Las asignaciones tambien devuelven el valor asignado: @post = Post.find(params[:id]) if @post @post.destroy end Mejor: if @post = Post.find(params[:id]) @post.destroy end
    36. Un lenguaje muy dulce ´ Las asignaciones tambien devuelven el valor asignado: @post = Post.find(params[:id]) if @post @post.destroy end Mejor: if @post = Post.find(params[:id]) @post.destroy end
    37. Un lenguaje muy dulce ´ Las asignaciones tambien devuelven el valor asignado: @post = Post.find(params[:id]) if @post @post.destroy end Mejor: if @post = Post.find(params[:id]) @post.destroy end • Y ademas nos repetimos menos ´
    38. Un lenguaje muy dulce Asignaciones condicionales
    39. Un lenguaje muy dulce Asignaciones condicionales @title = "T´tulo gen´rico" unless defined?(@title) ı e
    40. Un lenguaje muy dulce Asignaciones condicionales @title = "T´tulo gen´rico" unless defined?(@title) ı e @title ||= "T´tulo gen´rico" ı e
    41. Un lenguaje muy dulce Asignaciones condicionales @title = "T´tulo gen´rico" unless defined?(@title) ı e @title ||= "T´tulo gen´rico" ı e @heading = if defined?(@subsection) @subsection.title else @section.title end
    42. Un lenguaje muy dulce Asignaciones condicionales @title = "T´tulo gen´rico" unless defined?(@title) ı e @title ||= "T´tulo gen´rico" ı e @heading = if defined?(@subsection) @subsection.title else @section.title end @heading = ( @subsection || @section ).title
    43. Un lenguaje muy dulce Asignaciones condicionales @title = "T´tulo gen´rico" unless defined?(@title) ı e @title ||= "T´tulo gen´rico" ı e @heading = if defined?(@subsection) @subsection.title else @section.title end @heading = ( @subsection || @section ).title
    44. ‘De serie’ 1 Un lenguaje muy dulce 2 ‘De serie’ ´ 3 Orientacion a objetos ´ 4 Un lenguaje dinamico
    45. ‘De serie’ “Cualquier tecnolog´a ı distinguible de la magia es insuficientemente avanzada” ´ CLE ON I
    46. ‘De serie’ • La clase Array1 es una de las joyas de las clases inclu´das ı 1 ´ Sin olvidar el modulo Enumerable
    47. ‘De serie’ • La clase Array1 es una de las joyas de las clases inclu´das ı • Le daremos un repaso para ejemplificar: 1 ´ Sin olvidar el modulo Enumerable
    48. ‘De serie’ • La clase Array1 es una de las joyas de las clases inclu´das ı • Le daremos un repaso para ejemplificar: • La potencia de las clases inclu´das ı 1 ´ Sin olvidar el modulo Enumerable
    49. ‘De serie’ • La clase Array1 es una de las joyas de las clases inclu´das ı • Le daremos un repaso para ejemplificar: • La potencia de las clases inclu´das ı • La potencia y el uso de los bloques 1 ´ Sin olvidar el modulo Enumerable
    50. ‘De serie’ • La clase Array1 es una de las joyas de las clases inclu´das ı • Le daremos un repaso para ejemplificar: • La potencia de las clases inclu´das ı • La potencia y el uso de los bloques • El ‘estilo Ruby’ 1 ´ Sin olvidar el modulo Enumerable
    51. ‘De serie’ @arr = [ 1, 2, 3, 4, 5 ]
    52. ‘De serie’ @arr = [ 1, 2, 3, 4, 5 ] Iterando: @arr.each do |item| puts item end
    53. ‘De serie’ @arr = [ 1, 2, 3, 4, 5 ] Iterando: @arr.each do |item| puts item end
    54. ‘De serie’ @arr = [ 1, 2, 3, 4, 5 ] Iterando: @arr.each do |item| puts item end
    55. ‘De serie’ @arr = [ 1, 2, 3, 4, 5 ] Iterando: Que es el for de toda la vida: @arr.each do |item| for item in @arr puts item puts item end end
    56. ‘De serie’ @arr = [ 1, 2, 3, 4, 5 ] Iterando: Que es el for de toda la vida: @arr.each do |item| for item in @arr puts item puts item end end
    57. ‘De serie’ @arr = [ 1, 2, 3, 4, 5 ] Iterando: Que es el for de toda la vida: @arr.each do |item| for item in @arr puts item puts item end end
    58. ‘De serie’ Lo bueno empieza ahora:
    59. ‘De serie’ Lo bueno empieza ahora: Utilidades varias • .uniq [ 1, 1, 2, 3, 3 ].uniq >> [ 1, 2, 3 ]
    60. ‘De serie’ Lo bueno empieza ahora: Utilidades varias • .uniq • .flatten [ [ 1, 1 ], 2, [ 3, 3 ] ].flatten >> [ 1, 1, 2, 3, 3 ]
    61. ‘De serie’ Lo bueno empieza ahora: Utilidades varias • .uniq • .flatten [ 1, nil, 2, nil, 3 ].compact • .compact >> [ 1, 2, 3 ]
    62. ‘De serie’ Lo bueno empieza ahora: Utilidades varias • .uniq • .flatten [ 1, 1, 2, 3, 3 ].reverse • .compact >> [ 3, 3, 2, 1, 1 ] • .reverse
    63. ‘De serie’ Lo bueno empieza ahora: Utilidades varias • .uniq • .flatten [ 1, 3, 2, 1, 3 ].sort • .compact >> [ 1, 1, 2, 3, 3 ] • .reverse • .sort
    64. ‘De serie’ Lo bueno empieza ahora: Utilidades varias • .uniq • .flatten • .compact • .reverse • .sort Busqueda ´ [ 1, 2, 3 ].find {|n| n % 3 == 0 } >> 3 • .find [ 1, 2, 3 ].find {|n| n % 5 == 0 } >> nil
    65. ‘De serie’ Lo bueno empieza ahora: Utilidades varias • .uniq • .flatten • .compact • .reverse • .sort Busqueda ´ [ 1, 3, 5, 6 ].find all {|n| n % 3 == 0 } >> [ 3, 6 ] • .find [ 1, 2, 3 ].find all {|n| n % 5 == 0 } • .find all >> []
    66. ‘De serie’ Lo bueno empieza ahora: Utilidades varias • .uniq • .flatten • .compact • .reverse • .sort Busqueda ´ [ 1, 3, 5, 6 ].reject {|n| n % 3 == 0 } >> [ 1, 5] • .find [ 1, 2, 3 ].reject {|n| n % 5 == 0 } • .find all >> [ 1, 2, 3 ]
    67. ‘De serie’ Operaciones • ‘Suma’: + [ 1, 2 ] + [ 3, 4 ] >> [ 1, 2, 3, 4 ]
    68. ‘De serie’ Operaciones • ‘Suma’: + • ‘Resta’: - [ 1, 2, 3, 4 ] - [ 2, 3 ] >> [ 1, 4 ]
    69. ‘De serie’ Operaciones • ‘Suma’: + • ‘Resta’: - [ 1, 2 ] * 3 • ‘Repeticion’: * ´ >> [ 1, 2, 1, 2, 1, 2 ]
    70. ‘De serie’ Operaciones • ‘Suma’: + • ‘Resta’: - [ 0, 1, 2, 3, 4 ] & [ 0, 3, 6 ] • ‘Repeticion’: * ´ >> [ 0, 3 ] • Interseccion (∩): & ´
    71. ‘De serie’ Operaciones • ‘Suma’: + • ‘Resta’: - [ 1, 2, 3] | [ 3, 4, 5 ] • ‘Repeticion’: * ´ >> [ 1, 2, 3, 4, 5 ] • Interseccion (∩): & ´ • Union (∪): | ´
    72. ‘De serie’ ´ Nunca mas esto: @precios = ... @ivas = [] @precios.each do |precio| @ivas << precio * 0.16 end
    73. ‘De serie’ ´ Nunca mas esto: @precios = ... @ivas = [] @precios.each do |precio| @ivas << precio * 0.16 end ¿No es mejor esto? @ivas = @precios.map {|precio| precio * 0.16 }
    74. ‘De serie’ Por si hace falta otro ejemplo: @precios = ... @total = 0 @precios.each do |precio| @total += precio end
    75. ‘De serie’ Por si hace falta otro ejemplo: @precios = ... @total = 0 @precios.each do |precio| @total += precio end ´ ¿No es mas bonito as´? ı @total = @precios.inject {|t, precio| t + precio }
    76. ‘De serie’ ¿Y en Rails? Algunos ejemplos chulos:
    77. ‘De serie’ ¿Y en Rails? Algunos ejemplos chulos: @comments = @posts.map { |p| p.comments }.flatten.sort
    78. ‘De serie’ ¿Y en Rails? Algunos ejemplos chulos: @comments = @posts.map { |p| p.comments }.flatten.sort
    79. ‘De serie’ ¿Y en Rails? Algunos ejemplos chulos: @comments = @posts.map { |p| p.comments }.flatten.sort
    80. ‘De serie’ ¿Y en Rails? Algunos ejemplos chulos: @comments = @posts.map { |p| p.comments }.flatten.sort @last comments = Comment.find(:all, :order => ’date DESC’, :limit => 10) @last commented posts = @last comments.map { |c| c.post }.uniq
    81. ‘De serie’ ¿Y en Rails? Algunos ejemplos chulos: @comments = @posts.map { |p| p.comments }.flatten.sort @last comments = Comment.find(:all, :order => ’date DESC’, :limit => 10) @last commented posts = @last comments.map { |c| c.post }.uniq
    82. ‘De serie’ ¿Y en Rails? Algunos ejemplos chulos: @comments = @posts.map { |p| p.comments }.flatten.sort @last comments = Comment.find(:all, :order => ’date DESC’, :limit => 10) @last commented posts = @last comments.map { |c| c.post }.uniq <p>Comentado por: <%= @post.comments.sort[0..4].map { |c| link to(c.user.name, c.permalink) }.join(’, ’) %></p>
    83. ‘De serie’ ¿Y en Rails? Algunos ejemplos chulos: @comments = @posts.map { |p| p.comments }.flatten.sort @last comments = Comment.find(:all, :order => ’date DESC’, :limit => 10) @last commented posts = @last comments.map { |c| c.post }.uniq <p>Comentado por: <%= @post.comments.sort[0..4].map { |c| link to(c.user.name, c.permalink) }.join(’, ’) %></p>
    84. ‘De serie’ ¿Y en Rails? Algunos ejemplos chulos: @comments = @posts.map { |p| p.comments }.flatten.sort @last comments = Comment.find(:all, :order => ’date DESC’, :limit => 10) @last commented posts = @last comments.map { |c| c.post }.uniq <p>Comentado por: <%= @post.comments.sort[0..4].map { |c| link to(c.user.name, c.permalink) }.join(’, ’) %></p>
    85. ‘De serie’ ¿Y en Rails? Algunos ejemplos chulos: @comments = @posts.map { |p| p.comments }.flatten.sort @last comments = Comment.find(:all, :order => ’date DESC’, :limit => 10) @last commented posts = @last comments.map { |c| c.post }.uniq <p>Comentado por: <%= @post.comments.sort[0..4].map { |c| link to(c.user.name, c.permalink) }.join(’, ’) %></p>
    86. ‘De serie’ Merece la pena conocer bien las clases inclu´das ı ´ Algunas clases y modulos que no perder de vista
    87. ‘De serie’ Merece la pena conocer bien las clases inclu´das ı ´ Algunas clases y modulos que no perder de vista • Array
    88. ‘De serie’ Merece la pena conocer bien las clases inclu´das ı ´ Algunas clases y modulos que no perder de vista • Array • Enumerable
    89. ‘De serie’ Merece la pena conocer bien las clases inclu´das ı ´ Algunas clases y modulos que no perder de vista • Array • Enumerable • Hash
    90. ‘De serie’ Merece la pena conocer bien las clases inclu´das ı ´ Algunas clases y modulos que no perder de vista • Array • Enumerable • Hash • Numeric
    91. ‘De serie’ Merece la pena conocer bien las clases inclu´das ı ´ Algunas clases y modulos que no perder de vista • Array • Range • Enumerable • Hash • Numeric
    92. ‘De serie’ Merece la pena conocer bien las clases inclu´das ı ´ Algunas clases y modulos que no perder de vista • Array • Range • Enumerable • Regexp • Hash • Numeric
    93. ‘De serie’ Merece la pena conocer bien las clases inclu´das ı ´ Algunas clases y modulos que no perder de vista • Array • Range • Enumerable • Regexp • Hash • String • Numeric
    94. ‘De serie’ Merece la pena conocer bien las clases inclu´das ı ´ Algunas clases y modulos que no perder de vista • Array • Range • Enumerable • Regexp • Hash • String • Numeric • Time
    95. ´ Orientacion a objetos 1 Un lenguaje muy dulce 2 ‘De serie’ ´ 3 Orientacion a objetos ´ 4 Un lenguaje dinamico
    96. ´ Orientacion a objetos “Los prisioneros de la ´ caverna solo ven las sombras de los objetos.” ´ PLAT ON
    97. ´ Orientacion a objetos En Ruby: • Todo es un objeto
    98. ´ Orientacion a objetos En Ruby: • Todo es un objeto • Todo
    99. ´ Orientacion a objetos En Ruby: • Todo es un objeto • Todo • De verdad, todo
    100. ´ Orientacion a objetos En serio, todo: • No hay ‘tipos primitivos’ 2 ´ Lo cual permite tecnicas avanzadas que no veremos hoy =;-)
    101. ´ Orientacion a objetos En serio, todo: • No hay ‘tipos primitivos’ • Los numeros son objetos Fixnum (o Float, o...) ´ 2 ´ Lo cual permite tecnicas avanzadas que no veremos hoy =;-)
    102. ´ Orientacion a objetos En serio, todo: • No hay ‘tipos primitivos’ • Los numeros son objetos Fixnum (o Float, o...) ´ • Las cadenas son objetos String 2 ´ Lo cual permite tecnicas avanzadas que no veremos hoy =;-)
    103. ´ Orientacion a objetos En serio, todo: • No hay ‘tipos primitivos’ • Los numeros son objetos Fixnum (o Float, o...) ´ • Las cadenas son objetos String • Incluso las clases son objetos Class2 2 ´ Lo cual permite tecnicas avanzadas que no veremos hoy =;-)
    104. ´ Orientacion a objetos De toda la vida: def sanitize title(title) sanitized title = ... return sanitized title end ... post.title = params[:title] post.sanitized title = sanitize title(post.title)
    105. ´ Orientacion a objetos ´ ´ Mas bonito y mas DRY : class Post < ActiveRecord::Base def sanitized title ... end end ... post.title = params[:title] post.sanitized title
    106. ´ Orientacion a objetos Mejor aun: ´ class String def sanitize ... end end ... post.title = params[:title] post.title.sanitize
    107. ´ Un lenguaje dinamico 1 Un lenguaje muy dulce 2 ‘De serie’ ´ 3 Orientacion a objetos ´ 4 Un lenguaje dinamico
    108. ´ Un lenguaje dinamico “Un hombre no puede ˜ banarse dos veces en el mismo r´o; ni el r´o ni el ı ı hombre son los mismos, puesto que todo fluye.” ´ HER A CLITO
    109. ´ Un lenguaje dinamico En Ruby: • No hay diferencia entre ‘tiempo de compilacion’ y ‘tiempo ´ ´ de ejecucion’
    110. ´ Un lenguaje dinamico En Ruby: • No hay diferencia entre ‘tiempo de compilacion’ y ‘tiempo ´ ´ de ejecucion’ • Se pueden crear y modificar clases, redefinir o anadir ˜ ´ metodos, en cualquier momento
    111. ´ Un lenguaje dinamico En Ruby: • No hay diferencia entre ‘tiempo de compilacion’ y ‘tiempo ´ ´ de ejecucion’ • Se pueden crear y modificar clases, redefinir o anadir ˜ ´ metodos, en cualquier momento • Hasta los tipos basicos, como Class u Object ´
    112. ´ Un lenguaje dinamico ´ ¿Como creen si no que Rails... • ...anade metodos a clases ActiveRecord tras leer la base ˜ ´ de datos? (como name o incluso find by name())
    113. ´ Un lenguaje dinamico ´ ¿Como creen si no que Rails... • ...anade metodos a clases ActiveRecord tras leer la base ˜ ´ de datos? (como name o incluso find by name()) • ...anade unos metodos tras ejecutar otros? ˜ ´ ˜ ´ (has many :posts anade el metodo posts, etc...)
    114. ´ Un lenguaje dinamico ´ ¿Como creen si no que Rails... • ...anade metodos a clases ActiveRecord tras leer la base ˜ ´ de datos? (como name o incluso find by name()) • ...anade unos metodos tras ejecutar otros? ˜ ´ ˜ ´ (has many :posts anade el metodo posts, etc...) • ...modifica nuestros metodos para que ejecuten los filtros? ´ (before filter y after filter)
    115. ´ Un lenguaje dinamico ´ Nosotros tambien podemos redefinir
    116. ´ Un lenguaje dinamico ´ Nosotros tambien podemos redefinir class Fixnum def +(other) self - other end end
    117. ´ Un lenguaje dinamico ´ Nosotros tambien podemos redefinir class Fixnum def +(other) self - other end end >> 5 + 4
    118. ´ Un lenguaje dinamico ´ Nosotros tambien podemos redefinir class Fixnum def +(other) self - other end end >> 5 + 4 => 1
    119. ´ Un lenguaje dinamico ´ Un ejemplo mas cabal
    120. ´ Un lenguaje dinamico ´ Un ejemplo mas cabal class Post < ActiveRecord::Base end
    121. ´ Un lenguaje dinamico ´ Un ejemplo mas cabal class Post < ActiveRecord::Base def title=(title) write attribute(’title’, title) end end
    122. ´ Un lenguaje dinamico ´ Un ejemplo mas cabal class Post < ActiveRecord::Base def title=(title) write attribute(’title’, title) if self.new? write attribute(’sanitized title’, title.sanitize) end end end
    123. Preguntas ¿ ... ?
    124. Moraleja: Aprendan Ruby Merece la pena ¡Y gracias por venir!
    125. Salamanca 17 Madrid – 28020 España tel. +34 91 567 0605 www.the­cocktail.com 2
    126. Referencias • “Programming Ruby”, Dave Thomas • “The Pragmatic Programmer”, Adrew Hunt & Dave Thomas • http://www.ruby-lang.org/ • http://www.rubyonrails.org/ • http://www.cs.byu.edu/colloquia/2006Fall/presentations/Matz slides/ • http://es.wikipedia.org/wiki/Plat%C3%B3n • http://es.wikipedia.org/wiki/Her%C3%A1clito Fotograf´as: ı • http://flickr.com/photos/rtv/290062998/in/pool-sweetcandy/ • http://microwave.gotovim.ru/ • http://www.xtec.es/lvallmaj/passeig/plato2.htm • http://www.flickr.com/photos/mtnpix/294515665/

    + Sergio GilSergio Gil, 3 years ago

    custom

    2168 views, 4 favs, 0 embeds more stats

    Material de la presentación realizada en la Confer more

    More info about this document

    CC Attribution-ShareAlike LicenseCC Attribution-ShareAlike License

    Go to text version

    • Total Views 2168
      • 2168 on SlideShare
      • 0 from embeds
    • Comments 0
    • Favorites 4
    • Downloads 0
    Most viewed embeds

    more

    All embeds

    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