Desarrollo de aplicaciones web (módulo 1 y 2)

Pataasin ang iyong marka sa homework at exams ngayon gamit ang Quizwiz!

cómo funciona el modelo-vista-controlador?

Hay un modelo: es la representación específica del dominio de los datos a través de los cuales opera la aplicación, junto con algo de conocimiento específico del dominio que pueda añadir significado a estos datos Por ejemplo, podría ser la información relacionada con las compras que un usuario ha hecho junto con la propia información de la cuenta del usuario. A menudo hay una base de datos donde se almacena esta información. Vista: se utiliza para representar la información asociada a un modelo a través de algún tipo de interfaz de usuario. A veces se crean múltiples vistas para un solo modelo, cada uno sirviendo un propósito diferente, por ejemplo podemos tener una vista para mostrar todas las compras anteriores que un usuario haya hecho, y una vista diferente para que el usuario pueda editar su información personal y de de su cuenta. Antes estos dos bloques estaban directamente vinculados y, estaban más o menos mezclados. Esto llevó a una gran cantidad de problemas y confusión porque era muy difícil cambiar el modelo y el código de la vista. Controlador: es responsable de la mediación entre el modelo y la vista. Si el modelo se comunica con una vista, el controlador sería el responsable de la actualización del modelo, y del mismo modo si se cambia el modelo el controlador es responsable de la actualización de la vista.

antecedentes históricos de las aplicaciones web

1945-70 era militar (criptografía, Alan Turing, tablas de artillería, arquitectura distribuída para sobrevivir las guerras, por ello el internet fue tan exitoso) 1970-80 era de los negocios (sólo compañías podían permitirse comprar ordenadores, finanzas) 1980-90 era del PC (hojas de cálculo, procesamiento de textos, TCP/IP) 1990-2000 Web 1.0 (Amazon, páginas estáticas) 2000-2010 Web 2.0 (experiencia de usuario más ricas, Ajax, servicios web, colaboración Wikipedia) 2010 - Web 3.0, HTML5, diseño responsivo, el internet de las cosas, web inteligente (Netflix)

operadores de comparación

== igual que != desigual que < menor a <= menor o igual a > >= <=> esta devuelve -1 si lo que esta a la izquiera es menor de lo que está a la derecha, devuelve igual si son iguales o devuelve +1 si lo que está a la izquierda es mayor que lo que está a la derecha =~ chequea expresiones regulares != esta también se usa con expresiones regulares para ver si la cadena NO coincide con la expresión regular

El patrón de diseño Modelo: Vista-Controlador

Las primeras aplicaciones web no tenían mucha organización en el lado del servidor, eran principalmente páginas web estáticas, y no había separación entre los datos en la página de su presentación en el cliente. cuando las aplicaciones se hicieron más complejas, una vez más las secuencias de comandos del lado del servidor se hicieron muy complicadas y difíciles de mantener El diseño modelo vista controlador proporciona un medio para hacer frente a esta complejidad. Lo que hace es desacoplar los datos del modelo de la presentación de la vista, y hay un controlador que gestiona solicitudes y coordina entre estos dos bloques. Antes de utilizar el patrón de diseño modelo vista controlador en aplicaciones web, los diseños de interfaz de usuario tendían acumular el modelo, la vista y el controlador todos juntos. Lo que el MVC hace es que los desacopla. Estos patrones de diseño MVC fueron utilizados anteriormente como parte de las interfaces de usuario basados en Windows y otros, por ejemplo, las interfaces gráficas de usuario en Mac, Windows o Linux.

editores de código fuente un repositorio de código y un navegador de bases de datos

Atom Sublime Brackets Gedit (Linux) Notepad++(Linux) IDEs Aptana Studio RubyMine (paid) Git (sistema de control de versiones distribuído) distribuído: quiere decir que cada directorio de trabajo de Git es un repositorio de código con capacidad para seguimiento del historial y de versiones que se pueden recuperar independientemente del acceso a la red o servidor central. Típicamente, estos repositorios de código requieren de un servidor central. De modo que si alguien está trabajando en un código, otras personas tienen bloqueado el acceso a este código, hasta que quien están trabajando con él lo libera. Estos sistemas de control de versiones distribuido son diferentes. Ellos replican esas copias para todas las personas que están usando el código. Y si alguien cambia este código, o usted lo cambia también, se tienen que poner de acuerdo para mezclarlo. Navegador SQLite: https://sqlitebrowser.org

¿Qué es esto de local host?

El local host significa que es su anfitrión local, su ordenador. el localhost generalmente tiene especificada la dirección 127.0.0.1 y todo el tráfico hasta esa dirección se enruta a través de una interfaz de circuito cerrado hacia su máquina. Es decir, si su navegador Web está escuchando las conexiones en esta dirección, y vemos que esto se hace a través del puerto 3000, esto significa que solo aceptará conexiones a su propio computador. Lo interesante de esto es que usted puede ejecutar aplicaciones Web desde el lado del servidor y desde el lado del cliente en un solo ordenador, y eso está muy bien.

Git básico

Git sigue o supervisa archivos, que pueden residir en 3 ubicaciones - directorio de trabajo - áreas de ensayo - repositorio Git los archivos puede estar - seguidos o rastreados (archivos guardados en el repositorio por la última confirmación) - no seguidos: el resto de los archivos en el directorio de trabajo que no se han guardado los archivos puede ser: modificados no modificados bajo ensayo directorio de trabajo git add . area de preparacion git commit repositorio git local (dos cosas al mismo tiempo commit -a) git checkout <rama de la que se quiere salir> merge <rama> comando merge que le permite combinar el directorio de trabajo actual con una rama que se almacena en el repositorio de Git local git commit -m "Initial commit" también podría hacer todo esto en un solo comando git commit -a -m "Initial commit" si prefiere no usar la línea de comandos para esto, puede descargar un cliente que muestre una representación gráfica de las ramas de https://git-scm.com/downloads/guis

entorno de desarrollo

Marco Ruby on Rails vamos a utilizar Rails como una herramienta para explorar las arquitecturas de aplicaciones web (tecnologías y protocolos) lenguage de programación Ruby (los paquetes o bibliotecas se llaman gemas), por lo que el marco Rails es solo una gema del lenguaje Ruby editor de texto que resalte sintáxis navegador moderno con las herramientas de desarrollo integradas navegador de base de datos SQL (SQlite) Git (sistema de gestión de versiones) opciones: instalar tu propio entorno de desarrollo usar una máquina virtual (que viene con Ruby on Rails preinstalado en él) usar un entorno de desarrollo anfitrión (aplicación web para desarrollar aplicaciones web) instalación de forma nativa: railsapps.github.io/installing-rails.html instalación de máquina virtual: https://bitnami.com/stack/ruby antes hay que instalar virtualbox.org que te permite correr una máquina virtual sistema de desarrollo anfitrión (o alojado): c9.io Cloud9 IDE o Nitrous.io este enfoque es bastante difícil de mantener y actualizar

temas del curso

Mod 1 - aplicaciones web en contexto Mod 2 - marcos para aplicaciones web (Ruby on Rails + Git) Mod 3 - diseño de base de datos (datos almacenados en el servidor y páginas generadas en la IU) Mod 4 - Middleware (HTTP), modelo vista/controlador Mod 5 - presentación e IU (CSS) en los próximos cursos de la especialización: - cómo proteger las páginas web - otros tipos de almacenamiento de datos (computación en red) - desplegar entornos de producción - páginas web con diseños adaptativos

otros marcos de aplicaciones web populares

Para entender cómo se pueden utilizar estos marcos, eche un vistazo a la licencia. Las licencias generalmente describen cómo tiene que añadir notas de atribución con cualquier software que desarrolle se base en uno de estos marcos. Cada uno de estos marcos utiliza el patrón de diseño "modelo vista controlador" Ruby on Rails es el que vamos a usar, el marco Rails se basa en Ruby la mayoría de los otros marcos de los que voy a hablar ahora se inspiraron en Rails Play: Java y Scala ASP.NET MVC (Microsoft) Django (Python) Sinatra (Ruby) Symfony (PHP) Sails.js (Node.js y JavaScript) WordPress, Drupal y Joomla, estos sistemas de gestión de contenidos en realidad no son entornos de aplicaciones web. En este caso usted no está realmente creando la arquitectura de la aplicación web en sí, son aplicaciones web, no es un marco de aplicación web. Si usted necesita simplemente generar páginas sencillas, son buenos para ello, pero no se pueden utilizar para construir toda la infraestructura detrás de una aplicación web sofisticada.

mirando la carpeta hello_WWW en el explorador de windows estructura de directorios de Rails

RAILS.root (hello_WWW) - app (modelos, vistas y controladores, vamos a pasar mucho tiempo modificando los archivos dentro de este directorio) - bin (scripts de ayuda, bundle, rails, rake) - config (cómo se configura su aplicación así como la base de datos y las rutas. Las rutas indican cómo se accede a cada una de las partes de la aplicación a través de un navegador) - db (donde el esquema de base de datos y migraciones que queremos se almacenan) - Gemfile (un fichero que especifica las gemas que necesita para su aplicación) - lib -log (directorio de los registros de la aplicación, si va a este directorio y lo abre podrá ver) -public (raíz de su aplicación, si usted va a ese directorio verá un montón de ficheros html que se generan cuando se dan varios tipos de errores que pueden ocurrir) - test (los tests se generan automáticamente dependiendo del tipo de marco de pruebas que esté utilizando, y esto es lo que soporta el desarrollo ágil) -tmp -vendor

Programación Ruby 1 objetos, clases y herencias

Todo en Ruby es un objeto (incluso las clases) hay una clase array llamada object que es el padre de las clases que se crean en Ruby, por lo que sus métodos están disponibles para cualquier objeto que se cree, a menos que se anulen explícitamente estos métodos. Hay un método importante en la clase objeto que se llama class, y que se puede utilizar para encontrar el tipo de cualquier objeto 1.class() Integer Ruby no usa declaraciones de tipo de variables por lo que no va a haber cosas como: int x; float y; (como en JS) a = 2 (creará un Integer) a = "2" a.class String Todas las asignaciones son por referencia (no por valor como en JS) así que una variable contiene una referencia de objeto no una copia del objeto, sin importar el tipo de objeto (como en Java?) Ruby es compatible con la asignación paralela y esto le permite fácilmente intercambiar valores que se almacenan en 2 variable a = 1 b = 2 puts a,b 1 2 a,b = b,a puts a,b 2 1 Ruby utiliza convenciones simples en las variables para indicar su alcance name (variable local) @name (variable de instancia) @@name (variable de clase) $name (variable global) variables locales deben comenzar con letra minúscula y la convención es utilizar guiones bajos entre palabras las constantes comienzan con letra mayúscula y también se utilizan guiones bajos si hay varias palabras las clases en módulos son tratadas como constantes (empiezan con mayúscula), pero la convención es utilizar CamelCase (como en Java y JS), por lo que no hay guiones bajos entre palabras (camel case con primera letra también en mayuscula) Para llamar métodos, Ruby utiliza la notación típica de puntos que se ve en la mayoría de los métodos orientado a objetos object.method los métodos Ruby tienen valores de retorno implícitos, el valor de la última expresión ejecutada en un método es el valor devuelto. casi nunca es necesario utilizar la sentencia return, existe la sentencia return en el lenguaje pero realmente no es necesario utilizarlo (programación compacta) def min (x, y) if x < y then x else y end end Hay una gran cantidad de chatarra o cruft de sintaxis en el lenguaje cruft: defective, superseded, useless, superfluous, or dysfunctional elements in computer software Las clases en Ruby se definen mediante la palabra clave class, seguida del nombre de la clase. Para definir un método utilice la palabra clave def irb(main):021:1* class MyClass irb(main):022:1* @boo = 1 irb(main):023:2* def my_method irb(main):024:2* @foo = 2 irb(main):025:1* end irb(main):026:0> end => :my_method creamos un nuevo objeto de esta clase identificado por referencia con la variable mo irb(main):027:0> mo = MyClass.new => #<MyClass:0x000001dd4d74c170> La siguiente línea le indica que una nueva clase con un identificador particular ha sido creada. se invoca el método my_method en el objeto mo irb(main):028:0> mo.my_method => 2 se imprime el valor de la variable en la instancia foo en el que fue inicializado, que es 2 si intentamos imprimir directamente la variable de instancia boo irb(main):029:0> mo.@boo obtenemos un error, en Ruby no se permite acceder directamente a las variables de instancia, de manera que obtendrá un error si intenta acceder directamente a foo o boo.

métodos para manipular cadenas

creamos una cadena: name = "Homer Blimpson" name.length => 14 indexar la cadena (con el índice 6 que es la séptima posición porque las cadenas empiezan en índice 0) name[6] => "B" consultas de rango en la string (posición 7ma hasta las 15ta) name[6..14] => "Blimpson" concatenación de cadenas "Bart " + name[6..14] => "Bart Blimpson" mutar o modificar la cadena Acá estamos sobreescribiendo la cadena con los 5 primeros caracteres de la cadena original. name = name[0..4] => "Homer"

mecanismos básicos de las redes, cómo funciona internet, capas TCP/IP (patrón de diseño de arquitectura en capas)

dispositivos conectados a un router o conmutador, esto se llama ethernet, cada dispositivo tiene su dirección física o dirección MAC trama: de dónde y hacia dónde va la información el conmutador es el que manda estas tramas el conmudatador se puede llamar nodos, el carácter inalámbrico o alámbrico de la conexión no es relevante, el conmutador funciona igualmente en todos los dispositivos CAPAS TCP/IP modelo de redes 4 capas desde el hardware de red hasta la aplicación web **hardware de red 1) la interfaz de red (protocolo/servicio: ethernet) 2) la red (protocolo IP) 3) transporte (protocolo TCP) 4) aplicación (protocolos DNS y HTTP) **aplicación web

evolución de las aplicaciones web web 2.0 y 3.0

el lado del servidor se vuelve más complicado múltiples programas y servicios, con los que el servidor vuelve a estar interactuando y quizá múltiples bases datos de donde los datos se extraen. en la web 2.0 y la web 3.0, toda la pila tiene mejor soporte estándar en comparación con la web 1.0. la pila web es el conjunto de protocolos y estándares y tecnologías que existen en una arquitectura de aplicaciones web (desde el navegador hasta las partes más profundas del lado de los servidores) el navegador ahora es mucho más capaz y tiene cosas como Java Script, que permiten que se ejecute código en el navegador web de lectura y escritura más de un tercio de la población mundial está conectada

métodos

el últimos carácter del nombre de un método es a menudo usado para indicar su comportamiento si termina en: ? indica que el valor de retorno es booleano ! indica que el método puede cambiar el estado del objeto en este caso también es común proporcionar una versión de no exclamación que indica que se modifica una copia del objeto. self se usa dentro del método de un objeto para referirse al objeto actual

Accesores

hay un método rápido que se utiliza para proporcionar accesores a los atributos de un objeto (para acceso y asignación) class MyClass attr_accessor :boo end :boo produce un símbolo (veremos los símbolos más tarde) con solo attr_accessor se captura toda la clase (es decir, crea la variable de instancia y ambos métodos de acceso y modificación para la variable de instancia boo en este caso) class MyClass attr_accessor :boo end => [:boo, :boo=] class Person attr_accessor :first_name, :last_name end (esto le da ambos accesos acceso y modificación) si solo quiere dar un método de acceso o asignación pero no ambos: attr_reader (sólo acceso) attr_writer (sólo asignación)

aplicación de Blog

la directora ejecutiva de Acne quiere un blog o community page para los usuarios de los productos de la empresa Acme puedan discutir nuevas ideas y características de productos los blogs fueron una de las primeras aplicaciones interactivas que se desarrollaron para la web. Permite a los usuarios no técnicos, en otras palabras, a los no programadores, publicar contenido fácilmente Es una contracción del término weblog o registro web, en referencia a un sitio de debate o información publicado en internet. vamos a ver lo que quiere la directora. Le gustaría tener una forma de que su empresa participe con los clientes y aprender más acerca de lo que les gusta y lo que no en cuanto a sus productos, le gustaría que un administrador pudiera publicar cosas en la página web relacionados con estas nuevas ideas de productos y le gustaría ver los comentarios de los usuarios a continuación de cada post ¿quiere usted que lo más reciente esté en la parte superior o en la inferior? me gustaría que el mensaje más reciente esté en la parte superior podemos generar un primer conjunto de requisitos. Sabemos que hay dos tipos de usuarios, hay un administrador de blog y un usuario de blog. El administrador del blog debe ser capaz de subir nuevas publicaciones y deben aparecer en orden cronológico o inverso. El usuario debe ser capaz de visitar el sitio de blog y subir comentarios sobre publicaciones particulares El administrador del blog debe ser capaz de modificar y eliminar cualquier post o comentario, por ejemplo, si es inapropiado, y un usuario no debe ser capaz de modificar los posts o los comentarios de otros usuarios diseño sencillo: almacenar y ver posts y comentarios que necesitamos vincularlos, es decir, queremos asegurarnos de que cómo un comentario está asociado como máximo a un post modelo de post que va a tener 2 atributos, el primero es el título y luego está el cuerpo. vamos a crear un modelo común, también con 2 atributos. El primero se llama referencias y hace referencia al post en particular al que pertenece el comentario y lo hace mediante el uso del identificador del post Tenemos que garantizar que cada post tenga un identificador único para que esto vaya bien. El segundo atributo se llama body que es el comentario en sí y, por supuesto, necesitamos más de un comentario asociado a un post. Esto se llama asociación de muchos a uno y hablaremos más sobre ello en una lección posterior En la iteración 1 vamos a crear la aplicación del blog, y luego, vamos a demostrar que podemos de hacer, iniciar las operaciones CLAD en los modelos de posts y comentarios que acabamos de mostrar. ¿Qué es una operación CLAD? Significa crear, leer, actualizar y destruir, CRUD, create, read, update and destroy, en inglés cmd rails new blog cd blog y creamos el andamiaje rails generate scaffold Post title:string body:text el andamiaje se llama Post y tiene dos atributos, el primero se llama title y es de tipo string y el segundo se llama body y es de tipo texto (el tipo de texto simplemente le permite almacenar un poco más que una cadena, un poco más de texto) luego creamos el andamiaje para nuestro objeto comentarios que también tendrá dos atributos, post de tipo references y body de tipo text rails generate scaffold Comment post:references body:text luego: rake db:migrate Esto va a ejecutar las 2 migraciones que hemos creado al generar el andamiaje y se creará una base de datos que tiene los posts y los comentarios almacenados rake routes obtendrá una lista de todas las URLs que la aplicación reconoce actualmente (esto no funcionó, ahora se llama rails routes) GET /comments(.:format) rails server http://localhost:3000/ luego http://localhost:3000/posts creamos un nuevo post luego vemos nuestro post y se le ha dado el identificador 1 http://localhost:3000/posts/1 Esto es en realidad un identificador que genera SQLite, que lo hace numéricamente. Hablaremos de esto más adelante Vamos a mirar los comentarios: creamos un nuevo comentario y lo enlazamos con el post 1

Arquitectura n-Tier o de n-niveles (Un importante patrón de diseño)

la funcionalidad en este patrón se divide entre el cliente y el servidor en niveles de: -presentación -procesamiento -gestión de datos Cada nivel está destinado a tratar una ocupación por separado, que se encapsula en una interfaz bien definida (para acceder a un nivel, debe hacerlo a través de la interfaz adecuada) Esto permite que cada nivel se desarrolle y modifique sin afectar a otros niveles. Cada nivel tiene únicamente acceso a sus niveles adyacentes a través de los interfaces que proporciona.

análisis del ciclo de vida de las aplicaciones

la necesidad de comprender la STLC, o Análisis del Ciclo de Vida de Software. No hay que subestimar las necesidad de desarrollo, diseño, todo a través de la implementación.

contenedores (docker) y APIs

la nueva tecnología moda es importante crear las aplicaciones de tal manera que puedan ejecutarse dentro de los contenedores. Y también a la capacidad de organizar la expansión y la contracción de los contenedores.

expresiones en Ruby

la sintaxis de Ruby esta orientada a expresiones por lo cual todo en Ruby se trata como una expresión y se evalúa contra algo esto quiere decir que las estructuras de control para ejecución condicional (IF, while, etc) o los bucles que en otros lenguajes se tratan como órdenes, en Ruby se los considera expresiones y se las trata como tal una estructura for devolvería la última expresión que ha sido evaluada dentro de su estructura if condición código end (se ejecuta si la expresión es true, es decir ni false ni nil, 0 se considera un entero y por lo tanto true) se puede agregar un else if condición código elsif condición código else código end manera más rápida de expresar condicionales código if condición código unless condición (no demasiado relevante usar unless, pero a veces hace al código más legible) manera rápida del ifelse: se procesa la expresión y si es cierta, se ejecuta el primer fragmento de código antes de los dos puntos, de lo contrario, se ejecuta el trozo de código después de los dos puntos expresión ? código : código

cómo ampliar la clase?

las clases nunca se cierran (incluyendo las incorporadas), siempre se pueden añadir métodos a una clase existente por ejemplo probamos llamar al método previous de la clase Integer y nos dirá que no está definido: 1.previous entonces podemos abrir la clase Integer y sumarle un método: class Integer def previous return self-1 end end => :previous 1.previous => 0 el uso de la palabra clave self en la definición del método para previous, se refiere al objeto en el lado izquierdo, al que la función previous se aplica. (la palabra return no es necesaria, aquí la agregamos para hacerlo obvio, pero en Ruby no es necesario)

Marcos de trabajo para aplicaciones web

marcos de software que nos permiten construir aplicaciones web integradas por lo general incluyen una serie de herramientas de apoyo: - soporte para conectar la aplicación web a un motor de bases de datos - apoyo para la actualización del esquema asociado a esta base de datos cada vez que el modelo cambie - plantilla para la generación de contenido web dinámico (se obtiene un aspecto consistente y la sensación de que cada página de la aplicación es creada de forma automática, además llenando las páginas web de manera dinámica mediante la lectura de los datos en la base de datos, lo que se muestra en el navegador es coherente y está al día con lo que se encuentra almacenado en esta base de datos. - gestiones de sesiones HTTP y algo de apoyo de tipo middleware - seguimiento de clientes mientras utilizan un sitio web es mediante la asignación un identificador de sesión único. El navegador de cada usuario transmite este identificador de sesión de vuelta al servidor web con cada petición que se hace desde del navegador, y así se mantiene un registro de quién es quién cuando varios usuarios interactúan con la aplicación web al mismo tiempo. - servidor web y otros componentes de middleware que simplemente funcionan directamente. Usted no tiene que utilizar mucho tiempo de programación para ponerlos en marcha y configurarlos. - generadores de código para crear el andamiaje de una aplicación web. Creación de tests para probar la aplicación web y para asegurarse de que la realización de separaciones es correcta. Permiten generar fácilmente un tipo de modelo vista controlador que también incluye algo llamado API REST. - las aplicaciones web modernas deben soportar un marco continuo de pruebas porque así es cómo el software debe ser desarrollado hoy en día. - apoyo a la internacionalización de su web, de manera que se puede ver en el navegador que una persona está usando y determinar su lengua y entregar contenido en consecuencia. - soporte para la seguridad de su aplicación web o para el despliegue

enconding tipo de codificación

name.encoding => #<Encoding:UTF-8> esquema de codificación una variable que puede representar todo el conjunto de caractereres unicode, que fue diseñado para ser compatible con ASCII y se ha convertido en la codificación de caracteres dominante en la red

Interactive Ruby Shell (IRB) ventana interactiva de Ruby llamada IRB

otra manera de ejecutar código Ruby Esta es una ventana de interpretación que le permite ejecutar códigos desde línea de comandos. Algunas personas lo llaman REPL, que significa: "Read Execute Print Look" o bucle leer, ejecutar e imprimir. Para abrir IRB simplemente escriba irb en el símbolo del sistema operativo y deberá ver una línea como esta: C:\Users\ana.blanco>irb irb(main):001:0> 2+2 => 4 irb(main):002:0> esto es lo que se llama REPL, hay una lectura, ejecución, imprime los resultados y luego vuelve a la línea de comandos de Ruby

enfoques más recientes en las tecnologías de control de versiones

para qué se utilizan? usado por equipos de desarrollo para realizar un seguimiento de las diferentes piezas de código fuente en los que los diferentes miembros del proyecto están trabajando, junto con las diferentes versiones que puedan crear sistemas más tradicionales de control de versiones (no particularmente adecuados para el desarrollo ágil) un solo desarrollador: funciona bien sistemas de control distribuidos de versiones que funcionan bien con la práctica moderna de software control de versiones centralizado: las diferencias son almacenadas

Arquitectura en 3 capas (3-tier)

presentación - interfaz de usuario (navegador web) datos - proporciona almacenamiento (base de datos relacional) lógica de aplicación - Este nivel es el responsable de mediar entre los otros dos niveles porque recupera, modifica o elimina los datos en el nivel de datos y envía los resultados a la capa de presentación de manera que el usuario pueda verlos. También es el responsable del procesamiento de los datos en sí. (servidor web y la lógica asociada con el contenido dinámico que se le entrega al navegador Web del usuario - scripts)

arquitectura de 6 niveles (partimos los 3 niveles aún más en este curso para comprenderlos mejor)

presentación: - cliente: sólo los componentes de la interfaz de usuario del lado del cliente - lógica de presentación: los scripts del lado del servidor que se utilizan para generar páginas Web de forma dinámica nivel de datos: - almacenamiento persistente (base de datos relacional o SQL, o una base de datos NoSQL) - nivel de acceso de datos: se encarga de acceder a los datos desde el nivel de datos y pasarlos a la capa de lógica de negocio. nivel de aplicación: - nivel de lógica de negocio: modela los objetos de negocios asociados con la aplicación, utiliza las reglas de negocios asociadas a la aplicación. - nivel Web: el servidor Web estos niveles se comunican entre sí sólo con los niveles adyacentes. Por lo que se puede cambiar por completo un nivel y no afectar el funcionamiento de la aplicación en su conjunto.

paso 1: proceso de software

procesos de software: proveen una estructura con los aspectos comerciales asociados con el desarrollo del software (ej: costos, contratos, forma en la que el software se desarrolla, garantías del producto entregado, etc.) el proceso de software se centra en la forma en que el software está: - diseñado - desarrollado - probado - mantenido la meta del proceso es mehorar la productividad y calidad del producto final de software proceso involucra: - organizar las actividades asociadas con el desarrollo de software para alcanzar esta meta

Control de versiones

práctica de seguir y gestionar los cambios realizados en artefactos de sofware artefactos: el código en sí mismo, podrían ser los documentos de requisitos, documentos de diseño, cualquier cosa necesaria en la construcción del producto de software

métodos de clase

se crean igual que los métodos normales, excepto que llevan el prefijo self class MyClass def self.cls_method "MyClass type" end end => :cls_method si se invoca, devuelve esa cadena Observe que estoy invocando este módulo en la clase, no en un objeto de esta clase. MyClass.cls_method => "MyClass type"

cadenas

se crean usando comillas simples o dobles se pueden hacer más cosas con cadenas con comillas dobles que simples por ej: interpolación de cadenas "360 grados=#{2*Match: :PI} radianes" acá tenemos una cadena con comillas dobles, pero en medio tenemos lo que se llama interpolación de cadenas. La interpolación de cadenas comienza con # y va entre {} en medio de #{} ponemos el código Ruby que se ejecuta y se va a sustituir en esta cadena "360 grados=#{2*Math::PI} radianes" => "360 grados=6.283185307179586 radianes" dentro de {} se ejecutó el código Ruby, y cuál es el código Ruby 2*Math::PI se lee la constante PI del módulo Math y se multiplica por 2 al ejecutarse se obtiene 6.2831.. etc radianes Se pueden utilizar comillas inversas simples para ejecutar un comando que está en el sistema operativo subyacente. `date` => "The current date is: 01/05/2021 esto es muy bueno para secuencias de comandos ya que podría hasta bajar el sistema operativo y ejecutar comandos como estos Las cadenas en Ruby son mutables esto significa que el valor de la cadena se puede cambiar. Esta mutabilidad es la misma que en C y en C++ pero no en Java, en Java las cadenas son inmutables. También debe saber que cada vez que Ruby encuentra una cadena, se crea un objeto nuevo string por lo que si va a crear literales de cadena dentro de un bucle, cada iteración creará un nuevo objeto string, por lo que debe ser consciente de ello.

variables de instancia

solo se pueden acceder o modificarlas dentro de una definición de método (no se puede utilizar globalmente) acá creamos un método nuevo dentro de la clase, el cual será un método de acceso con un método de asignación dentro: irb(main):009:1* class MyClass irb(main):010:2* def boo #un metodo de acceso irb(main):011:1* return @boo end irb(main):012:2* def boo=(val) #un metodo de asignacion irb(main):013:1* @boo = val end irb(main):014:0> end => :boo= ahora sí probamos crear un nuevo object de MyClass, y ahora sí podemos acceder y modificar la variable de instancia: irb(main):015:0> mo = MyClass.new => #<MyClass:0x000001e1983a25c0> irb(main):016:0> mo.boo = 1 => 1 irb(main):017:0> mo.boo => 1

Hashes Arrays Hash

son arrays asociativos vienen en pares con una clave y un valor la clave y el valor pueden ser cualquier objeto separados por => se puede indexar en un Hash utilizando claves se utilizan símbolos para representar las claves phone = {:home => 1, :mobile => 2, :work => 3} => {:home=>1, :mobile=>2, :work=>3} así se indexa el Hash. Esto devuelve el valor asociado a la clave home (devuelve 1) consulta que devuelve la clave 1 phone.key(1) => :home consulta para ver si existe la clave :home phone.key?(:home) => true consulta para ver si existe el valor 1 phone.value?(1) => true

características de las aplicaciones web

web 1.0: páginas estáticas, primeros modelos de finanzas/negocios, Netscape y Microsoft (guerra de los navegadores) web 2.0 interactividad (Ajax), redes sociales, comercio en línea, wikis (herramientas de colaboración) web 3.0 web ubicua/inteligente, dispositivos conectados a internet todo el tiempo, el internet de las cosas, sistemas de recomendación, web semántica Catalizadores: Ajax (asíncrono: el sitio web no se bloquea y espera a que el contenido vuelva de un servidor, si no que se puede seguir interactuando hasta que el contenido esté disponible) XML ya no se utiliza, sino JSON Javascript interoperabilidad de servicios web (Rest) computación en la nube plataformas móviles

patrones de diseño

ya vimos la complejidad en la web 2.0 y 3.0 en el lado del servidor y del navegador lo que dificulta el desarrollo y mantenimiento de las páginas web abstracción: los ingenieros la usan para gestionar la complejidad - mantiene la representación de las características esenciales de un componente sin incluir los detalles de fondo qué es un patrón de diseño: una solución reusable que incluye un conjunto de componentes que interactúan entre ellos (cómo se organizan estos componentes) para resolver un problema general en un contexto particular (circuntancias en concreto) son plantillas abstractas: no son código real sino ideas de diseño que simplemente ocurren muchas veces (son tan corrientes que se les dan nombres por ejemplo el modelo cliente-servidor) - nos ayudan a comunicarnos con otros ingenieros sobre los componentes

principios de agilidad

- convenio sobre configuración: si se proporciona un marco de software por defecto, la tarea de desarrollo se simplifica enormemente. ya que no se debe pasar mucho tiempo configurando los componentes rutinarios - DRY (dont repeat yourself): no se debe crear información repetitiva dentro de un sistema. Cada pieza de información en el sistema debe tener una única representación acreditada y sin ambigüedades dentro del sistema Si hay un gran número de piezas repetitivas de información dentro del sistema de software, es difícil mantenerlas y sincronizarlas. Si se modifica una pieza de información, el programador tiene que actualizar todos los fragmentos de información relacionados. Y esto a menudo implica la realización de un montón de operaciones de corta y pega. Y es fácil introducir errores Lo mejor que se puede hacer es proporcionar una representación acreditada para cada pieza de información. Y generar los fragmentos de información relacionados automáticamente a partir de este fragmento acreditado. Los generadores de código son un ejemplo de una tecnología que soporta este principio (y las funciones por ejemplo) Cuando se aplica el principio de DRY como parte de un proceso real, se ve algo como esto: Después de desarrollar nuevas funcionalidades como parte de una iteración, se tiene un prototipo funcional. Pero podría tener algunos fragmentos de código repetitivos. Refracte el código encontrado y elimine estas piezas repetitivas. Por ejemplo, se puede reemplazar el código repetitivo con una sola llamada a la función que genera la información repetitiva. Algunas personas se refieren a esto como DRY up code. Después de esto estará usted en la siguiente iteración del ciclo de desarrollo

objetivos de aprendizaje del módulo 1

- qué son los entornos de aplicaciones web y por qué son útiles - cómo se utiliza el patrón de diseño "modelo, vista, controlador" - componentes fundamentales de los procesos ágiles - control de versiones distribuídas (Git) y cómo integrarlo en una aplicación de Ruby on Rails - crear una aplicación web en Ruby on Rails y entender dónde se almacenan los elementos funcionales dentro de la estructura de directorios de la aplicación

añadir un constructor a una clase en Ruby

Si desea añadir un constructor para una clase, utilice el método de inicialización class MyClass attr_accessor :boo def initialize(x=1) @boo = x end end => :initialize intentamos crear un nuevo objeto mo de esta clase: mo = MyClass.new => #<MyClass:0x000001e198349718 @boo=1> esto ha inicializado boo al valor 1, y si lo imprimimos: mo.boo => 1

Invocando IRB desde la Consola Rails

Con las aplicaciónes de Rails hay una manera muy importante de invocar IRB que llama consolas Rails. Invoque IRB desde la raíz de una aplicación Rails escribiendo rails console C:\Users\ana.blanco\hello_WWW>rails console Loading development environment (Rails 6.1.3.1) irb(main):001:0> La diferencia es que todo el entorno Rails (que contiene todo lo que está actualmente definido en su Rails) se carga y se puede interactuar directamente con la aplicación de esta manera. Esta es una manera muy útil para depurar aplicaciones Rails. y si aquí escribo: irb(main):001:0> names = Pioneer.all (este es el nombre que le dí a la variable) y esto devuelve todos los nombres que tengo almacenados allí names = Pioneer.all (12.0ms) SELECT sqlite_version(*) Pioneer Load (0.2ms) SELECT "pioneers".* FROM "pioneers" => [#<Pioneer:0x000001ea1a266118 ... irb(main):002:0> names[0] => #<Pioneer:0x000001ea1a266118 id: 1, first_name: "Alan", last_name: "Turing", created_at: Thu, 29 Apr 2021 18:39:44.588298000 UTC +00:00, updated_at: Thu, 29 Apr 2021 18:39:44.588298000 UTC +00:00> irb(main):003:0> names[0].first_name => "Alan" irb(main):004:0> names[0].last_name => "Turing" También podemos crear nuevos elementos en la base de datos desde aquí irb(main):006:0> Pioneer.create(:first_name => "John", :last_name => "von Neumann") TRANSACTION (0.1ms) begin transaction Pioneer Create (1.3ms) INSERT INTO "pioneers" ("first_name", "last_name", "created_at", "updated_at") VALUES (?, ?, ?, ?) [["first_name", "John"], ["last_name", "von Neumann"], ["created_at", "2021-04-30 07:59:25.520140"], ["updated_at", "2021-04-30 07:59:25.520140"]] TRANSACTION (9.6ms) commit transaction => #<Pioneer:0x000001ea178d1c08 id: 2, first_name: "John", last_name: "von Neumann", created_at: Fri, 30 Apr 2021 07:59:25.520140000 UTC +00:00, updated_at: Fri, 30 Apr 2021 07:59:25.520140000 UTC +00:00>

Ruby on Rails una visión general nuestro primer programa en Rails

Rails tiene un conjunto extensivo de generadores de código, scripts para test y otras prestaciones que hacen la programación mucho más fácil. vamos a echar un vistazo a algunas otras herramientas de este ecosistema de Rails: 1) Rake: es una contracción de Ruby y Make, y si está familiarizado con esta versión Make de Unix, esto es lo mismo pero para Ruby. 2) WEBrick es un servidor web que vamos a utilizar para agregar nuestras aplicaciones Web. También se pueden configurar Rails para utilizar otros servidores Web fácilmente 3) SQLite es un servidor de datos muy simple, basado en ficheros que viene preinstalado en Rails. Está bien para empezar, pero deberá reemplazarlo por aplicaciones Web con calidad de producción que quiera desplegar para cualquier aplicación real 4) Rack Middleware: una interfaz estandarizada para interacción entre el servidor Web y la aplicación (está instalado automáticamente) en la cmd tecleamos: C:\Users\ana.blanco>rails new hello_WWW (Rails genera un montón de directorios, luego el comando bundle install gestiona dependencias y gemas para la app web. Se debe ejecutar este comando cada vez que se empieza a construir una aplicación o se clone una aplicación de Github por ej, esto asegura que tengamos las gemas adecuadas) C:\Users\ana.blanco\hello_WWW>bundle check The Gemfile's dependencies are satisfied todas las gemas que se han instalado en el directorio de trabajo están actualizadas luego entramos en la carpeta creada cd hello_WWW e inicializamos el servidor rails server server check salimos del servidor con Ctrol + C rails server -h Runs Rails on the specified port - defaults to 3000. luego en el navegador vamos a http://localhost:3000/

Ruby y rails

Ruby: lenguaje de programación multiparadigma (soporta programación orientada a objetos, programación funcional y se puede utilizar también como un lenguaje de scripts, es muy flexible) enfoque basado en el programador, en lugar de la máquina a medida que los procesadores y la memoria se han vuelto más rápidos y más baratos no hay restricciones en cuando a la potencia de procesamiento o memoria en la máquina en la mayoría de las computadoras de hoy en día, por lo tanto, en lugar de perder el tiempo en la optimización de la velocidad del proceso del programa o de uso de la memoria, Ruby trata de hacer que el programador sea más eficiente Rails: fue construido utilizando el lenguaje de programación Ruby. Ruby admite una característica llamada metaprogramación. La metaprogramación se refiere a la capacidad de escribir programas que utilizan otros programas como sus datos. Por lo que Rails fue construido utilizando las capacidades de metaprogramación de Ruby, y eso en realidad es lo que se conoce como un lenguaje específico de dominio Un lenguaje específico de dominio, es un lenguaje de programación diseñado para expresar soluciones a los programas en un dominio específico. Por esto, el dominio del Rails fue construido para trabajar con aplicaciones web. Básicamente se trata de un lenguaje de programación para aplicaciones web. - código abierto basado en la licencia de MIT - completa integración: desde almacenamiento de datos en el servidor, pasando por la presentación de la interfaz de usuario de las páginas web y todo lo demás. Algunas de las web que se han construido utilizando Rails son: Twitter, Hulu, GitHub, Bloomberg, Airbnb y Heroku Heroku es la que vamos a utilizar para implementar de forma efectiva nuestras aplicaciones en el Rails, más adelante en esta especialización.

etapas del proceso de software

análisis de los requisitos - recoger y documentar las espectativas de los clientes para el software - documentar exactamente que se supone que tiene que hacer el software diseño: división y estructura del software para que cumpla los requisitos - se captura de una forma que se pueda comunicar a otras personas implementación: la codificación misma - crear el código que satisface el diseño anterior fase de prueba: - verificación de que el sistema está en funcionamiento y que satisface los requisitos originales. mantenimiento: - asegurar que el software es corregido y mejorado según se descubren los defectos y se hacen peticiones de nuevas funcionalidades el objetivo es definir procesos repetibles y predecibles para organizar estas actividades, con el fin de hacer una programación lo más productiva posible. cómo organizar estas actividades? enfoque extinguido: método en cascada (proceso lineal) se termina por completo cada actividad antes de pasar a la siguiente (no se puede retroceder) cuál es el problema con este enfoque? En sistemas complicados, los fallos de especificación de diseño son a menudo difíciles de encontrar hasta que alguien comienza a construir el software. O el usuario final llega a interactuar con él cuánto más tarde en el proceso se encuentra un error, más caro es arreglarlo. Por ejemplo, si se va a encontrar un error de requerimiento durante el proceso de prueba, tiene que modificar los requisitos, reparar el diseño completo y luego todo el código que se ve afectado por el cambio de diseño.

qué es una aplicación web y cómo se implementan? modelo arquitectónico básico

arquitectura cliente-servidor servidor: escucha peticiones y proporciona servicios/recursos en respuesta (servidor web) una red (internet)cliente: establece una conexión con el servidor, hace una solicitud y recibe una respuesta (navegador web) HTTP aplicación web: se accede por parte de usuarios a través de internet utilizando un navegador web como cliente, y se compone de una colección de programas del lado del cliente y del lado del servidor, páginas HTML y otros recursos que se pueden difundir a través de múltiples servidores o en toda la world wide web world wide web no es lo mismo que internet: es un sistema de documentos (páginas web) que se acceden a través de internet opera encima de internet las páginas web contienen hipermedia (contenidos multimedia) los hipervínculos dan a la web su estructura la estructura es lo que la hace útil y le da valor

la programación

bits -> ensamblador -> LAN (lenguajes de alto nivel como C, Cobolt, Fortran, Basic), una sola instrucción en un lenguaje de programación de alto nivel corresponde generalmente a muchas instrucciones en lenguaje ensamblador, y una vez más, se gana en productividad del programador, en detrimento de la eficacia en el programa en sí. OOP (C++, Java) marcos de software: proporciona un entorno integrado que está dirigido a un dominio específico; por ejemplo, la mayoría de los sistemas operativos tienen un marco de software para aplicaciones de desarrollo que se ejecutan en su entorno. Microsoft tiene Windows Presentation Foundation, que es un marco para aplicaciones basadas en Windows; Apple tiene Cocoa, para lo mismo; y Linux tiene Gnome o KDA, que permiten construir sus ventanas. Así que los marcos de software son solo una evolución natural en la trayectoria de la eficiencia en la productividad del programador.

clases de colección Arrays y Hash

clases de colección se utilizan para almacenar colecciones de datos (como arreglos) Ruby tiene varias, las que vamos a ver son Array y Hash incluyen el modelo enumerable como un mix-in un mix-in es una manera de combinar clases juntas y así los métodos del modelo enumerable pasan a ser métodos en Array y en Hash por lo tanto cualquier colección que se cree a partir de enumerable compartirán los métodos que vienen del módulo enumerable

Herencias

class NewClass < SuperClass ... end recordás lo siguiente? class Pioneer < ActiveRecord: :Base ... end este Pioneer muestra que es heredero de la base ActiveRecord, la base de registro activo ActiveRecord es un módulo y así es como se extrae una clase de este módulo diciendo ActiveRecord : :Base

internet

conexión de redes (locales, como la que vimos antes) todas conectadas a una red troncal de internet la red local se conecta al proveedor de Internet (ISP) y esto se realiza generalmente a través de un módem. Entre cada 2 redes en internet debe existir un enrutador para conectar dos nodos, cada uno debe tener una dirección IP ¿cómo va un mensaje de un nodo a otro? Este router o enrutador utiliza un protocolo que se llama TCP/IP. TCP/IP es muy similar a Ethernet. Se rompe un mensaje en paquetes y este paquete tiene una dirección de origen (dirección IP en lugar de una dirección MAC) y luego también una dirección de destino, y por supuesto, los datos asociados a este paquete. hay muchos enrutadores que este mensaje o un paquete dado atraviesan, por lo que cada paquete puede tomar una ruta diferente. Se puede imaginar fácilmente la cantidad de enrutadores que un paquete dado puede tener que atravesar para ir de un origen a un destino. También hay corta fuegos. Nombres de dominio: en vez de usar la IP address 129.51.150.10 usamos www.google.com esto tiene que ser traducido como una dirección IP correcta y esto es mediante el uso del servidor de nombres de dominio o DNS, para abreviar.

bucles de iteración for ... in ... do ... end while ... ... end until ... ... end

for var in coleccion do código end colección enumerable while condición código end until condición código end (no muy relevante pero sirve para escribir código más legible)

iteradores

en Ruby las estructuras de bucle no se usan mucho, es mucho más común usar iteradores la característica principal del método iterador es que invoca un bloque de código y lo aplica a cada elemento de una colección para que funcione se requiere una clase de colección que incluya el módulo enumerable para que suministre el método each este método pasa por los sucesivos miembros de una colección entonces los iteradores funcionan porque les pasamos parámetros dentro de los bloques método each en enumerable: def each for each item in the collection yield(item) end end a = [33.3, "hi", 2] => [33.3, "hi", 2] a.each{|$\vert$|element|$\vert$| puts element} podemos ver este iterador en nuestro archivo de vista de Rails <tbody> <% @pioneers.each do |$\vert$|pioneer|$\vert$| %> etc... first name, last name, link to show, link to edit, link to destroy por alguna razón este código no funcionó, y mirando el archivo creado por Rails, el código es distinto en la actualidad <tbody> <% @pioneers.each do |pioneer| %> <tr> <td><%= pioneer.first_name %></td> <td><%= pioneer.last_name %></td> <td><%= link_to 'Show', pioneer %></td> <td><%= link_to 'Edit', edit_pioneer_path(pioneer) %></td> <td><%= link_to 'Destroy', pioneer, method: :delete, data: { confirm: 'Are you sure?' } %></td> </tr> <% end %> </tbody> a.each {|element| puts element} 33.3 hi 2 => [33.3, "hi", 2] funcionó |element| entre barras verticales es el parámetro que se utiliza para cada iteración del iterador y el bloque (o acción) es lo que le pasamos en llaves {puts element}

estructura en nuestra primera aplicación Rails

en la consola y situados en nuestra carpeta de RAILS.root escribimos rails generate scaffold pioneer \ first_name:string last_name:string (la barra \ solo es necesaria si el comando se extiende sobre dos líneas en la consola. Generalmente se escribe esto sobre una línea y no es necesario usar esta barra diagonal) Después de ejecutar esto verá un montón de directorios que se crean. Esto es en realidad la creación de un andamio modelo vista controlador para pioneers. Quiero guardar los pioneers, pioneros relacionados con la informática en esta aplicación. Y quiero almacenarlos por el nombre y el apellido. Lo siguiente que tengo que hacer es migrar la base de datos. Hay una base de datos SQLite que corre por debajo de esta aplicación web y quiero poner en ella algo nuevo. para migrar la base de datos: rake db:migrate luego iniciamos el servidor web: rails server luego abrimos un navegador y vamos aÑ http://localhost:3000

control de flujo específico que ocurre entre los tres elementos en el patrón de diseño modelo vista y controlador

en primer lugar la interfaz de usuario se procesa y se espera la entrada del usuario, esta es la vista. A continuación el usuario proporciona alguna entrada, por ejemplo el usuario puede hacer clic en un botón y entonces el controlador maneja este evento de entrada y solicita alguna acción. Esto podría ser algún tipo de código de controlador o función de llamada que es inteligible por parte de los modelos. El controlador es el encargado de hacer esto. Entonces el controlador notifica al modelo, y esto puede conducir a un cambio de estado en este modelo. Por ejemplo, es posible que se actualice la información de cuenta de una persona. Finalmente, el controlador notifica a la vista si esta vista tiene que ser actualizada, por ejemplo si ha actualizado la cuenta. Entonces es posible que desee representar esa descripción actualizada cuando el usuario va a buscar a esa información. Y luego vamos al paso 1, así que este es el control de flujo asociado con un diseño modelo vista controlador. En la arquitectura canónica de aplicaciones web de 6 niveles que vimos anteriormente, el patrón de diseño modelo vista controlador se ejecuta sobre el nivel web en esta arquitectura (nivel de lógica de presentación, nivel de lógica de negocio, nivel de acceso de datos)

Git

es compatible con desarrollo no lineal. Es decir, se pueden tener miles de ramas paralelas de desarrollo como parte de un repositorio Git Casi todas las operaciones que realiza Git son locales. Es decir, se ejecutan en el equipo local. Además tiene integridad. Esto significa que cada archivo almacenado en Git lleva una comprobación de suma, un ckecksum, antes de ser almacenado. Un checksum se calcula utilizando el archivo. Por lo que si se modifica un archivo en modo alguno, se calcula luego checksum que será diferente del anterior. Y así es como Git puede determinar que el archivo ha sido modificado Git únicamente añade archivos al repositorio. Y por eso es muy difícil que el sistema haga algo que no se puede deshacer si usted comete un error Git le permite comparar las diferencias entre distintas versiones de su proyecto. Recordemos que en los sistemas de control de versiones distribuidos se almacenan instantáneas de su proyecto. De esta forma las puede almacenar y luego combinarlas si es necesario. Se puede pensar en las diferentes versiones del proyecto como en un árbol.

desarrolo ágil

es iterativo e incremental, acoge requerimientos cambiantes del cliente el programador es más importante que el proceso la gestión del proyecto se basa más en las competencias del gestor del proyecto y la comunicación y coordinación. Con menos énfasis en planificación, control y documentación Para aprender más sobre la filosofía ágil AgileManifesto.org se centra en la retroalimentación a través de la prueba frequente y lanzamientos de software en evolución énfasis en la comunicación cara a cara se centra en la calidad del software, no en otros aspectos del desarrollo de software la principal medida de progreso es el funcionamiento del software

mejoras del método en cascada

está motivada por la mitigación de riesgos. Se basa en la noción de iteración en espiral a través de las actividades de desarrollo del software. En lugar de un flujo lineal como en un método en cascada, el proceso en espiral comienza con el análisis de requerimientos pero no se trata de capturar todos los posibles requisitos de prestaciones del sistema 1) En lugar de esto, se trabaja con el cliente para capturar bien la primera estimación de los requisitos 2) A continuación se realiza una evaluación del riesgo. La idea de evaluación de riesgo se trata de identificar el elemento de mayor riesgo del proyecto y esta es la primera parte del proyecto que se intenta diseñar y construir (Si no se pueden resolver los elementos de mayor riesgo del proyecto, entonces el proyecto en su conjunto fallará. Por qué no investigar primero antes de gastar un montón de dinero tratando de desarrollar las otras partes del proyecto.) Con el método en cascada, es posible que no se descubra este problema hasta el final del proceso. 3) el siguiente paso consiste en crear algún diseño preliminar y luego construirlo para que el cliente lo vea. Y en general esto se hace primero probando el software y a continuación proporcionando un prototipo. Al final de una espiral, la meta es producir un prototipo de trabajo que se puede compartir con el cliente. el cliente puede proporcionar retroalimentación temprana en cuánto a si el proyecto está en la línea de sus expectativas. basándose en la retroalimentación proporcionada por el cliente, el equipo de desarrollo puede actualizar los requisitos y luego iterar el proceso. en lugar de penalizar los cambios con el proceso de cascada, este proceso busca descubrir cualquier hipótesis de diseño que falte o requisitos incorrectos u otros defectos, tan pronto como sea posible durante el proceso. Y de hecho, permite el cambio en cada iteración. Si los riesgos asociados con determinada iteración se mitigan con éxito, se plantea la próxima generación que involucra abordar el elemento restante de mayor riesgo.

programación Ruby

los archivos de modelo, vista y controlador hacen un uso extensivo de Ruby miramos el archivo pioneers.rb dentro de la carpeta models y vemos que solo contiene una clase pioneers que hereda de la clase ActiveRecord Base Ahora echamos un vistazo a los controladores. Haga clic en pioneers_controller.rb y verá que hay otra otra clase aquí llamada pioneerscontrollers.rb Y tiene un montón de funciones dentro de ella. Estas funciones proporcionan lo que se conoce como una interfaz rest. Vamos a hablar mucho más sobre las interfaces rest más tarde y aprender lo que este controlador está haciendo. Esta es una de las cosas más importantes de rails Finalmente vamos a ver las vistas carpeta pioneers > index.html.erb. Esto es todo código html. Y dentro de este código, donde se ve el signo de porcentaje <% %> o <%= %>, esto es código Ruby. Esto es lo que se conoce como Ruby incrustado. Así que aquí tenemos un archivo HTML que tiene código Ruby dinámico, ejecutándose dentro de él. Esto es lo que crea las páginas web dinámicas. Es una lectura en tiempo real de los nombres y apellidos y va a través de cada uno de ellos en la base de datos. Ruby es un lenguaje interpretado en lugar de un lenguaje compilado. Por lo que cuando se ejecuta el intérprete va línea por línea y ejecuta el código. C:\Users\ana.blanco>ruby -e 'puts "Hello World!"' Hello World! El menos indica al intérprete que ejecute la línea de código Ruby contenida dentro de las comillas simples. El comando puts devuelve la cadena entre comillas dobles a la ventana de terminal. típicamente usted no desea programar de esta manera, es mejor poner le código Ruby en un archivo. Podemos poner este mismo código Ruby en un archivo con la extensión .rb puts "Hello World!" en el archivo y se guarda como hello.rb luego en la terminal ruby hello.rb y se ejecutará el Hello World!

Arrays

los arrays son colecciones de objetos que están indexados a = [33.3, "hi", 2] => [33.3, "hi", 2] a[0] => 33.3 las matrices pueden ser heterogéneas (pueden almacenar distintos tipos de objetos) se usan corchetes para indexar podemos indexar un rango a[1..2] => ["hi", 2] se puede agregar un elemento al final del array a << 5 => [33.3, "hi", 2, 5] se pueden usar índices negativos los índices positivos comienzan al inicio de la matriz, los índices negativos comienzan al final a[-1] => 5 el método include? se fija si el elemento proporcionado forma parte de la matriz y devuelve true o false a.include? 2 => true los métodos que terminan con un ? devuelven un valor booleano hay más métodos que se pueden encontrar en internet, como ordenar arrays, extraer o agregar elementos, etc.

Git en la práctica

los desarrolladores usan un repositorio común al que se conectan para sincronizarse directorio de trabajo area de preparacion repositorio git local REPOSITORIO GIT REMOTO para sincronizar el repositorio local con el repositorio remoto se emite el comando push. Se especifica la URL del repositorio remoto así como la rama a la que se desea subir del repositorio remoto desde el repositorio local El comando Fetch se usa para obtener información desde el repositorio remoto y bajarlo a su repositorio local de Git el comando pull ejecuta una búsqueda, seguida de una combinación del repositorio remoto con el repositorio local Clone se usa si no se tiene un repositorio local con el cual sincronizar el repositiorio remoto. Entonces se crea una copia local del repositorio remoto cómo se configura un repositorio remoto? GitHub o BitBucket - crea un repositorio llamado blog - cuando hemos terminado de crearlo vamos a seguir estos pasos dados en GitHub: ...or push an existing repository from the command line git remote add origin https://github.com/giniblanco/blog.git git branch -M main git push -u origin main pero antes de hacerlo, tenemos que preparar nuestro usuario y contraseña. Esto es porque cada ver que hacermo commit en Git, se almacena el nombre de usuario y la contraseña del usuario que ejecutó este comando. Ahora como tenemos un repositorio remoto y muchas personas van a utilizarlo, tenemos que establecer esta información en nuestro Git local git config --global user.name "giniblanco" git config --global user.email "[email protected]" git config -l ahora sí hacemos lo que nos indica github git remote add origin https://github.com/giniblanco/blog.git el comando git remote add origin agrega este repositorio remoto a mi repositorio local entonces cada vez que hago un push, sube el código y cuando quiero bajar código con pull, se saca de este repositorio en github luego git push origin master y listo, podés mirar en tu repositorio en github la actividad y el commit

Marcos de aplicaciones

los marcos son un entorno de software reutilizable, universal, y proporcionan una funcionalidad concreta, como parte de una plataforma de software más grande para facilitar el desarrollo de software. El concepto de un marco es cómo hacer soluciones de talla única dentro de un dominio general, para luego ser personalizardas por un programador para hacer frente a un problema más específico a través de este dominio general. Dos partes en los entornos de aplicaciones: 1) los puntos congelados o frozen spots: partes que no cambian en ninguna instancia de este marco y definen la arquitectura general de los componentes básicos y la relación entre ellas. Se ofrecen de forma gratuita dentro de este marco y son la infraestructura o la fontanería de la aplicación. 2) los puntos calientes, o hot spots: donde los programadores ponen su propio código. Los medios a través de los cuales se extiende el comportamiento de la estructura para que se adapte a las necesidades de la aplicación en particular, la funcionalidad que que se está tratando de poner en práctica. De esta manera mediante los puntos congelados, los programadores obtienen una gran cantidad de funcionalidades sin tener que pensar o crearlas desde cero y pueden enfocar su creatividad en las necesidades específicas de su aplicación. No luche contra el marco. Si usted se ve haciendo grandes cambios en la parte congelada (en la infraestructura del marco) entonces no lo está utilizando correctamente. Este no es un buen inicio para resolver un problema que tenemos entre manos.

símbolos (muy especiales en Ruby)

los símbolos se crean agregando : a una cadena attr_accessor :first_name, :last-name ahora ya sabemos que estos son símbolos los símbolos son inmutables, solo un símblo con un nombre puede existir en un programa (no se pueden modificar luego de crearlos) ej: :name = "Homer" nos da un error porque tenemos un símbolo en el lado izquierdo, y le estamos tratando de asignar una cadena ahora tenemos una variable (cadena) en el lado izquierdo y tratamos de asignarle un símbolo: name = :Homer => :Homer eso sí funciona podemos acceder la variable ahora que tiene un símbolo? name[4] => "r" sí, se puede podemos modificarla? name[4] = 'y' no, nos da un error undefined method `[]=' for :Homer:Symbol está prohibido porque los símbolos de Ruby son inmutables Debido a que son inmutables hay una gran ventaja de espacio asociada con estos símbolos. Cada nombre de símbolo se almacena solamente una vez en memoria pero existen multiples cadenas con el mismo nombre en la memoria puts "name".object_id 300 Si hago lo mismo otra vez, me da un número diferente, lo que significa que se ha creado una cadena diferente y ahora tenemos dos cadenas con el mismo nombre y con dos identificadores de objeto diferentes. puts "name".object_id 320 ahora hago lo mismo y creo un símbolo :name puts :name.object_id 71068 si hago lo mismo de nuevo me sale el mismo número. Por lo que no puedo crear dos símbolos con el mismo nombre en un programa de Ruby. puts :name.object_id 71068 cuándo se utilizan los símbolos y cuándo se utilizan las cadenas? - si el contenido es lo más importante y debemos manipularlo, se usa cadena - si en cambio es la identidad del objeto lo más importante (generalmente no vas a querer manipular los caracteres), se usa un símbolo por eso se eligió usar símbolos para :first_name y :last_name porque no vamos a manipularlos y es la identidad del objeto la que nos importa

Regexp clase de expresiones regulares Clase expresión regular (Regexp)

soporta expresiones regulares usada en strings ayuda a encontrar coincidencias en cadenas de textos (caracteres, palabras o patrones) sintaxis /patron/modificadores primero el patrón de expresión regular y luego un modificador que puede estar unido a él la parte de modificación es opcional y para encontrar coincidencias expreg a la derecha cadena en la izquierda "Homer" =~ /er/ => 3 devuelve el índice donde se encuentra "Homer" =~ /hom/ => nil (dice que no hay coincidencia, porque es sensible a las mayúsculas) si queremos ignorar las mayúsculas debemos incluir /i que significa ignorar las mayúsculas "Homer" =~ /hom/i => 0 y ahora sí encontramos la coincidencia para ver más comandos como estos, consulte una guía de comandos de Ruby []: especificación de rango, ej a-z significa una letra entre a y z \: caracter de palabra 0-9 A-Z a-z o un guión _ \W: caracter no de palabra \s: caracter de espacio \S caracter no de espacio \d: caracter de dígito 0-9 \D: caracter no digito \A: inicio de cadena \z: fin de cadena \b: limites de palabra, si no se usa en una especificación de rango *: cero o más repeticiones de lo anterior +: una o más repeticiones de lo anterior {m,n}: al menos m y como máximo n repeticiones de lo anterior ?: como máximos una repetición de lo anterior, igual que {0,1} |: anterior o posterior expresión deben ser iguales (): agrupamiento borra dígitos que no sean números en un número de teléfono: \D telefono = "(555) 646-2213" => "(555) 646-2213" telefono.gsub!(/\D/,"") => "5556462213" /\D/ porque \D tiene que ir entre //, entonces \D corre por la cadena y cada vez que encuentra un caracter que no es un digito lo sustituye por un "" caracter nulo, nada, etc. simplemente se deshace de ellos esta expresión corrobora que una dirección de email es válida \A[\w\.-]+\@[a-z]+\.[a-z]{3}\z almacenamos esta expresión regular en una variable email = /\A[\w\.-]+\@[a-z]+\.[a-z]{3}\z/ => /\A[\w\.-]+\@[a-z]+\.[a-z]{3}\z/ luego ingresamos un email en forma de cadena y la comparamos con la expresión que tenemos en la variable "[email protected]" =~ email => 0 nos da un 0 que quiere decir que está bien si nos falta un punto o hay algún otro error, nos sale nil "greg@emailcom" =~ email => nil para más expresiones regulares, mirá rubular.com ahí podemos probar expresiones como [\w\.-]+ \w caracter de palabra \.- punto y guión se aceptan [] todo entre corchetes porque estarían en un conjunto, en un rango + quiero más de una repetición de esta expresión luego queremos aceptar un @ (solo 1) \@ luego queremos caracteres de la a-z con más repeticiones [a-z]+ \. queremos que haya un punto luego de este conjunto de letras, y luego del punto queremos aceptar 3 letras {3} indicamos que aquí debe terminar la cadena \z

David Heinemeier Hansson inventor de Rails

tenemos que encontrar formas de sopesar eficiencia en tiempo de ejecución con la eficiencia en el tiempo creativo, con el fin de hacer el desarrollo de aplicaciones más barato. Creo que hemos entrado hace mucho tiempo en una edad en la que simplicidad del desarrollo y en el mantenimiento es donde radica el verdadero valor. el tiempo de los programadores es muy valioso. Los programadores ganan hoy día una gran cantidad de dinero, por lo que es más importante ahorrar en su tiempo de trabajo que exprimir un poco más la eficiencia en el tiempo de ejecución del programa y esta es la filosofía detrás de los procesos de desarrollo web ágiles hoy en día, que corresponde con la filosofía de Rails.

neutralidad de la red seguridad y privacidad computación en la nube big data (bases de datos grandes)

todo el tráfico se debe tratar de la misma manera Netflix no puede cobrar a los usuarios más para proveerles mayor ancho de banda, o Comcast no puede ralentizar las conexiones de red de los que tienen sitios de intercambio de archivos. seguridad y privacidad: ciberataques computación en la nube: está cambiando la forma en la que diseñamos aplicaciones big data (ahora tenemos una capacidad sin precedentes para analizar datos y descubrir nuevos hechos. Esto permite a las compañías tomar decisiones de negocio más informadas, pero esto también permite la recogida de datos sobre cómo las personas están navegando por Internet. Así que se pueden dirigir hacia estos usuarios y hacerles ofertas publicitarias individualizadas)

prácticas modernas de ingeniería de software

técnicas, herramientas, principios específicos subyacentes en la práctica, la forma en que los marcos de aplicación soportan estos principios

ventajas de las aplicaciones web y desventajas

ubicuidad y conveniencia de utilizar un navegador web como cliente (todo el mundo tiene acceso a un navegador en cualquier dispositivo) compatibilidad multiplataforma inherente: cualquier navegador en cualquier sistema podrá mostrar la aplicación web actualización y mantenimiento de aplicaciones web sin molestar o instalar software en miles de equipos de clientes (siempre se accede a la última versión) desventajas: antes solía ser la experiencia del usuario con comparación con la aplicación de escritorio, esto ya no es un problema estos días privacidad y seguridad: no es una desventaja ya sino un objetivo son más difíciles de programar (base de datos, middleware, partes móviles)

bloques de código

un bloque consiste en múltiples líneas de código entre llaves o comandos do y end do ... ... ... ... end lo bueno de esto es que se puede pasar un bloque como parámetro o un módulo en algunos lenguajes de programación esto se conoce como "cierres" o closures (JS) un bloque solo puede aparecer en Ruby si es adyacente a una llamada a método (en la misma línea que el último parámetro de la llamada al método) method_name(parameter_list){block} para invocar un bloque que ha sido pasado a un método se usa la palabra yield en este ejemplo estamos definiendo un método llamado three_times y solo va a ejecutar el bloque que le pase 3 veces def three_times yield yield yield end Se pasa el bloque de código al método y se ejecuta el bloque 3 veces three_times{puts "Hello"} Hello Hello Hello

métodos de iteración

utilizados para iterar, para ir por cada elemento de una colección y operar en ellos el método de iteración es uno de los métodos que vienen en la clase de controladores de Rails los arrays se usan muchísimo en los controladores de Rails def index @pioneers = Pioneer.all end @pioneers (variable de instancia) Pioneer.all (la clase con un método) devuelve una matriz con todos los pioneers que se extraen de la base de datos

evolución de las aplicaciones web web 1.0

web 1.0 modelo cliente - servidor el servidor busca páginas estáticas, no hay separación entre la página y sus datos con las aplicaciones web modernas, el contenido es generado dinámicamente por lo que si los datos cambian, el contenido se actualiza automáticamente HTTP protocolo sin estado: un protocolo sin estado no requiere que el servidor retenga la información de sesión o de estados sobre los elementos de comunicación a través de múltiples peticiones. Cada solicitud se trata como una transacción independiente que no está relacionada con la anterior solicitud hecha por el navegador. contexto: mediados de los 90, era principalmente solo lectura, luego las aplicaciones se fueron haciendo más ricas lo que dio problemas de mantenimiento y compatibilidad durante la guerra de los navegadores guardar los estados de los navegadores: carrito que guarda la compra para cuando regresas a la tienda online, como solución, se inventaron las cookies. CDN: ervidores más rápidos, web en CDN. CDN significa red de distribución de contenidos. Con el CDN el contenido se replica y se almacena en servidores de alto rendimiento que están más cerca de los usuarios. Por lo que se permite una más rápida descarga de contenidos web.


Kaugnay na mga set ng pag-aaral

respiratory organ with its function

View Set

Chapter 17. The East Asian World

View Set

Area: Shapes with Fractional Side Lengths

View Set

ACC 2302 - Exam 3 - Practice Exam

View Set

Chapter 8 - Diversification strategies

View Set

4.2 Steps in Decision Making Process

View Set