lunes, enero 09, 2017

Construye Elegantes Componentes Rails Con Plain Old Ruby Objects

BY EQBAL QURAN - FREELANCE SOFTWARE ENGINEER @ TOPTAL (TRANSLATED BY MARISELA ORDAZ) #Decoupling #RoR #Ruby #RubyOnRails
This article was originally written in English
Tu sitio web está avanzando y estás creciendo rápidamente. Ruby/Rails es tu mejor opción de programación. Tu equipo es más grande y ya dejaste el concepto “modelos gordos, controladores delgados” (fat models, skinny controllers) como estilo de diseño para tus aplicaciones Rails. Sin embargo, todavía no quieres dejar de usar Rails.
No hay problema. Hoy vamos a discutir cómo usar las mejores prácticas POO para hacer tu código más limpio, aislado y separado.

¿Vale La Pena Refactorizar Tu Aplicación?

Comencemos por mirar como deberías decidir si tu aplicación es una buena candidata para refactorización.
Aquí hay una lista de métricas y preguntas que usualmente me hago para determinar si mis códigos necesitan o no refactorización.
  • Unidades de prueba lentas. las unidades de prueba PORO normalmente corren rápido, con códigos bien aislados, así que las pruebas que corren lento pueden, a menudo, ser un indicador de un mal diseño o responsabilidades sobre-acopladas.
  • FAT models or controllers. Un modelo o controlador con más de 200 líneas de código (LOC) es generalmente un buen candidato para refactorizar.
  • Base de código excesivamente larga. Si tienes ERB/HTML/HAML con más de 30,000 LOC o código fuente Ruby (sin GEMs ) con más de 50,000 LOC, hay una gran posibilidad de que debas refactorizar.
Intenta usar algo así para saber cuántas líneas de código fuente Ruby tienes:
find app -iname "*.rb" -type f -exec cat {} \;| wc -l
Este comando buscará en todos los archivos con extensión .rb (archivos ruby) en la carpeta /app, luego imprime el número de líneas. Por favor, ten en cuenta que este número es solo un aproximado, ya que las líneas de comentario se incluirán en este total.
Otra opción más precisa e informativa es usar la tarea rake stats de Rails, la cual expone un resumen rápido de líneas de código, número de clases, número de métodos, el ratio de métodos a clases y el ratio de líneas de código por método:
*bundle exec rake stats*                                                                       
+----------------------+-------+-----+-------+---------+-----+-------+
| Nombre                 | Líneas | LOC | Clase | Método | M/C | LOC/M |
+----------------------+-------+-----+-------+---------+-----+-------+
| Controladores          |   195 | 153 |     6 |      18 |   3 |     6 |
| Helpers              |    14 |  13 |     0 |       2 |   0 |     4 |
| Modelos               |   120 |  84 |     5 |      12 |   2 |     5 |
| Mailers              |     0 |   0 |     0 |       0 |   0 |     0 |
| Javascripts          |    45 |  12 |     0 |       3 |   0 |     2 |
| Bibliotecas            |     0 |   0 |     0 |       0 |   0 |     0 |
| Controlador specs     |   106 |  75 |     0 |       0 |   0 |     0 |
| Helper specs         |    15 |   4 |     0 |       0 |   0 |     0 |
| Modelo specs          |   238 | 182 |     0 |       0 |   0 |     0 |
| Petición specs        |   699 | 489 |     0 |      14 |   0 |    32 |
| Routing specs        |    35 |  26 |     0 |       0 |   0 |     0 |
| Vista specs           |     5 |   4 |     0 |       0 |   0 |     0 |
+----------------------+-------+-----+-------+---------+-----+-------+
| Total                |  1472 |1042 |    11 |      49 |   4 |    19 |
+----------------------+-------+-----+-------+---------+-----+-------+
 Código LOC: 262     Prueba LOC: 780     Ratio Código a Prueba: 1:3.0

  • ¿Puedo extraer patrones recurrentes en mi base de código?

Separando en Acción

Comencemos con un ejemplo de la vida real.
Imagina que queremos escribir una aplicación que siga el tiempo para las personas que trotan; en la página principal, el usuario puede ver los tiempos que se introduzcan.
Cada una de las entradas de tiempo tienen fecha, distancia, duración, e información adicional relevante del “status” (ej.: clima, tipo de terreno, etc.), y una velocidad promedio que puede ser calculada cuando sea necesario.
Necesitamos un reporte que muestre la velocidad promedio y distancia por semana. Si la velocidad promedio en la entrada es mayor a la velocidad promedio en total, notificaremos al usuario a través un SMS (para este ejemplo, usaremos Nexmo RESTful API para enviar el SMS).
La página principal te permitirá seleccionar la distancia, fecha y tiempo en que se está trotando, para así crear una entrada similar a ésta:
También tenemos una página de estadísticas, la cual es básicamente un reporte semanal que incluye la velocidad promedio y distancia cubierta por semana.
  • Puedes ver la muestra online aquí.

El Código

La estructura del directorio de la aplicación se ve similar a esto:
     ⇒  tree
   .
   ├── assets
   │   └── ...
   ├── controllers
   │   ├── application_controller.rb
   │   ├── entries_controller.rb
   │   └── statistics_controller.rb
   ├── helpers
   │   ├── application_helper.rb
   │   ├── entries_helper.rb
   │   └── statistics_helper.rb
   ├── mailers
   ├── models
   │   ├── entry.rb
   │   └── user.rb
   └── views
       ├── devise
       │   └── ...
       ├── entries
       │   ├── _entry.html.erb
       │   ├── _form.html.erb
       │   └── index.html.erb
       ├── layouts
       │   └── application.html.erb
       └── statistics
           └── index.html.erb
No voy a discutir el modelo Usuario ya que no es nada fuera de lo común, dado que lo estamos usando con Devise para implementar autenticación.
En lo referente al modelo Entrada, contiene la lógica de negocios para nuestra aplicación.
Cada Entrada pertenece a un Usuario.
Validamos la presencia de los siguientes atributos para cada entrada distanciaperíodode_tiempofecha_hora y estatus.
Cada vez que creamos una entrada, comparamos la velocidad promedio del usuario con el promedio de todos los usuarios en el sistema, y le notificamos al usuario vía SMS, usando Nexmo(no discutiremos como se usa la biblioteca de Nexmo, aunque quería demostrar un caso en el que usamos una biblioteca externa).
Nota que la Entrada modelo contiene más que la lógica de negocio sola. También maneja algunas validaciones y llamados.
La entries_controller.rb tiene las acciones CRUD principales (aunque sin actualización). EntriesController#index obtiene las entradas para el usuario actual y ordena los records por fecha de creación, mientras que EntriesController#create crea una nueva entrada. No hay necesidad de discutir lo obvio ni las responsabilidades de EntriesController#destroy :
Mientras que statistics_controller.rb es responsable de calcular el informe semanal, StatisticsController#index obtiene las entradas para el usuario conectado y los agrupa por semana, empleando el método #group_by el cual se encuentra en la clase Enumerable en Rails. Luego, intenta decorar los resultados al usar algunos métodos privados.
No discutimos mucho las vistas aquí ya que el código fuente se explica así mismo.
Debajo se encuentra la vista para enlistar las entradas para el usuario conectado (index.html.erb). Este es el patrón que se usará para mostrar los resultados de la acción índice (método) en el controlador de entradas:
Nota que estamos usando render @entries parciales, para llevar el código compartido a un patrón parcial _entry.html.erb para que así podamos mantener nuestro código DRY y reusable:
Lo mismo se aplica a una _forma parcial. En vez de usar el mismo código con (nuevas y editadas) acciones, creamos una forma parcial reusable:
En lo que concierne a la vista de la página de informe semanal, statistics/index.html.erb muestra algunas estadísticas, e informa sobre las actividades semanales del usuario al agrupar algunas entradas:
Y finalmente, el helper para las entradas, entries_helper.rb, incluye dos helpers readable_time_period y readable_speed los cuales deberían hacer los atributos más fáciles de leer:
Nada muy complicado hasta ahora.
La mayoría de ustedes pueden argumentar que refactorizar esto va en contra del principio KISS y hará el sistema más complicado.
¿Entonces, esta aplicación, de verdad, necesita ser refactorizada?
Absolutamente no, pero lo consideraremos solo con el propósito de muestra.
Después de todo, si observas la siguiente sección y las características que indican que una aplicación necesita refactorización, se vuelve obvio que la aplicación en nuestro ejemplo, no es una candidata válida para refactorización.

El Ciclo De La Vida

Empecemos por explicar el patrón de estructura MVC en Rails.
Usualmente comienza por el buscador al hacer una petición como https://www.toptal.com/jogging/show/1.
El servidor web recibe la petición y usa rutas para definir qué controlador usar.
Los controladores hacen el trabajo de analizar las peticiones de usuarios, entregas de data, cookies, sesiones, etc., y luego pide al modelo que obtenga la data.
Los modelos son clases Ruby que le hablan a la base de datos, guardan y validan la data, ejecutan la lógica de negocio y hacen el trabajo pesado. Las vistas son lo que el usuario puede ver: HTML, CSS, XML, Javascript, JSON.
Si queremos mostrar la secuencia de una petición de ciclo de vida Rails, se vería como esto:
Rails decoupling MVC life cycle
Lo que quiero conseguir es agregar más abstracción, usando POROs y hacer el patrón algo similar a lo siguiente, para las acciones create/update:
Rails diagram create form
Y algo similar a esto para las acciones list/show :
Rails diagram list query
Al agregar abstracciones POROs estamos asegurando una separación completa, entre responsabilidades SRP, algo que Rails no domina totalmente.

Directrices

Para alcanzar el nuevo diseño, usaré las directrices que se ven abajo, pero ten en cuenta que éstas no son reglas que debes seguir al pie de la letra. Piensa que son directrices flexibles que hacen refactorizar más fácil.
  • Los modelos ActiveRecord pueden contener asociaciones y constantes, pero nada más. Eso significa que no habrá llamados (usa objetos de servicio y agrega los llamados ahí) y sin validaciones (usa Form objects para incluir nombres y validaciones para el modelo).
  • Mantén a los Controladores como capas delgadas y siempre llama a objetos de Servicio. Algunos de ustedes se preguntarán ¿por qué usar controladores, si queremos seguir llamando objetos de servicio para contener la lógica? Bueno, los controladores son un buen lugar para tener el routing HTTP, análisis de parámetros, autenticación, negociación de contenidos, llamar al servicio correcto u objeto editor, atrapar excepciones, formato de respuestas y regresar el estado de código HTTP correcto.
  • Los servicios deberían llamar objetos Query, y no almacenar estado. Usa métodos de instancia no de clase. Deben haber muy pocos métodos públicos guardados con SRP.
  • Queries deberían hacerse con objetos query. Los métodos de objeto Query deben regresar un objeto, un hash o array, pero no una asociación ActiveRecord.
  • Evita usar Helpers, mejor usa decoradores. ¿Por qué? Una dificultad común con helpers en Rails, es que se pueden convertir en un montón de funciones no-OO, las cuales comparten un nombre de espacio y se sobreponen entre ellas. Pero es mucho peor, el hecho no de que no se puede usar ningún polimorfismo con los helpers de Rails — al proveer diferentes implementaciones para diferentes contextos o tipos, y superación o sub-clasificación de helpers. Pienso que las clases de helper en Rails deberían usarse, generalmente, para métodos de utilidad, no para casos de uso específico; como formatear atributos modelo para cualquier lógica de presentación. Mantenlos ligeros y fáciles de seguir. Decoradores/Delegantes mejor.** ¿Por qué? Después de todo, las preocupaciones parecen ser parte de Rails, y pueden secar (DRY up) un código cuando se comparte entre múltiples modelos. Sin embargo, el problema mayor es que las preocupaciones no hacen al objeto modelo más cohesivo. Solo que el código está mejor organizado. En otras palabras, no hay un cambio real al API del modelo.
  • Intenta extraer Objetos de Valor de los modelos para mantener tu código más limpio y agrupar atributos relacionados.
  • Siempre pasa una variable de instancia por cada vista.

Refactorizar

Antes de empezar quiero discutir algo más. Cuando se comienza la refactorización, usualmente terminas preguntándote: “¿Es una buena refactorización?”
Si sientes que estás haciendo más separación o aislamientos entre responsabilidades (aunque eso signifique agregar más código y nuevos archivos) entonces, esto es algo bueno. Después de todo, separar una aplicación es una muy buena práctica y hace más fácil, para nosotros, hacer una prueba de unidad apropiada.
No voy a discutir cosas, como mover lógica desde los controladores a los modelos, ya que supongo que a estás haciendo eso y te sientes cómodo usando Rails (usualmente Controlador Flaca y modelo FAT).
Con el propósito de mantener este artículo conciso, no voy a discutir cómo hacer pruebas pero esto no significa que tú no deberías hacer pruebas.
Por el contrario, deberías empezar siempre con una prueba para asegurarte de que las cosas van bien, antes de avanzar. Esto es algo obligatorio, en especial cuando se hace refactorización.
Luego podemos implementar cambios y asegurarnos de que las pruebas pasen por las partes relevantes del código.

Extraer Objetos De Valor

Primero, ¿qué es un objeto de valor?
Martin Fowler explica:
Objeto de Valor es un objeto pequeño, como un objeto de dinero o rango de fechas. Su característica clave es que siguen semánticas de valor, en vez de semánticas referenciales.
En ocasiones, te puedes encontrar con una situación donde un concepto merece su propia abstracción y donde la igualdad de ésta no se basa en valores, sino en la identidad. Ejemplos de esto pueden ser: Ruby’s Date, URI y Pathname. La extracción de un objeto de valor (o modelo de dominio) es una gran conveniencia.
¿Para qué molestarse?
Una de las grandes ventajas de un objeto de valor, es que ayudan a obtener una expresividad en tu código. Tu código tendrá una tendencia a ser más claro, o al menos puede serlo si tienes buenas prácticas en cuanto a nombres. Ya que el Objeto de Valor es una abstracción, lleva a códigos más claros y menos errores.
Otra ganancia es la inmutabilidad. La inmutabilidad de objetos es muy importante. Cuando estamos almacenando ciertos sets de data, lo cual puede ser usado en un objeto de valor, usualmente no me gusta que la data sea manipulada.
¿Cuándo es esto útil?
No existe la respuesta perfecta a esta pregunta. Haz lo que sea más conveniente para ti y lo que tenga más sentido en una situación dada.
Más allá de esto, hay algunas directrices que uso para ayudarme a tomar esa decisión.
Si crees que un grupo de métodos está relacionado, bueno, con objetos de valor es más caro. Esta expresividad significa que un objeto de valor, debería representar un set de data distintivo, lo cual puede ser deducido por tu desarrollador promedio solo con ver el nombre del objeto.
¿Cómo se hace esto?
Los Objetos de Valor deberían seguir ciertas reglas:
  • Los Objetos de Valor deberían tener múltiples atributos.
  • Los atributos deberían ser inmutables, a través del ciclo de vida del objeto.
  • La igualdad es determinada por los atributos del objeto.
En nuestro ejemplo, crearé un objeto de valor EntryStatus, para abstraer los atributos Entry#status_weather y Entry#status_landform a su propia clase, lo cual se ve de esta manera:
Nota: Esto es solo un PORO (Plain Old Ruby Object), no se hereda de ActiveRecord::Base. Hemos definido métodos de lector para nuestros atributos y estamos asignándolos al inicio. También, usamos una mezcla comparable, para equiparar objetos usando el método (<=>).
Podemos modificar el modelo Entry para usar el objeto de valor que hemos creado:
También podemos modificar el método EntryController#create para usar el nuevo objeto de valor en concordancia:

Extrae Objetos de Servicio

¿Qué es un objeto de Servicio?
El trabajo de un objeto de Servicio es mantener el código durante un espacio particular de la lógica de negocio. A diferencia del estilo “modelo fat”, donde un número pequeño de objetos contienen muchos, muchos métodos, para toda la lógica necesaria, usando objetos de servicio da como resultado muchas clases, cada una de éstas sirviendo un propósito único.
¿Por qué? ¿Cuáles son los beneficios?
  • Separar. Los Objetos de Servicio te ayudan a conseguir más aislaciones entre los objetos.
  • Visibilidad. Los Objetos de Servicio (Si están bien nombrados) muestran lo que hace una aplicación. Puedo pasar la mirada por el directorio de servicios, para ver que capacidades provee una aplicación.
  • Limpia modelos y controladores. Los controladores encienden la petición (params, sesión, cookies) en los argumentos, los pasa al servicio y los redirige o deja dependiendo de la respuesta del servicio. Mientras los modelos solo tratan con asociaciones y persistencia. Extraer código de los controladores/modelos hacia objetos de servicio apoyaría a SRP y separaría más el código. La responsabilidad del modelo sería solo tener que lidiar con asociaciones y guardar/eliminar registros, mientras el objeto de Servicio tendría una sola responsabilidad (SRP). Esto lleva a un mejor diseño y mejores unidades de prueba.
  • DRY y Acepta el cambio. Yo mantengo objetos de servicio lo más simple y pequeños posible. Yo compongo objetos de servicio con otros objetos de servicio, y los reúso.
  • Limpia y acelera tu suite de pruebas. Los servicios son fáciles y rápidos de probar, ya que son objetos Ruby pequeños con un punto de entrada (el método llamada). Los servicios complejos se componen con otros servicios, así que puedes separar tus pruebas fácilmente. También, usar objetos de servicio hace más fácil recuperar objetos relacionados sin necesidad de cargar el ambiente completo de rails.
  • Rescatable desde cualquier parte. Los objetos de servicio serán llamados, seguramente, desde los controladores al igual que desde objetos de servicio, DelayedJob / Rescue / Sidekiq Jobs, Rake tasks, consola, etc.
Por otro lado, nada es perfecto. Una desventaja de los objetos de Servicio es que pueden ser un exceso para cada pequeña acción. En estos casos, puedes terminar complicando y no simplificando tu código.
¿Cuándo deberías extraer Objetos de Servicio?
Aquí tampoco hay una regla fija.
Normalmente, los objetos de Servicio son mejores para sistemas de medianos a grandes: aquellos con una cantidad decente de lógica, más allá de las operaciones CRUD estándares.
Así que cuando pienses que un trozo del código no pertenece en el directorio, en el lugar donde lo ibas a agregar, es buena idea reconsiderarlo y ver si sería mejor que fuese a un objeto de servicio.
Aquí están algunos indicadores de cuándo usar objetos de Servicio:
  • La acción es compleja.
  • La acción alcanza múltiples modelos.
  • La acción interactúa con un servicio externo.
  • La acción no es una preocupación primordial del modelo subrayado.
  • Hay múltiples maneras de realizar la acción.
¿Cómo debes diseñar Objetos de Servicio?
Diseñar la clase para un objeto de servicio es relativamente directo, ya que no necesitas gems especiales, tampoco debes aprender un DLS nuevo, pero si puedes, más o menos, confiar en las habilidades de diseño software que ya posees.
Usualmente, utilizo las siguientes directrices y convenciones para diseñar el objeto de servicio:
  • No almacenes el estado del objeto.
  • Usa métodos de instancia, no métodos de clase.
  • Debe haber muy pocos métodos públicos (preferiblemente uno que apoye *SRP.
  • Los métodos deben regresar resultados de objeto ricos, no booleanos.
  • Los servicios van debajo del directorio app/services . Te aconsejo que uses subdirectorios, para dominios lógicas de negocio fuertes. Por ejemplo, el archivo app/services/report/generate_weekly.rb definirá Report::GenerateWeekly mientras que app/services/report/publish_monthly.rb definirá Report::PublishMonthly.
  • Los servicios comienzan con un verbo (y no terminan en servicio): ApproveTransactionSendTestNewsletterImportUsersFromCsv.
  • Los servicios responden al método llamada. Me di cuenta que usar otro verbo lo hace un poco redundante: ApproveTransaction.approve() no se lee bien. También, el método llamada, es el método de facto de lambdaprocs, y objetos de método.
Si observas StatisticsController#index, notarás un grupo de métodos (weeks_to_date_fromweeks_to_date_toavg_distance, etc.) agrupados al controlador. Eso no es bueno. Considera las ramificaciones, si quieres generar el informe semanal fuera de statistics_controller.
En nuestro caso, vamos a crear Report::GenerateWeekly y extraigamos el informe de lógica de StatisticsController:
Así que StatisticsController#index ahora se ve más limpio:
Al aplicar el patrón del objeto de Servicio, agrupamos código alrededor de una acción compleja y específica y promovemos la creación de métodos pequeños y más claros.
Tarea: considera usar Objeto de Valor para el WeeklyReport en vez de Struct.
Like what you're reading?
Get the latest updates first.
No spam. Just great engineering and design posts.

Extrae Objetos Query De Los Controladores

¿Qué es un Objeto Query?
Un objeto Query es un PORO, el cual representa una base de datos de consulta. Puede ser reusada en diferentes lugares de la aplicación, mientras que, al mismo tiempo, esconde la lógica de consulta. También provee una buena unidad aislada para pruebas.
Deberías extraer consultas SQL/NoSQL complejas hacia sus propias clases.
Cada objeto Query es responsable de regresar un set de resultados basado en las reglas de criterio/negocio.
En este ejemplo, no tenemos ninguna consulta (query) compleja, así que usar objeto Query no sería eficiente. Sin embargo, con el fin de demostrar, extraeremos la consulta en Report::GenerateWeekly#call y crearemos generate_entries_query.rb:
Y en Report::GenerateWeekly#call, reemplacemos:
 def call
   @user.entries.group_by(&:week).map do |week, entries|
     WeeklyReport.new(
      ...
     )
   end
 end
con:
 def call
   weekly_grouped_entries = GroupEntriesQuery.new(@user).call

   weekly_grouped_entries.map do |week, entries|
     WeeklyReport.new(
      ...
     )
   end
 end
El patrón de objeto query (consulta) ayuda a mantener la lógica de tu modelo estrictamente relacionada a un comportamiento de clase, mientras que mantiene tus controladores flacas. Debido a que no son más que plain old Ruby classes, los objetos query no necesitan heredar de ActiveRecord::Base, y deberían ser responsables por nada más que la ejecución de consultas.

Extrae Crear Entrada A Un Objeto de Servicio

Ahora, vamos a extraer la lógica de crear una nueva entrada a un nuevo objeto de servicio. Vamos a usar la convención y creemos CreateEntry:
Y ahora nuestro EntriesController#create es de la siguiente manera:
 def create
   begin
     CreateEntry.new(current_user, entry_params).call
     flash[:notice] = 'Entry was successfully created.'
   rescue Exception => e
     flash[:error] = e.message
   end

   redirect_to root_path
 end

Más Validaciones A Un Objeto De Forma

Ahora las cosas comienzan a ponerse más interesantes.
Recuerda que en nuestras directrices acordamos que queríamos que los modelos tuvieran asociaciones y constantes, pero nada más (ni validaciones ni llamados). Así que empecemos por remover los llamados y usa un objeto de Forma en su lugar.
Un objeto de Forma es un PORO (Plain Old Ruby Object). Toma el mando del controlador/objeto de servicio cuando necesite hablar con la base de datos.
¿Por qué usar objetos de Forma?
Cuando necesites refactorizar tu aplicación, siempre es buena idea tener en mente, la responsabilidad única principal (SRP).
SRP te ayuda a tomar mejores decisiones de diseño, en cuanto a la responsabilidad que debe tener una clase.
Tu modelo de mesa de base de datos (un modelo ActiveRecord en el contexto de Rails), por ejemplo, representa un record de la base de datos único en código, así que no hay razón para que esté preocupado con nada que haga tu usuario.
Aquí es donde entra el objeto de Forma.
Un objeto de Forma es responsable de representar una forma en tu aplicación. Así que cada campo de entrada puede ser tratado como un atributo en la clase. Puede validar que esos atributos cumplen algunas reglas de validación, y puede pasar la data “limpia” a donde debe ir (ej., tu modelo de base de datos o tal vez tu constructor de búsqueda de consultas).
¿Cuándo deberías usar un objeto de Forma?
  • Cuando quieras extraer las validaciones de los modelos Rails.
  • Cuando múltiples modelos pueden ser actualizados por una sola forma de entrega, deberías crear un objeto de Forma.
Esto te permite poner toda la lógica de forma (nombrar convenciones, validaciones, y otros) en un solo lugar.
¿Cómo crear un objeto de Forma?
  • Crea una clase simple Ruby.
  • Incluye ActiveModel::Model (en Rails 3, tienes que incluir Nombre, Conversión y Validación, en su lugar).
  • Empieza a usar tu nueva clase de forma, como si fuera un modelo regular de ActiveRecord, donde la mayor diferencia es que no puedes continuar con la data almacenada en este objeto.
Por favor, ten en cuenta que puedes usar la gem reform, pero siguiendo con PORO, crearemos entry_form.rb lo cual se ve así:
Y modificaremos CreateEntry para comenzar a usar el objeto de Formato EntryForm:
     class CreateEntry
      
      ......
      ......

       def call
         @entry_form = ::EntryForm.new(@params)

         if @entry_form.valid?
            ....
         else
            ....
         end
       end
     end
Nota: Algunos de ustedes dirán que no hay necesidad de acceder al objeto de Forma desde el objeto de Servicio y que podemos llamar al objeto de Forma directamente desde el controlador, lo cual es un argumento válido. Sin embargo, preferiría tener un flujo claro, por eso siempre llamo al objeto de Forma desde objeto de Servicio.

Mueve los Llamados al Objeto de Servicio.

Como acordamos anteriormente, no queremos que nuestros modelos contengan validaciones y llamados. Extrajimos las validaciones usando objetos de Forma. Pero todavía estamos usando algunos llamados (after_create en modelo Entry compare_speed_and_notify_user).
¿Por qué queremos remover los llamados de los modelos?
Desarrolladores Rails usualmente comienzan a notar un dolor con los llamados, durante las pruebas. Si no estás haciendo pruebas con tus modelos ActiveRecord, comenzarás a notar el dolor después, mientras crece tu aplicación y mientras se necesite más lógica para llamar o evitar los llamados.
después_* los llamados son usados primordialmente en relación a guardar o continuar con el objeto.
Una vez que el objeto es guardado, el propósito (ej. responsabilidad) del objeto ha sido cumplido. Así que, si todavía vemos llamados siendo invocados, después de que el objeto ha sido guardado, estos probablemente son llamados que buscan salir del área de responsabilidad de objetos, y ahí es cuando encontramos problemas.
En nuestro caso, estamos enviando un SMS al usuario, lo que no está relacionado con el dominio de Entrada.
Una manera simple de resolver el problema es, mover el llamado al objeto de servicio relacionado. Después de todo, enviar un SMS para el usuario correspondiente está relacionado al Objeto de Servicio CreateEntry y no al modelo Entrada, como tal.
Al hacer esto, ya no tenemos que apagar, el método compare_speed_and_notify_user en nuestras pruebas. Hemos hecho que esto sea un asunto sencillo, el crear una entrada sin que sea necesario enviar un SMS y estamos siguiendo un buen diseño de Objeto Orientado, al asegurarnos de que nuestras clases tengan una responsabilidad única (SRP).
Así que ahora CreateEntry es algo similar a esto:

Usa Decoradores En Vez De Helpers

Aunque podemos fácilmente usar la colección Draper de modelos de vista y decoradores, me quedo con PORO, por este artículo, como lo he estado haciendo hasta ahora.
Lo que necesito es una clase que llame métodos al objeto decorado.
Puedo usar method_missing para implementar eso, pero usaré la biblioteca estándar de Ruby, SimpleDelegator. El siguiente código muestra cómo usar SimpleDelegator para implementar nuestro decorador base:
   % app/decorators/base_decorator.rb
   require 'delegate'

   class BaseDecorator < SimpleDelegator
     def initialize(base, view_context)
       super(base)
       @object = base
       @view_context = view_context
     end

     private

     def self.decorates(name)
       define_method(name) do
         @object
       end
     end

     def _h
       @view_context
     end
   end
¿Por qué el método _h?
Este método actúa como un proxy para contexto de vista. Por defecto, el contexto de vista es una instancia de una clase vista, siendo ésta ActionView::Base. Puedes acceder a los helpers de vistas de la siguiente manera:
   _h.content_tag :div, 'my-div', class: 'my-class'
Para hacerlo más conveniente agregamos un método decorado a ApplicationHelper:
   module ApplicationHelper

     # .....

     def decorate(object, klass = nil)
       klass ||= "#{object.class}Decorator".constantize
       decorator = klass.new(object, self)
       yield decorator if block_given?
       decorator
     end

     # .....

   end
Ahora, podemos mover los helpers EntriesHelper a los decoradores:
   # app/decorators/entry_decorator.rb
   class EntryDecorator < BaseDecorator
     decorates :entry

     def readable_time_period
       mins = entry.time_period
       return Time.at(60 * mins).utc.strftime('%M Mins').html_safe if mins < 60
       Time.at(60 * mins).utc.strftime('%H Hour %M Mins').html_safe
     end

     def readable_speed
       "#{sprintf('%0.2f', entry.speed)} Km/H".html_safe
     end
   end
Y podemos usar readable_time_period y readable_speed de la siguiente forma:
   # app/views/entries/_entry.html.erb
   -  <%= readable_speed(entry) %> </td>
   +  

<%= decorate(entry).readable_speed %> 

>
   -  <%= readable_time_period(entry) %></td>
   +  

<%= decorate(entry).readable_time_period %>

>

Estructura Después De Refactorizar

Terminamos con más archivos, pero eso no es necesariamente algo malo (y recuerda esto, desde el comienzo, estábamos conscientes de que este ejemplo era con fines demostrativos y no era necesariamente un buen caso de uso para refactorización):
   app
   ├── assets
   │   └── ...
   ├── controllers
   │   ├── application_controller.rb
   │   ├── entries_controller.rb
   │   └── statistics_controller.rb
   ├── decorators
   │   ├── base_decorator.rb
   │   └── entry_decorator.rb
   ├── forms
   │   └── entry_form.rb
   ├── helpers
   │   └── application_helper.rb
   ├── mailers
   ├── models
   │   ├── entry.rb
   │   ├── entry_status.rb
   │   └── user.rb
   ├── queries
   │   └── group_entries_query.rb
   ├── services
   │   ├── create_entry.rb
   │   └── report
   │       └── generate_weekly.rb
   └── views
       ├── devise
       │   └── ..
       ├── entries
       │   ├── _entry.html.erb
       │   ├── _form.html.erb
       │   └── index.html.erb
       ├── layouts
       │   └── application.html.erb
       └── statistics
           └── index.html.erb

Conclusión

Aunque nos enfocamos en Rails en este blog post, RoR (Ruby on Rails) no es una dependencia de los objetos de servicio ni de otros POROs. Puedes usar este enfoque con cualquier framework web, móvil o aplicación de consola.
Al usar MVC como arquitectura, todo se mantiene junto y te hace ir más lento porque la mayoría de los cambios tienen un impacto en otras partes de la aplicación. También te obliga a pensar donde poner algunas lógicas de negocio – ¿debería ir en el modelo, el controlador o la vista?
Al usar un simple PORO, hemos movido la lógica de negocio a los modelos o servicios, que no heredan de ActiveRecord, lo cual ya es una ganancia, sin mencionar que tenemos un código más claro, lo cual apoya SRP y pruebas de unidades más rápidas.
Una arquitectura limpia intenta poner las casillas de uso en el centro/parte superior de tu estructura para que veas fácilmente lo que hace tu aplicación. También facilita la adopción de cambios, porque es más modular y aislado. Espero haber demostrado como al Plain Old Ruby Objects y más abstracciones, separa preocupaciones, simplifica pruebas y ayuda a producir código limpio y fácil de mantener.
Saludos.
Ing. Alex Taya

sábado, diciembre 31, 2016

La Guerra Fría de la Tecnología: Aún Aquí y Aún Siendo Utilizada

La Guerra Fría de la Tecnología: Aún Aquí y Aún Siendo Utilizada
BY NERMIN HAJDARBEGOVIC - TECHNICAL EDITOR @ TOPTAL #ColdWar #ColdWarTech #CyberCrime #CyberWarfare #Technology This article was originally written in English

Soy un chico de la Guerra Fría. Crecí viendo las noticias de las implementaciones Europeas de Pershing II y SS-20, también de la guerra soviética en Afganistán, con un poco de acción de Terminator y Top Gun VHS. Yugoslavia estaba intentando jugar para ambos lados, y durante un tiempo funcionó a la perfección. Sin embargo, todo se estrelló un par de años después con la caída del Muro de Berlín, haciendo que nuestra destreza se alineara sin sentido.
Admito que esta es una extraña introducción para un blog de tecnología, pero tengan paciencia conmigo, empezará a tener sentido. A diferencia de la mayoría de los europeos, hemos tenido muy buenas relaciones con ambos bloques. Hemos vendido tanques a Kuwait y artillería de cohetes a Saddam, compramos combustible barato y MiGs de los Soviéticos y, a cambio, hemos exportado algunas cosas que no podíamos obtener directamente desde el Oeste. Sé de gente que se hospedó en hoteles de Berlín Oriental porque eran más baratos, luego cruzaban la frontera a Berlín Occidental para trabajar, jugar y comprar, sólo para cruzar de nuevo a través lugares imprácticos como el Checkpoint Charlie, todo en cuestión de horas.
En uno de estos viajes, mi papá me consiguió un Commodore C64, el cual fue lanzado como maquinaria de la Guerra Fría. La mayoría de los videojuegos de la década de 1980 y, de hecho, un montón de música y películas, fueron inspirados por incontables guerras y la amenaza de un apocalipsis nuclear. Con la caída del muro, mucha gente supuso que sería el final del caos, en especial en el gasto en defensa y que por ende el mundo sería un lugar más seguro. No fue exactamente de esta manera, ¿o si?
Sin embargo, el efecto a largo plazo de la Guerra Fría en ciencia y tecnología es más profundo que el Nena 99 Luftbalons, o que el Oliver Stone Vietnam flick.

Minuteman: Un Caso de Estudio Técnico de la Guerra Fría

Si estás leyendo esto, entonces estarás utilizando una tecnología desarrollada por guerreros de la guerra fría: El Internet. Eso no es todo. Un montón de la infraestructura y de la tecnología que nosotros damos por sentado fue desarrollada, o al menos concebida, durante estos decenios tumultuosos.
¿La constelación de satélites GPS orbita alrededor de la tierra? No fue puesto allí para geoetiquetar selfies u obtener un Uber ride; fue diseñado para ayudar a que el Comando Aéreo Estratégico de Estados Unidos entregara cientos de megatones v por valor de sol instantáneo sobre objetivos Soviéticos con una precisión milimétrica. ¿Circuitos integrados, transistores, y computación de estado sólido? Afirmativo, todas desarrollados por las fuerzas armadas y pagados por los contribuyentes estadounidenses.
Aquí hay un ejemplo de lo anterior: el elegante e inigualablemente mortal LGM-30 Minuteman de misiles balísticos intercontinentales (ICBM). No fue el primer ICBM ahí fuera, pero cuando apareció en el mercado, fue revolucionario. Fue un misil de combustible sólido, lo que significa que pudo responder a una amenaza y el lanzarse en un minuto sin tener que ser alimentado; por esto se le llamó así. Pero el combustible sólido es sólo parte de la historia: el combustible sólido era mucho más interesante desde un punto de vista geek. Antes de Minuteman, ICBMs dependió en computadoras análogas, giroscopios y sensores mecánicos primitivos. Desde que estos fueron transferidos a un objetivo específico, el paquete de destino no se puede cambiar fácilmente. El Minuteman fue la primera implementación masiva de una computadora digital de propósito general; un piloto automático integrado y sistema guiado de misiles en un solo paquete, con un almacenamiento fiable y que podría tener el estrés de un silo de lanzamiento. El equipo también fue capaz de almacenar varios destinos, y era reprogramable.
Los transistores no eran nada nuevo en ese punto; fueron desarrolladas años antes por los laboratorios Bell. Sí, estos primitivos transistores eran casi exclusivamente reservados para el complejo militar-industrial. El tío Sam era el único cliente de prácticamente todas las primeras computadoras y chips, quemando montones de dinero. Estos primeros transistores ofrecieron un salto cuántico a través de tubos de vacío, pero no eran perfectos. Para los estándares de hoy, eran una basura. La fiabilidad simplemente no estaba allí, y si necesitas lanzar unos cuantos cientos de ojivas termonucleares a medio camino a través del planeta, necesitas una especie de sistema guiado el cual que no podría fallar, tan pronto como la vela se encendía.
Entonces, ¿qué puedes hacer cuando te encuentras con un problema técnico, el cual no se puede resolver con dinero? Simple: tirar más dinero en ello, y eso es exactamente lo que hizo la Fuerza Aérea de los Estados Unidos. Quemaron a millones para hacer la maldita cosa lo suficientemente fiable como para ser utilizado en entornos hostiles y sobrevivir el estrés de un alto-G que asciende hacia el espacio. Esto se conoce como el programa Minuteman de Alta Fiabilidad (Hi-Rel).
El primer ordenador digital móvil de verdad fue algo más letal que el ordenador portátil y el iPhone.
El primer ordenador digital móvil de verdad fue algo más letal que el ordenador portátil y el iPhone.
Funcionó, pero la USAF tuvo un poco más de lo que se esperó. En tratar de mejorar un sistema de armas sola, la USAF terminó dando un gran impulso a la industria de la tecnología en general. Finalmente, el Minuteman se ha actualizado para incluir un nuevo sistema de referencia basado en microchip, con una forma primitiva de almacenamiento de estado sólido. Esta reliquia de la Guerra Fría ha estado en servicio desde la administración Kennedy, y la encarnación actual ha sido de alrededor de 45 años, recibiendo múltiples actualizaciones de hardware y software en los últimos años.
Por lo tanto, al esbozar el desarrollo y la evolución de un sistema de una sola entrega de arma estratégica single, me he referido a una serie de tecnologías vitales que damos por sentado: transistores, chips, fiables de almacenamiento de estado sólido, ordenadores programables fabricados en serie y así sucesivamente. El Minuteman fue también la primera computadora mobile digital.
Algunos pueden argumentar que el legado de este tipo de armas es aquel de Destrucción Mutua Asegurada (MAD), garantizado por la tríada nuclear que mantiene a las superpotencias en ir a la guerra total. Probablemente lo hizo, pero al hacerlo, también permitió a los ingenieros de todo el mundo desarrollarán tecnologías y conceptos aplicables en diversas industrias y campos de estudio.
Su verdadero legado radica en cada circuito integrado en el planeta.

Pioneros Capitalistas Tratan de Aprovecharse

¿Qué podría ser más capitalista que monetizar los instrumentos de destrucción masiva? ¡Los contribuyentes pagan para su desarrollo, no los capitalistas de riesgo!
Bromeando aparte, se puede argumentar que el Red Scare de los años cincuenta creó Silicon Valley. La mayor parte del dinero en realidad provenía de los contribuyentes y la mayoría de las empresas ganadoras de contratos lucrativos de defensa no tardaron en hacer una pelota en la tecnología de doble uso desarrollado para los militares. ¿Recuerdas a los Laboratorios Bell? Algunos de sus personas más brillantes pasaron a co-fundar Fairchild Semiconductor y, finalmente, crearon Intel una década más tarde. El equipo de orientación Minuteman actualizado se basa en chips de otro gigante de los semiconductores, Texas Instruments.
No discuto la inteligencia de las personas co-fundadoras de Intel por ejemplo, como Robert Noyce y Gordon Moore. No tengo ninguna duda de que hubieran dejado su huella en la industria de la tecnología, inclusive sin la carrera más grande de los brazos en la historia, pero también es difícil negar que la industria de la tecnología no se habría desarrollado casi al mismo ritmo si no hubiera existido la financiación del gobierno. Sí, los contribuyentes subsidian efectivamente la industria de la tecnología desde hace décadas, pero al largo plazo, esto es probablemente mejor. Westinghouse no necesitaba subsidios para desarrollar lavadoras y refrigeradores, porque la demanda de los consumidores era fuerte, pero en los primeros días de la informática, no había prácticamente ninguna demanda de los consumidores. Es por eso que los gobiernos tuvieron que intervenir.
¿Pero qué consiguió el contribuyente?
El Internet, GPS, transistores y chips fiables:. Guerra Fría tecnología hecha posible por el gasto de defensa fuera de control.
El Internet, GPS, transistores y chips fiables:. Guerra Fría tecnología hecha posible por el gasto de defensa fuera de control.
El espacio y la competencia dio lugar a una serie de tecnologías que a su vez crearon un sinfín de oportunidades de negocio. Inclusive los ordenadores primitivos tuvieron un profundo impacto en la industria. Hicieron las redes de energía y la infraestructura de transporte más eficientes, ayudaron a mejorar la seguridad de las instalaciones industriales, incluyendo los químicos sensibles e instalaciones nucleares, cambiaron la faz de la banca, comunicaciones, entretenimiento y así sucesivamente.
Lo mejor de todo es que de alguna manera logramos no soplarnos a nosotros mismos con las armas estas tecnologías han hecho posible, sin embargo, al mismo tiempo, se volvieron espadas en rejas de arado. Ya en los años cincuenta, los EE.UU. y la Unión Soviética pusieron en marcha iniciativas destinadas a examinar usos civiles de la energía nuclear (incluidos los planes de explosivos nucleares de ingeniería civil, que fueron terribles), pero no significaba nada. No era la fuerza del átomo que cambió el mundo; fue el humilde microchip y tecnologías auxiliares desarrolladas para programas de defensa innumerables, que lo hicieron.
Antes de que dejaron su marca en la ciencia y golpearon a Gary Kasparov en la mesa de ajedrez, superordenadores y sus predecesores analógicos se utilizaron para simular procesos físicos vitales en el desarrollo de armas termonucleares. Una ventaja pura en potencia de cálculo podría producir avances en innumerables campos. Las simulaciones por ordenador permitieron a las armadas Occidentales en desarrollar submarinos más silenciosos con tornillos nuevos; optimizados digitalmente para evitar la cavitación. Procesadores de Señal Digital (DSP) hicieron sonares mucho más sensibles, y un par de décadas más tarde, los DSP avanzados hicieron que la música sonará mejor. El diseño asistido por ordenador no se acabó de utilizar para reducir la sección transversal de radar de los aviones, sino que también hizo que nuestros edificios y automóviles fueran más baratos, más seguros y más eficientes.
Algunos de estos esfuerzos resultaron en un callejón sin salida tecnológica, pero la mayoría no lo hicieron. Uno de mis favoritos fue Blue Peacock, una mina nuclear británica (sí, las minas terrestres, no de bomba), con un peso de 7,2 toneladas. Ya que confió en la tecnología temprana de la década de 1950 y tuvo que ser enterrado en el campo Alemán, los ingenieros se dieron cuenta rápidamente de que el frío podría matar a los componentes electrónicos en el interior, por lo que trataron de encontrar la manera de mantener los circuitos calientes. Su solución era tan descabellada que fue confundida con una broma del Día de los Inocentes cuando el diseño fue desclasificado el primero de Abril del 2004.
Ningún pollo fue afectado en la elaboración de esta entrada del blog, o en el programa de minas nucleares Blue Peacock.
Ningún pollo fue afectado en la elaboración de esta entrada del blog, o en el programa de minas nucleares Blue Peacock.
Un pollo debía de ser sellado dentro de su carcasa, con suficiente comida y agua para mantenerse con vida durante una semana. Su calor corporal mantendría la bomba eléctrica en funcionamiento.
A medida que las industrias civiles empezaron a aplicar estas tecnologías de vanguardia en masa, nuestra calidad de vida y la productividad se disparó de manera exponencial. Nuestros televisores, automóviles, teléfonos, la ropa que usamos, y casi cualquier producto de consumo que compramos: Son todos mejor gracias a la mayor pérdida de dinero en la historia. Por supuesto, todos tenemos pequeñas cantidades de estroncio 90 en los huesos, pero a gran escala, es un pequeño precio a pagar por el mundo de alta tecnología que nos gusta tanto.
Oh, sí, también nos dieron los videojuegos. Montones y montones de juegos de video.
Like what you're reading?
Get the latest updates first.
No spam. Just great engineering and design posts.

Haciendo un Kickstarter Para el Desarrollo de Video Juegos

Los videojuegos fueron iniciados en los equipos digitales más tempranos (y algunos analógicos también). De hecho, Tennis para Dos, posiblemente el primer juego en utilizar una pantalla gráfica, fue desarrollado por un equipo analógico en 1958. Sin embargo, ni siquiera los villanos de Bond tenían computadoras en ese momento, por lo que el aumento de la industria de los videojuegos tuvo que esperar al hardware para madurar.
A mediados de la década de los setenta, los microchips se volvieron lo suficientemente baratos para aplicaciones del mercado de masas. Ahora que teníamos el hardware, ya sólo necesitábamos algunos desarrolladores de software y un caso de uso de chips baratos. Dado que el consumidor medio, no estaba interesado en los ordenadores caros y complicados que fueron diseñados para las grandes empresas, la atención se desplazó a los juegos; soportales, consolas de videojuegos y computadoras de bajo costo como el ZX y C64.
Estas humildes máquinas llevaron computadoras programables a millones de hogares, enganchando una generación de niños en el entretenimiento digital, y creando oportunidades para los desarrolladores de video juegos. Consolas y ordenadores baratos trajeron el arcade de la sala de estar, marcando el comienzo de una nueva era de juegos de vídeo, y la creación de innumerables puestos de trabajo en la industria. Incluso los Soviéticos lo consiguieron con el Tetris, uno de los primeros juegos.
El advenimiento de los ordenadores personales de bajo costo y consolas de juegos creó una generación enganchada en la informática y la codificación.
El advenimiento de los ordenadores personales de bajo costo y consolas de juegos creó una generación enganchada en la informática y la codificación.
No solo era un entertainmento. A diferencia de las consolas, el ZX y el C64 eran equipos adecuados, y los niños geeks rápidamente encontraron nuevos usos para ellos. Ellos comenzaron a hacer demostraciones, y empezaron la codificación. Lo más probable es que tu sabes mucho de estos niños, y si estás leyendo esto, es probable que trabajas con algunos de ellos.
Si estás interesado en el desarrollo de los primeros videojuegos, y lo que la Guerra Fría tuvo que ver con ellos, yo sugiero que consultes FrutaNuclear; un nuevo documental que es una visita obligada para los jugadores nacidos en las década de 1970 y principios de la década de 1980.
Estos chicos y chicas pasaron a desarrollar una nueva generación de juegos de vídeo, creando exitosos negocios en línea, creando nuevas tecnologías y revolucionando el mundo digital, todo en el espacio de una década. Una generación que creció con la constante amenaza de una guerra nuclear, disfrutando de la distópica ciencia ficción, la cual ayudó a hacer del mundo un lugar mejor. Ellos no desarrollaron Skynet, desarrollaron millones de aplicaciones móviles y web en su lugar.
Por lo tanto, no hay Terminators. Al menos no todavía.

2.0 Guerra Fría y el Surgimiento de Nuevas Amenazas

Este no es un blog geopolítico, pero si estás al tanto de las noticias, es probable que sepas que el mundo es un lugar desastroso. No, el final de la Guerra Fría no trajo una era de paz y estabilidad, y ya se habla de una “Segunda Guerra Fría”, o peor, una guerra “Caliente”. Mientras que la mayoría de estas preocupaciones no son más que exageraciones y sensacionalismo, una serie de graves amenazas permanecen. La amenaza de la aniquilación nuclear casi ha desaparecido, pero la tecnología que nos gusta tanto ha creado una serie de amenazas y posibles problemas, que van desde la privacidad y la seguridad, hasta las preocupaciones éticas.
Afortunadamente, no es probable que veamos una carrera de armamentos para competir con el que hemos presenciado en el siglo XX, pero no tenemos que hacerlo. La misma tecnología que nos hace la vida más fácil y más productiva también se puede utilizar en contra de nosotros. La infraestructura digital en la cual nos basamos en el trabajo y en el juego es frágil y puede ser objetivo de los criminales, gobiernos extranjeros, los agentes no estatales, e inclusive en nutjobs con resentimiento.
Estas nuevas amenazas incluyen, pero no se limitan a:
  • La ciberdelincuencia
  • Guerra cibernética patrocinada por el Estado
  • El mal uso de la tecnología de vehículos autónomos
  • Violaciones a la privacidad
  • Abusos de vigilancia de masas
  • El uso de comunicaciones seguras para las actividades criminales / terroristas
Todos representan un serio desafío y la industria está teniendo problemas para mantenerse. Mi argumento es simple: Nosotros ya no tenemos que desarrollar una tecnología innovadora para obtener una ventaja en las luchas geopolíticas, pero vamos a seguir desarrollando tecnologías y métodos para hacer frente a las nuevas amenazas y problemas. Es un círculo vicioso, ya que estas nuevas amenazas son posibles gracias a nuestra dependencia de las comunicaciones digitales y la amplia disponibilidad de diversas tecnologías que pueden ser empleadas por las organizaciones hostiles e individuales.
Una nueva generación de amenazas emergentes está reuniendo una vez más líderes de la industria y gobiernos en torno a una causa común
Una nueva generación de amenazas emergentes está reuniendo una vez más líderes de la industria y gobiernos en torno a una causa común.
La ciberdelincuencia se asocia generalmente con el robo de identidad y fraude de tarjetas de crédito, pero está ya no se limita a estos campos. El advenimiento de canales seguros de comunicación ha permitido a los delincuentes en expandirse a nuevos nichos. La escena ha recorrido un largo camino desde las hazañas románticas de Steve Wozniak. Algunos ofrecen la piratería de alquiler, otros están dispuestos a acoger todo tipo de contenido ilícito, sin hacer preguntas. Algunos grupos se especializan en el lavado de dinero, bazares de drogas darknet, y así sucesivamente. La amenaza más grande con esta nueva generación de la ciberdelincuencia es que ya no se tiene que poseer muchas habilidades para involucrarse. A medida que madura la delincuencia informática, distintos grupos se especializan en diferentes actividades, y se pueden contratar.
La guerra cibernética patrocinada por el Estado constituye una seria amenaza a la infraestructura, los sistemas financieros y la seguridad nacional. Sin embargo, no hay realmente mucho que un individuo puede hacer frente a estas amenazas, por lo que no vale la pena perder tiempo en ellos en este post. Otra forma de guerra económica parece privar a una nación o región de conexión a Internet. Ya ha sucedido antes, a veces por accidente, otras veces por decreto del gobierno y de la acción del enemigo.
Los drones comerciales no tienen mucho en común con sus homólogos militares. Su gama y su carga útil son muy limitadas, y mientras un drone militar no tripulado, por lo general se puede perder el tiempo en un área por horas en extremo, la resistencia de los drones no tripulados de aficionados se limita a minutos en lugar de horas. Esto no quiere decir que no se pueden utilizar para el crimen; aún pueden invadir la privacidad de alguien, contribuir al contrabando de drogas a través de una frontera, o inclusive en llevar explosivos. Los vehículos autónomos están todavía en su infancia, por lo que no sienten la necesidad de discutir la miríada de preguntas que elevarán.
La privacidad sigue siendo una de las mayores preocupaciones relacionadas con Internet, expresadas por la persona promedio. Esto es comprensible; hemos pasado gran parte de nuestras vidas diarias dedicándolas a la esfera digital, poniendo nuestra privacidad en riesgo. La gente ni siquiera tiene que estar orientada específicamente en tener su privacidad y su integridad personal comprometida. La mayoría de los datos que abren paso en línea se liberan en forma de depósitos masivos después de un fallo de seguridad que afecta a muchos, si no todos, los usuarios de un servicio de una línea en particular. La gente va a seguir exigiendo una mayor privacidad, ya su vez los clientes demandarán una mayor seguridad de los ingenieros de software (que no son trabajadores de milagro y no pueden garantizar la absoluta seguridad y privacidad).
La vigilancia masiva se realiza generalmente por los gobiernos y no debe representar una amenaza para el ciudadano medio o negocio. Sin embargo, sigue siendo una amenaza potencial, ya que puede ser objeto de abuso para los trabajadores descontentos, gobiernos extranjeros, o por medio de las violaciones de datos. El otro problema es el coste enorme para el contribuyente; la vigilancia masiva no es barata y vamos a seguir viendo más de ella.
La mayoría de los gobiernos no se molestan con los programas de vigilancia y de metadatos en masa si no se enfrentan a amenazas muy reales. La misma tecnología desarrollada para mantener nuestras comunicaciones y actividades en línea privada puede ser objeto de abuso por todo tipo de personas no nos gustaría encontrarnos en un callejón oscuro. La lista incluye a los sindicatos del crimen multinacional, terroristas e insurgentes. Sin embargo, no toda esta comunicación debe ser cifrada y segura. El punto de la propaganda es para que sea ampliamente disponible para cualquier persona, el Internet ha dado a cada chiflado un teléfono inteligente y el mayor megáfono en la historia, con un alcance global, de forma gratuita. Puedes utilizar el Internet para reunir un millón de personas en torno a una buena causa en cuestión de días, pero los mismos principios se pueden aplicar a una mala causa. Si el público objetivo son las personas que desean unirse a un culto de la muerte con una inclinación por banderas negras, no necesitas un millón de personas, sólo unas pocas docenas.

La diferencia Entre la Ciencia y la Ciencia Ficción

A pesar de su inteligencia, los autores de la ciencia ficción que ayudaron a configurar la cultura popular en el siglo XX no vieron el futuro real que viene. Ellos no previeron exactamente el Internet, por no hablar de su profundo impacto en la sociedad.
Sentimos estallar tu burbuja, pero Terminators en Inteligencia Artificial (IA) aún no son una amenaza, y no la serán en el corto plazo. Las amenazas reales son más humildes, pero eso no quiere decir que podamos darnos el lujo de ignorarlas. No es necesario un Terminator para crear el caos, todo lo que se necesita es un par de líneas de código realmente desagradables que puedan alterar la infraestructura, causando todo tipo de problemas. No es necesario un autómata super-inteligente del futuro para causar daños. Dado que eBay no lleva Terminators, ya que es mucho más fácil que usar un drone fuera de la plataforma, programado para entregar una carga útil con un objetivo específico: las drogas a un traficante, o una carga explosiva a un VIP.
Pero estas no son las mayores amenazas, son amenazas potenciales simples: algo para un guión de Hollywood, no para un blog de tecnología.
Las amenazas son reales criminales en naturaleza, pero tienden a permanecer en el cyber real. No tienes que mover físicamente nada para mover el dinero sucio y la información en línea. La aplicación de la ley ya está teniendo dificultades para mantenerse al día con los delitos informáticos, que parecen estar empeorando. Si bien es cierto que la tasa de criminalidad en los países desarrollados está disminuyendo, estas estadísticas no pintan el cuadro completo. Hace unas semanas, la Oficina Británica de Estadísticas Nacionales (ONS) informó de un aumento del doble de la tasa de criminalidad de Inglaterra y Gales, un total de más de 11.6 million ofensas. Además la tasa de criminalidad tradicional continuó cayendo, pero las estadísticas indicaban 5,1 millones de casos de fraude en línea. El costo de la delincuencia física está bajando, pero el costo de la delincuencia informática está empezando a ponerse al día. Creo firmemente que la industria tendrá que hacer más para reforzar la seguridad, y los gobiernos tendrán que invertir en seguridad en línea y la prevención del delito, así.
En caso de que estés interesado en la ficción distópica y no encuentras a las amenazas criminales emocionantes, otro desarrollo aterrador sería la monopolización de datos: Un proceso en el que gigantes de la industria mantendrían una ventaja de competencia posible gracias a su amplia base de usuarios, como para hacer a la demás competencia sin sentido, y anulándola de este modo.
Sí, soy consciente de lo que los Terminators harán para un futuro más intrigante y para un blog más interesante, pero no estamos allí todavía.

Saludos.

Configura mikrotik a través 2da. conexión de Internet


Archivos o Ficheros: Lectura de un archivo de texto

 https://www.youtube.com/watch?v=ksnBUo-08Uw

martes, agosto 23, 2016

Nuevas funcionalidades en Microsoft SQL Server 2016

Amigos en esta oportunidad estaré dictando una charla Sobre Nuevas funcionalidades en Microsoft SQL Server 2016, están todos invitados.



Link ==> https://www.facebook.com/tecnologiaVG/photos/a.671873352836045.1073741828.628437377179643/1161199717236737/?type=3&theater

Saludos.

¿Qué es un Algoritmo?

Más información ==>  https://m.facebook.com/story.php?story_fbid=779713015547334&id=332220556963251