SlideShare una empresa de Scribd logo
1 de 33
Ruby On Rails 
Desarrollo de aplicaciones 
web sin dolor 
por Nelson Rojas Núñez
¿Quién expone? 
Nelson Rojas Núñez 
Ing. Ejec. Computación UCM Talca 
Desarrollador de día y Docente 
Universitario algunas noches
¿Qué es Rails? 
Es un framework de código 
abierto escrito en Ruby 
que sirve para desarrollar 
aplicaciones web que 
acceden a base de datos
¿Qué tiene de especial? 
Puedes desarrollar una aplicación 
web 10 veces más rápido que lo 
que tardarías con un típico 
framework java y sin sacrificar la 
calidad de la aplicación
Algunos escépticos 
estarán pensando 
“Si claro, 10 veces más 
rápido”... ¿cómo no?
¿Cómo es posible? 
•Ruby tiene un gran poder y 
además es sencillo 
•Dos principios en Rails 
oMenos Software (DRY) 
oConvenciones sobre 
configuraciones (COC)
DRY 
Don't Repeat Yourself 
No te repitas!
Menos Software 
Menos líneas de código 
Más rápido de implementar 
Menos errores 
Mejor Mantención 
** código a dieta **
Convenciones sobre 
configuraciones 
Adiós a los prolijos 
archivos de configuración 
en XML 
Convenciones simples
Separación de código 
M V C 
Modelo 
para los datos 
Vista 
para la Interfaz 
Controlador 
dirige la 
orquesta
Modelo 
• Para acceder a los datos 
• Módulo: ActiveRecord 
• Una clase representa una tabla 
• Se descubren automáticamente los campos 
• Se pueden declarar relaciones con otros 
modelos/tablas 
• Se puede personalizar y añadir métodos 
• CRUD: CREATE READ UPDATE DELETE
Ejemplo de Modelo 
class Aviso < ActiveRecord::Base 
belongs_to :categoria 
def activo? 
self.vencimiento > Time.now 
end 
end
Vista 
• Para decidir el aspecto 
• Módulo: ActionView 
• Plantillas en formato Embedded Ruby 
• HTML con Ruby embebido 
• Una por cada acción de cada controlador 
• Corolario: dependen de los controladores 
• HTML repetitivo, a funciones externas o helpers
Ejemplo de Vista 
<h1>Lista de avisos</h1> 
<% for aviso in @avisos %> 
<p><%= aviso.titulo %></p> 
<% end %>
Controlador 
• Director de orquesta: recibe las peticiones desde el 
exterior (browser/vistas), conecta con los modelos 
y retorna el resultado como vista. 
• Módulo: ActionPack 
• Cada controlador una clase Ruby 
• Cada método, una acción
Ejemplo de Controlador 
class AvisosController < ApplicationController 
def index 
@avisos = Aviso.all 
end 
end
Arquitectura Rails
Herramientas 
• En ./script/ 
ogenerate (genera codigo) 
o plugin (incluir codigo de 3ros) 
oserver (servidor simple) 
oconsole (consola interactiva) 
odbconsole (consola base datos) 
o runner (ejecuta trozos de Ruby)
Rakefile 
• Similar a make, pero en Ruby 
• Incluye 
o stats (estadisticas) 
o doc (generar documentacion) 
o test (realizar pruebas) 
omigrate (migraciones de BD)
Componentes base 
ActiveRecord 
ActionPack
ActiveRecord 
Database agnostic 
Capa ORM de Rails 
Tablas como clases 
Registros como objetos 
Columnas como objetos 
Crecimiento incremental
Ejemplo ActiveRecord 
creando la tabla 
*con sql normal 
create table avisos ( 
id bigint not null primary key auto_increment, 
contenido text, 
categoria_id int, 
created_at timestamp, 
updated_at timestamp); 
*con el generador de ruby 
script/generate model aviso contenido:text categoria_id:integer 
rake db:migrate 
class Aviso < ActiveRecord::Base 
end
Ejemplo ActiveRecord 
Todos los registros de la tabla avisos 
*con sql normal 
select * from avisos; 
*con ActiveRecord 
@avisos = Aviso.find(:all) , o su abreviatura 
@avisos = Aviso.all 
Todos los registros de la categoria 10 
*con sql normal 
select * from avisos where categoria_id = 10; 
*con ActiveRecord 
@avisos = Aviso.find_all_by_categoria_id(10) 
** metodos mágicos sin siquiera definirlos
Asociaciones en 
ActiveRecord 
class Aviso < ActiveRecord::Base 
belongs_to :categoria 
#proviene de categoria 
end 
class Categoria < ActiveRecord::Base 
has_many :avisos 
#tiene muchos avisos 
end 
categUosruiaasrio 
id 
avisos 
id 
categoria_id
ActionPack 
Compuesto por ActionController y 
ActionView 
Juntos permiten procesar los 
requerimientos entrantes y 
generar las respuestas de salida
ActionController 
Recibe las peticiones desde el 
navegador generalmente de este 
modo 
http://sitio/controller/action/id 
p.e. http://profenelson.cl/posts/show/1 
Controlador posts, accion show, id = 1
ActionController 
Se puede modificar las rutas para que tengan 
mejor aspecto y otro tipo de utilidad 
Por ejemplo 
http://sitio/noticias/2009/11/26 
http://sitio/login 
map.login 'login', :controller => 'sessions', :action => 'new' 
En vez de usar 
http://sitio/sessions/new
Muy bien Houdini 
muéstrame 
lo que 
tienes!
Lo que dice gente 
inteligente acerca de Rails 
"Rails es el framework de desarrollo web mejor 
pensado que he usado, y puedo decirlo luego de 
una década de hacer aplicaciones web para vivir. 
He construido mis propios frameworks, he 
ayudado a desarrollar el API Servlet, y he creado 
varios servidores web a partir de cero. Nadie lo ha 
hecho así antes." 
James Duncan Davidson, creador de Tomcat y Ant
Lo que dice gente 
inteligente acerca de Rails 
"Después de investigar el mercado, Ruby on Rails 
se destacó como la mejor opción. Hemos sido muy 
felices con esa decisión. Vamos a seguir 
construyendo en Rails y consideramos que es una 
ventaja clave de negocio. " 
Evan Williams, creador de Blogger, Odeo, y Twitter
Lo que dice gente 
inteligente acerca de Rails 
"Rails es la aplicación de Ruby." 
Yukihiro Matsumoto, creador de Ruby
Muchas gracias

Más contenido relacionado

La actualidad más candente

La actualidad más candente (20)

Grails
GrailsGrails
Grails
 
Grails barcamp 2013
Grails barcamp 2013Grails barcamp 2013
Grails barcamp 2013
 
Taller Grails
Taller GrailsTaller Grails
Taller Grails
 
Descifrando Ruby on Rails
Descifrando Ruby on RailsDescifrando Ruby on Rails
Descifrando Ruby on Rails
 
Nodejs
NodejsNodejs
Nodejs
 
Introducción al ecosistema de React.js
Introducción al ecosistema de React.jsIntroducción al ecosistema de React.js
Introducción al ecosistema de React.js
 
7 Gemas de Ruby on Rails que podrían salvarte el dia
7 Gemas de Ruby on Rails que podrían salvarte el dia7 Gemas de Ruby on Rails que podrían salvarte el dia
7 Gemas de Ruby on Rails que podrían salvarte el dia
 
Ruby on rails
Ruby on railsRuby on rails
Ruby on rails
 
Node JS (Francisco Cerdas)
Node JS (Francisco Cerdas)Node JS (Francisco Cerdas)
Node JS (Francisco Cerdas)
 
Conociendo ReactJs . Scio Talks
Conociendo ReactJs . Scio TalksConociendo ReactJs . Scio Talks
Conociendo ReactJs . Scio Talks
 
Dragome en JavaConf Buenos Aires 2014
Dragome en JavaConf Buenos Aires 2014 Dragome en JavaConf Buenos Aires 2014
Dragome en JavaConf Buenos Aires 2014
 
Lenguaje JavaScript parte 1
Lenguaje JavaScript parte 1Lenguaje JavaScript parte 1
Lenguaje JavaScript parte 1
 
React – ¿Qué es React.js?
React – ¿Qué es React.js?React – ¿Qué es React.js?
React – ¿Qué es React.js?
 
Jose Rojas Desarrollo Rapido de Aplicaciones con RoR
Jose Rojas Desarrollo Rapido de Aplicaciones con RoRJose Rojas Desarrollo Rapido de Aplicaciones con RoR
Jose Rojas Desarrollo Rapido de Aplicaciones con RoR
 
Primeros pasos Symfony PHPVigo
Primeros pasos Symfony PHPVigoPrimeros pasos Symfony PHPVigo
Primeros pasos Symfony PHPVigo
 
Ruby on rails
Ruby on railsRuby on rails
Ruby on rails
 
Introducción a NodeJS
Introducción a NodeJSIntroducción a NodeJS
Introducción a NodeJS
 
Jsp
JspJsp
Jsp
 
Introducción a NodeJS
Introducción a NodeJSIntroducción a NodeJS
Introducción a NodeJS
 
Introduccion a Node.js
Introduccion a Node.jsIntroduccion a Node.js
Introduccion a Node.js
 

Destacado

Ruby presentacion
Ruby presentacionRuby presentacion
Ruby presentacion
hellmanss
 
Tarjetas Madres
Tarjetas MadresTarjetas Madres
Tarjetas Madres
aniwiz
 
Lineamientos montaje cursos bb
Lineamientos montaje cursos bbLineamientos montaje cursos bb
Lineamientos montaje cursos bb
damialex
 
El Verdadero Shrekxxxxxxxxxxxxxxxx
El Verdadero ShrekxxxxxxxxxxxxxxxxEl Verdadero Shrekxxxxxxxxxxxxxxxx
El Verdadero Shrekxxxxxxxxxxxxxxxx
djhorigomez
 
Evolución de los seres vivos
Evolución de los seres vivosEvolución de los seres vivos
Evolución de los seres vivos
profemaribel
 
Un Colectivo de Humanos y No Humanos
Un Colectivo de Humanos y No HumanosUn Colectivo de Humanos y No Humanos
Un Colectivo de Humanos y No Humanos
cgelin
 

Destacado (20)

Ruby presentacion
Ruby presentacionRuby presentacion
Ruby presentacion
 
Tarjetas Madres
Tarjetas MadresTarjetas Madres
Tarjetas Madres
 
Lineamientos montaje cursos bb
Lineamientos montaje cursos bbLineamientos montaje cursos bb
Lineamientos montaje cursos bb
 
Competencias para la vida
Competencias para la vidaCompetencias para la vida
Competencias para la vida
 
Smm up módulo 3
Smm   up módulo 3Smm   up módulo 3
Smm up módulo 3
 
Para abordar la guía
Para abordar la guíaPara abordar la guía
Para abordar la guía
 
PresentacióN1
PresentacióN1PresentacióN1
PresentacióN1
 
Crear mi slideshare de powerpoint
Crear mi slideshare de powerpointCrear mi slideshare de powerpoint
Crear mi slideshare de powerpoint
 
PropóSitos
PropóSitosPropóSitos
PropóSitos
 
Encarte Diplomado Liderazgo para la Trasnformacion 2014 Regiones
Encarte Diplomado Liderazgo para la Trasnformacion 2014 RegionesEncarte Diplomado Liderazgo para la Trasnformacion 2014 Regiones
Encarte Diplomado Liderazgo para la Trasnformacion 2014 Regiones
 
El Verdadero Shrekxxxxxxxxxxxxxxxx
El Verdadero ShrekxxxxxxxxxxxxxxxxEl Verdadero Shrekxxxxxxxxxxxxxxxx
El Verdadero Shrekxxxxxxxxxxxxxxxx
 
Deterioro
DeterioroDeterioro
Deterioro
 
Evolución de los seres vivos
Evolución de los seres vivosEvolución de los seres vivos
Evolución de los seres vivos
 
Día solar europeo, natalia
Día solar europeo, nataliaDía solar europeo, natalia
Día solar europeo, natalia
 
Un Colectivo de Humanos y No Humanos
Un Colectivo de Humanos y No HumanosUn Colectivo de Humanos y No Humanos
Un Colectivo de Humanos y No Humanos
 
Adivinanzas
AdivinanzasAdivinanzas
Adivinanzas
 
Presentación Fitnesse
Presentación Fitnesse Presentación Fitnesse
Presentación Fitnesse
 
Cena Chiste Buensimo
Cena Chiste BuensimoCena Chiste Buensimo
Cena Chiste Buensimo
 
SocialMedia
SocialMediaSocialMedia
SocialMedia
 
Trece Lienas GABO
Trece Lienas GABOTrece Lienas GABO
Trece Lienas GABO
 

Similar a Presentacion Ruby on Rails en Universidad Autónoma 2009

Joserojas Web 2.0
Joserojas Web 2.0Joserojas Web 2.0
Joserojas Web 2.0
Jose Rojas
 
Kumbia PHP Framework - Inicios, Presente y Futuro
Kumbia PHP Framework - Inicios, Presente y FuturoKumbia PHP Framework - Inicios, Presente y Futuro
Kumbia PHP Framework - Inicios, Presente y Futuro
Deivinson Tejeda
 

Similar a Presentacion Ruby on Rails en Universidad Autónoma 2009 (20)

Desarrollo de Apps Web en Ruby on Rails
Desarrollo de Apps Web en Ruby on RailsDesarrollo de Apps Web en Ruby on Rails
Desarrollo de Apps Web en Ruby on Rails
 
Presentación rails 3 Santo Tomás Concepción
Presentación rails 3 Santo Tomás ConcepciónPresentación rails 3 Santo Tomás Concepción
Presentación rails 3 Santo Tomás Concepción
 
API REST conceptos (Rails-api)
API REST conceptos (Rails-api)API REST conceptos (Rails-api)
API REST conceptos (Rails-api)
 
Presentación Ruby on Rails en Softare Freedom Day 09 Buenos Aires
Presentación Ruby on Rails en Softare Freedom Day 09 Buenos AiresPresentación Ruby on Rails en Softare Freedom Day 09 Buenos Aires
Presentación Ruby on Rails en Softare Freedom Day 09 Buenos Aires
 
Joserojas Web 2.0
Joserojas Web 2.0Joserojas Web 2.0
Joserojas Web 2.0
 
ASP.NET MVC
ASP.NET MVCASP.NET MVC
ASP.NET MVC
 
Documento Web2Py
Documento Web2PyDocumento Web2Py
Documento Web2Py
 
5-Unidad 2: Diseño de Vista-2.2 Para Web
5-Unidad 2: Diseño de Vista-2.2 Para Web5-Unidad 2: Diseño de Vista-2.2 Para Web
5-Unidad 2: Diseño de Vista-2.2 Para Web
 
Ruby on Rails
Ruby on RailsRuby on Rails
Ruby on Rails
 
Ruby on rails
Ruby on railsRuby on rails
Ruby on rails
 
Ruby on Rails
Ruby on RailsRuby on Rails
Ruby on Rails
 
Descubriendo Ruby on Rails (Desarrollo Agil de Aplicaciones Web)
Descubriendo Ruby on Rails (Desarrollo Agil de Aplicaciones Web)Descubriendo Ruby on Rails (Desarrollo Agil de Aplicaciones Web)
Descubriendo Ruby on Rails (Desarrollo Agil de Aplicaciones Web)
 
Descubriendo Ruby On Rails (Desarrollo Agil De Aplicaciones Web)
Descubriendo Ruby On Rails (Desarrollo Agil De Aplicaciones Web)Descubriendo Ruby On Rails (Desarrollo Agil De Aplicaciones Web)
Descubriendo Ruby On Rails (Desarrollo Agil De Aplicaciones Web)
 
Charla
CharlaCharla
Charla
 
CrossDvlpu - REACT para desarrolladores de ASP.NET
CrossDvlpu - REACT para desarrolladores de ASP.NETCrossDvlpu - REACT para desarrolladores de ASP.NET
CrossDvlpu - REACT para desarrolladores de ASP.NET
 
Cross development - React para desarrolladores de asp.net
Cross development - React para desarrolladores de asp.netCross development - React para desarrolladores de asp.net
Cross development - React para desarrolladores de asp.net
 
Web framework ligeros y micros en java barcamp 2014
Web framework ligeros y micros en java   barcamp 2014Web framework ligeros y micros en java   barcamp 2014
Web framework ligeros y micros en java barcamp 2014
 
Ruby on the Rails
Ruby on the RailsRuby on the Rails
Ruby on the Rails
 
5.- PPT 2022 05 U01 T01 Desarrollo de Servicios Web I (1915).pptx
5.- PPT 2022 05 U01 T01 Desarrollo de Servicios Web I (1915).pptx5.- PPT 2022 05 U01 T01 Desarrollo de Servicios Web I (1915).pptx
5.- PPT 2022 05 U01 T01 Desarrollo de Servicios Web I (1915).pptx
 
Kumbia PHP Framework - Inicios, Presente y Futuro
Kumbia PHP Framework - Inicios, Presente y FuturoKumbia PHP Framework - Inicios, Presente y Futuro
Kumbia PHP Framework - Inicios, Presente y Futuro
 

Último

PRESENTACION EN SST, plan de trabajo del sistema de seguridad y salud en el t...
PRESENTACION EN SST, plan de trabajo del sistema de seguridad y salud en el t...PRESENTACION EN SST, plan de trabajo del sistema de seguridad y salud en el t...
PRESENTACION EN SST, plan de trabajo del sistema de seguridad y salud en el t...
angierangel29072017
 

Último (7)

PRESENTACION EN SST, plan de trabajo del sistema de seguridad y salud en el t...
PRESENTACION EN SST, plan de trabajo del sistema de seguridad y salud en el t...PRESENTACION EN SST, plan de trabajo del sistema de seguridad y salud en el t...
PRESENTACION EN SST, plan de trabajo del sistema de seguridad y salud en el t...
 
Willer Gehizon Sanchez Mora
Willer Gehizon Sanchez MoraWiller Gehizon Sanchez Mora
Willer Gehizon Sanchez Mora
 
Suiwen He - eCommerce Day Chile 2024
Suiwen He  -  eCommerce  Day  Chile 2024Suiwen He  -  eCommerce  Day  Chile 2024
Suiwen He - eCommerce Day Chile 2024
 
Alexander Rubilar, Enzo Tapia - eCommerce Day Chile 2024
Alexander Rubilar, Enzo Tapia - eCommerce Day Chile 2024Alexander Rubilar, Enzo Tapia - eCommerce Day Chile 2024
Alexander Rubilar, Enzo Tapia - eCommerce Day Chile 2024
 
Modelos comunicacionales. Antonella Castrataro.pdf
Modelos comunicacionales. Antonella Castrataro.pdfModelos comunicacionales. Antonella Castrataro.pdf
Modelos comunicacionales. Antonella Castrataro.pdf
 
Felipe González - eCommerce Day Chile 2024
Felipe González - eCommerce Day Chile 2024Felipe González - eCommerce Day Chile 2024
Felipe González - eCommerce Day Chile 2024
 
Expo Construir 2024 agenda-workshops (2).pdf
Expo Construir 2024 agenda-workshops (2).pdfExpo Construir 2024 agenda-workshops (2).pdf
Expo Construir 2024 agenda-workshops (2).pdf
 

Presentacion Ruby on Rails en Universidad Autónoma 2009

  • 1. Ruby On Rails Desarrollo de aplicaciones web sin dolor por Nelson Rojas Núñez
  • 2. ¿Quién expone? Nelson Rojas Núñez Ing. Ejec. Computación UCM Talca Desarrollador de día y Docente Universitario algunas noches
  • 3. ¿Qué es Rails? Es un framework de código abierto escrito en Ruby que sirve para desarrollar aplicaciones web que acceden a base de datos
  • 4. ¿Qué tiene de especial? Puedes desarrollar una aplicación web 10 veces más rápido que lo que tardarías con un típico framework java y sin sacrificar la calidad de la aplicación
  • 5. Algunos escépticos estarán pensando “Si claro, 10 veces más rápido”... ¿cómo no?
  • 6. ¿Cómo es posible? •Ruby tiene un gran poder y además es sencillo •Dos principios en Rails oMenos Software (DRY) oConvenciones sobre configuraciones (COC)
  • 7. DRY Don't Repeat Yourself No te repitas!
  • 8. Menos Software Menos líneas de código Más rápido de implementar Menos errores Mejor Mantención ** código a dieta **
  • 9. Convenciones sobre configuraciones Adiós a los prolijos archivos de configuración en XML Convenciones simples
  • 10.
  • 11. Separación de código M V C Modelo para los datos Vista para la Interfaz Controlador dirige la orquesta
  • 12. Modelo • Para acceder a los datos • Módulo: ActiveRecord • Una clase representa una tabla • Se descubren automáticamente los campos • Se pueden declarar relaciones con otros modelos/tablas • Se puede personalizar y añadir métodos • CRUD: CREATE READ UPDATE DELETE
  • 13. Ejemplo de Modelo class Aviso < ActiveRecord::Base belongs_to :categoria def activo? self.vencimiento > Time.now end end
  • 14. Vista • Para decidir el aspecto • Módulo: ActionView • Plantillas en formato Embedded Ruby • HTML con Ruby embebido • Una por cada acción de cada controlador • Corolario: dependen de los controladores • HTML repetitivo, a funciones externas o helpers
  • 15. Ejemplo de Vista <h1>Lista de avisos</h1> <% for aviso in @avisos %> <p><%= aviso.titulo %></p> <% end %>
  • 16. Controlador • Director de orquesta: recibe las peticiones desde el exterior (browser/vistas), conecta con los modelos y retorna el resultado como vista. • Módulo: ActionPack • Cada controlador una clase Ruby • Cada método, una acción
  • 17. Ejemplo de Controlador class AvisosController < ApplicationController def index @avisos = Aviso.all end end
  • 19. Herramientas • En ./script/ ogenerate (genera codigo) o plugin (incluir codigo de 3ros) oserver (servidor simple) oconsole (consola interactiva) odbconsole (consola base datos) o runner (ejecuta trozos de Ruby)
  • 20. Rakefile • Similar a make, pero en Ruby • Incluye o stats (estadisticas) o doc (generar documentacion) o test (realizar pruebas) omigrate (migraciones de BD)
  • 22. ActiveRecord Database agnostic Capa ORM de Rails Tablas como clases Registros como objetos Columnas como objetos Crecimiento incremental
  • 23. Ejemplo ActiveRecord creando la tabla *con sql normal create table avisos ( id bigint not null primary key auto_increment, contenido text, categoria_id int, created_at timestamp, updated_at timestamp); *con el generador de ruby script/generate model aviso contenido:text categoria_id:integer rake db:migrate class Aviso < ActiveRecord::Base end
  • 24. Ejemplo ActiveRecord Todos los registros de la tabla avisos *con sql normal select * from avisos; *con ActiveRecord @avisos = Aviso.find(:all) , o su abreviatura @avisos = Aviso.all Todos los registros de la categoria 10 *con sql normal select * from avisos where categoria_id = 10; *con ActiveRecord @avisos = Aviso.find_all_by_categoria_id(10) ** metodos mágicos sin siquiera definirlos
  • 25. Asociaciones en ActiveRecord class Aviso < ActiveRecord::Base belongs_to :categoria #proviene de categoria end class Categoria < ActiveRecord::Base has_many :avisos #tiene muchos avisos end categUosruiaasrio id avisos id categoria_id
  • 26. ActionPack Compuesto por ActionController y ActionView Juntos permiten procesar los requerimientos entrantes y generar las respuestas de salida
  • 27. ActionController Recibe las peticiones desde el navegador generalmente de este modo http://sitio/controller/action/id p.e. http://profenelson.cl/posts/show/1 Controlador posts, accion show, id = 1
  • 28. ActionController Se puede modificar las rutas para que tengan mejor aspecto y otro tipo de utilidad Por ejemplo http://sitio/noticias/2009/11/26 http://sitio/login map.login 'login', :controller => 'sessions', :action => 'new' En vez de usar http://sitio/sessions/new
  • 29. Muy bien Houdini muéstrame lo que tienes!
  • 30. Lo que dice gente inteligente acerca de Rails "Rails es el framework de desarrollo web mejor pensado que he usado, y puedo decirlo luego de una década de hacer aplicaciones web para vivir. He construido mis propios frameworks, he ayudado a desarrollar el API Servlet, y he creado varios servidores web a partir de cero. Nadie lo ha hecho así antes." James Duncan Davidson, creador de Tomcat y Ant
  • 31. Lo que dice gente inteligente acerca de Rails "Después de investigar el mercado, Ruby on Rails se destacó como la mejor opción. Hemos sido muy felices con esa decisión. Vamos a seguir construyendo en Rails y consideramos que es una ventaja clave de negocio. " Evan Williams, creador de Blogger, Odeo, y Twitter
  • 32. Lo que dice gente inteligente acerca de Rails "Rails es la aplicación de Ruby." Yukihiro Matsumoto, creador de Ruby