¿Procrastinar o resolver el puzzle de quien era Humblefool?

Estoy impactado intelectual y emocionalmente. Hace unos días, alrededor de las 2 AM estaba como suelo estar en mi cama, con insomnio, así que tomé mi laptop e ingresé a internet buscando acertijos para resolver. MInutos despues me inscribí en un puzzle de matematicas que había posteado una asociación internacional de ingeniería en su página. Mientras trataba de resolverlo decidí ver quien publicaba el puzzle, era una ingeniera de Palestina, googlee su nombre (en realidad, lo duckee) para ver si tenia un blog donde diera pistas de cómo resolverlo – en mi concepto un ingeniero por lo general debe tener un repositorio de soluciones a problemas de su area o de sus hobbys, ya sea privado o público – y vi un canal de YouTube en los resultados de la búsqueda. De pronto vi sus playlist guardadas y habia una de “estructuras de datos” de un canal llamado MyCodeSchool. Quedé fascinado con la forma de explicar los conceptos. Pero no pude continuar porque llegué a una sección de la playlist que requería tener frescos otros conceptos que no había vuelto a retomar desde hacía una década.

Eso fue hace tres dias.

Hoy que es sábado, decidí levantarme a estudiar un poco sobre punteros en lenguaje C para poder continuar con la playlist de “estructuras de datos” dado que dejaban el enlace en los comentarios. Vi unos tres videos y bajando un poco la mirada en uno de ellos, veo que hay un comentario de varias lineas del dueño del canal, respondiendo un comentario de hace 9 años, luego quise ver las respuestas y me encuentro con que alguien afirmaba que el dueño del canal había muerto. ¡¿Cómo?!

Alguien entonces dice, en los comentarios, que googlee ‘humblefool’ y veo un enlace que me pareció interesante.

Lo resumiré así:
Puedo decirles que Aminesh Nayan (un ingeniero que hoy trabaja en Google) alguna vez quiso poder enseñar a programar a jovenes de la India. En ese entonces Aminesh trabajaba en Microsoft y con la duda de que nunca le respondiera, le escribió a uno de los programadores mas competitivos de su país en ese momento: Harsha Suryanarayana quien le contestaría al día siguiente motivado por la idea.

Fotogragfía tomada del blog de uno de los profesores de universidad del Ingeniero Harsha Suryanarayana[1]

Harsha había sido becario de Microsoft y había participado de su departamento de investigación y desarrollo. Juntos, Aminesh y Harsha, iniciaron la tarea de impartir Bootcamps de programación y enseñar a las jóvenes a resolver problemas de programación y algoritmos guiados por su corazón y sin ningún interés monetario.

Pasado un corto tiempo iniciaron una startup que se encargaba de entrenar jóvenes, claro Microsoft estaba detrás de los talentos que pudieran incubarse en esos Bootcamps pero era una gran oportunidad para cultivar sus mentes y llevarlos a una industria que les brindara una mejor vida.

Todo iba tan bien que nunca esperaron lo inesperado. En la mañana del 16 de junio de 2014 Aminesh recibió una llamada: “Mira las noticias locales”, le dijeron. Harsha había fallecido en un accidente tipo “Hit and run”, de esos en los que un conductor en un estado mental desconocido e indescifrable atropella a alguien y se va sin dejar rastro. La historia del accidente está registrada en Wikipedia de la siguiente manera:

“En la noche del 15 de junio de 2014, cuando Harsha Suryanarayana y su esposa Neha Gedela caminaban hacia su apartamento después de comprar frutas en un supermercado en Jalahalli en Bangalore, el conductor de un automóvil a alta velocidad perdió el control del vehículo y golpeó a la pareja. Harsha salió disparado por los aires, se cayó y sufrió múltiples heridas graves. Neha salió disparada hacia el pavimento y también resultó gravemente herida. Tras el accidente, el conductor del automóvil se dio a la fuga[15].

Harsha murió en el acto. Neha sobrevivió, pero tuvo que pasar ocho horas en cuidados intensivos.[16]

El conductor del vehículo nunca fue localizado.”

Es una historia que tiene una parte triste sí, pero que nos deja una gran inspiración y lección, en la vida hay que aprender a ser velas que encienden otras velas.

‘Humblefool’ en español significa ‘Humildetonto’ y era el apodo, del programador mas gran de la India.

Postdata. Aquí dejo el puzzle. Y muchas gracias por leer.

Imagen tomada de IEEE Collaboratec

Blog de uno de los profesores de Humblefool, quien le rinde tributo en un post:

[1] https://umrirainmaker.wordpress.com/tribute-to-humble-fool-harsha-suryanaryana/

Referencias a la historia de Wikipedia:

[15] https://www.deccanherald.com/content/413883/techie-killed-wife-hurt-hit.html

[16] https://www.livemint.com/Politics/VzvthE7UmNIF8Wlh6s5kUO/Death-every-five-minutes-as-Indias-roads-become-most-danger.html

Cloudformation

Introducción

¿Como funciona?

Cloudformation es una herramienta que se encuentra en el grupo de las IaaS. Su cloud provider es AWS y permite hacer despliegues en nube .

Suponga que tiene un server y ud quiere una app corriendo en él con una DB asociada. En principio debería asumirse que al pasar por diferentes fases de desarrollo, ud va a tener una versión distinta del mismo. Esto también supone que con el paso del tiempo va a ir añadiendo un servicio distinto, por ejemplo un login, etc. Si lo miramos un poco en perspectiva, empezamos hablando de IaaS y ahora estamos hablando de desarrollo. ¿Para donde vamos? Vamos hacia un mundo de la infraestructura gobernado por caractarísticas propias del mundo del desarrollo, esto es, versionamiento, control y trazabilidad. Por lo cual es acertado mencionar el significado del acrónimo IaaS.

IaaS -> Infrastructure-as-a-Service

IaaS is one of the four types of cloud services, along with software as a service platform as a service , and serverless. (ver. )

En principio esto no nos dice mucho sobre cómo funciona, pero el hecho de que sea cloud ya nos da una buena pista. Esto implica que de alguna manera Cloudformation nos ayuda a gestionar los recursos que necesitamos y desplegarlos en tiempos absordamente cortos con respecto a la infraestructura on-premise. Con lo cual, lo que hay que hacer es identificar los recursos de forma única y ponerlos en un documento en formato json o yml. Lo anterior constituye la anatomía de la arquitectura en terminos de recursos, roles y politicas asociados dentro de una plantilla en los formatos mencionados.

Supongamos que queremos desplegar un servidor LAMP. El siguiente es un ejemplo tomado de AWS.

La anterior vista la obtenemos en el panel de diseño que CloudFormation tiene. A continuación podríamos ver en formato yml qué contenido llevaría una plantilla para un servidor tipo LAMP desplegado en una instancia de cómputo elástico sin autoscaling.

AWSTemplateFormatVersion: 2010-09-09
Description: >-
  AWS CloudFormation Sample Template LAMP_Single_Instance: Create a LAMP stack
  using a single EC2 instance and a local MySQL database for storage. This
  template demonstrates using the AWS CloudFormation bootstrap scripts to
  install the packages and files necessary to deploy the Apache web server, PHP
  and MySQL at instance launch time. **WARNING** This template creates an Amazon
  EC2 instance. You will be billed for the AWS resources used if you create a
  stack from this template.
Parameters:
  KeyName:
    Description: Name of an existing EC2 KeyPair to enable SSH access to the instance
    Type: 'AWS::EC2::KeyPair::KeyName'
    ConstraintDescription: must be the name of an existing EC2 KeyPair.
  DBName:
    Default: MyDatabase
    Description: MySQL database name
    Type: String
    MinLength: '1'
    MaxLength: '64'
    AllowedPattern: '[a-zA-Z][a-zA-Z0-9]*'
    ConstraintDescription: must begin with a letter and contain only alphanumeric characters.
  DBUser:
    NoEcho: 'true'
    Description: Username for MySQL database access
    Type: String
    MinLength: '1'
    MaxLength: '16'
    AllowedPattern: '[a-zA-Z][a-zA-Z0-9]*'
    ConstraintDescription: must begin with a letter and contain only alphanumeric characters.
  DBPassword:
    NoEcho: 'true'
    Description: Password for MySQL database access
    Type: String
    MinLength: '1'
    MaxLength: '41'
    AllowedPattern: '[a-zA-Z0-9]*'
    ConstraintDescription: must contain only alphanumeric characters.
  DBRootPassword:
    NoEcho: 'true'
    Description: Root password for MySQL
    Type: String
    MinLength: '1'
    MaxLength: '41'
    AllowedPattern: '[a-zA-Z0-9]*'
    ConstraintDescription: must contain only alphanumeric characters.
  InstanceType:
    Description: WebServer EC2 instance type
    Type: String
    Default: t2.small
    AllowedValues:
      - t1.micro
      - t2.nano
      - t2.micro
      - t2.small
      - t2.medium
      - t2.large
      - m1.small
      - m1.medium
      - m1.large
      - m1.xlarge
      - m2.xlarge
      - m2.2xlarge
      - m2.4xlarge
      - m3.medium
      - m3.large
      - m3.xlarge
      - m3.2xlarge
      - m4.large
      - m4.xlarge
      - m4.2xlarge
      - m4.4xlarge
      - m4.10xlarge
      - c1.medium
      - c1.xlarge
      - c3.large
      - c3.xlarge
      - c3.2xlarge
      - c3.4xlarge
      - c3.8xlarge
      - c4.large
      - c4.xlarge
      - c4.2xlarge
      - c4.4xlarge
      - c4.8xlarge
      - g2.2xlarge
      - g2.8xlarge
      - r3.large
      - r3.xlarge
      - r3.2xlarge
      - r3.4xlarge
      - r3.8xlarge
      - i2.xlarge
      - i2.2xlarge
      - i2.4xlarge
      - i2.8xlarge
      - d2.xlarge
      - d2.2xlarge
      - d2.4xlarge
      - d2.8xlarge
      - hi1.4xlarge
      - hs1.8xlarge
      - cr1.8xlarge
      - cc2.8xlarge
      - cg1.4xlarge
    ConstraintDescription: must be a valid EC2 instance type.
  SSHLocation:
    Description: ' The IP address range that can be used to SSH to the EC2 instances'
    Type: String
    MinLength: '9'
    MaxLength: '18'
    Default: 0.0.0.0/0
    AllowedPattern: '(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2})'
    ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.
Mappings:
  AWSInstanceType2Arch:
    t1.micro:
      Arch: HVM64
    t2.nano:
      Arch: HVM64
    t2.micro:
      Arch: HVM64
    t2.small:
      Arch: HVM64
    t2.medium:
      Arch: HVM64
    t2.large:
      Arch: HVM64
    m1.small:
      Arch: HVM64
    m1.medium:
      Arch: HVM64
    m1.large:
      Arch: HVM64
    m1.xlarge:
      Arch: HVM64
    m2.xlarge:
      Arch: HVM64
    m2.2xlarge:
      Arch: HVM64
    m2.4xlarge:
      Arch: HVM64
    m3.medium:
      Arch: HVM64
    m3.large:
      Arch: HVM64
    m3.xlarge:
      Arch: HVM64
    m3.2xlarge:
      Arch: HVM64
    m4.large:
      Arch: HVM64
    m4.xlarge:
      Arch: HVM64
    m4.2xlarge:
      Arch: HVM64
    m4.4xlarge:
      Arch: HVM64
    m4.10xlarge:
      Arch: HVM64
    c1.medium:
      Arch: HVM64
    c1.xlarge:
      Arch: HVM64
    c3.large:
      Arch: HVM64
    c3.xlarge:
      Arch: HVM64
    c3.2xlarge:
      Arch: HVM64
    c3.4xlarge:
      Arch: HVM64
    c3.8xlarge:
      Arch: HVM64
    c4.large:
      Arch: HVM64
    c4.xlarge:
      Arch: HVM64
    c4.2xlarge:
      Arch: HVM64
    c4.4xlarge:
      Arch: HVM64
    c4.8xlarge:
      Arch: HVM64
    g2.2xlarge:
      Arch: HVMG2
    g2.8xlarge:
      Arch: HVMG2
    r3.large:
      Arch: HVM64
    r3.xlarge:
      Arch: HVM64
    r3.2xlarge:
      Arch: HVM64
    r3.4xlarge:
      Arch: HVM64
    r3.8xlarge:
      Arch: HVM64
    i2.xlarge:
      Arch: HVM64
    i2.2xlarge:
      Arch: HVM64
    i2.4xlarge:
      Arch: HVM64
    i2.8xlarge:
      Arch: HVM64
    d2.xlarge:
      Arch: HVM64
    d2.2xlarge:
      Arch: HVM64
    d2.4xlarge:
      Arch: HVM64
    d2.8xlarge:
      Arch: HVM64
    hi1.4xlarge:
      Arch: HVM64
    hs1.8xlarge:
      Arch: HVM64
    cr1.8xlarge:
      Arch: HVM64
    cc2.8xlarge:
      Arch: HVM64
  AWSInstanceType2NATArch:
    t1.micro:
      Arch: NATHVM64
    t2.nano:
      Arch: NATHVM64
    t2.micro:
      Arch: NATHVM64
    t2.small:
      Arch: NATHVM64
    t2.medium:
      Arch: NATHVM64
    t2.large:
      Arch: NATHVM64
    m1.small:
      Arch: NATHVM64
    m1.medium:
      Arch: NATHVM64
    m1.large:
      Arch: NATHVM64
    m1.xlarge:
      Arch: NATHVM64
    m2.xlarge:
      Arch: NATHVM64
    m2.2xlarge:
      Arch: NATHVM64
    m2.4xlarge:
      Arch: NATHVM64
    m3.medium:
      Arch: NATHVM64
    m3.large:
      Arch: NATHVM64
    m3.xlarge:
      Arch: NATHVM64
    m3.2xlarge:
      Arch: NATHVM64
    m4.large:
      Arch: NATHVM64
    m4.xlarge:
      Arch: NATHVM64
    m4.2xlarge:
      Arch: NATHVM64
    m4.4xlarge:
      Arch: NATHVM64
    m4.10xlarge:
      Arch: NATHVM64
    c1.medium:
      Arch: NATHVM64
    c1.xlarge:
      Arch: NATHVM64
    c3.large:
      Arch: NATHVM64
    c3.xlarge:
      Arch: NATHVM64
    c3.2xlarge:
      Arch: NATHVM64
    c3.4xlarge:
      Arch: NATHVM64
    c3.8xlarge:
      Arch: NATHVM64
    c4.large:
      Arch: NATHVM64
    c4.xlarge:
      Arch: NATHVM64
    c4.2xlarge:
      Arch: NATHVM64
    c4.4xlarge:
      Arch: NATHVM64
    c4.8xlarge:
      Arch: NATHVM64
    g2.2xlarge:
      Arch: NATHVMG2
    g2.8xlarge:
      Arch: NATHVMG2
    r3.large:
      Arch: NATHVM64
    r3.xlarge:
      Arch: NATHVM64
    r3.2xlarge:
      Arch: NATHVM64
    r3.4xlarge:
      Arch: NATHVM64
    r3.8xlarge:
      Arch: NATHVM64
    i2.xlarge:
      Arch: NATHVM64
    i2.2xlarge:
      Arch: NATHVM64
    i2.4xlarge:
      Arch: NATHVM64
    i2.8xlarge:
      Arch: NATHVM64
    d2.xlarge:
      Arch: NATHVM64
    d2.2xlarge:
      Arch: NATHVM64
    d2.4xlarge:
      Arch: NATHVM64
    d2.8xlarge:
      Arch: NATHVM64
    hi1.4xlarge:
      Arch: NATHVM64
    hs1.8xlarge:
      Arch: NATHVM64
    cr1.8xlarge:
      Arch: NATHVM64
    cc2.8xlarge:
      Arch: NATHVM64
  AWSRegionArch2AMI:
    af-south-1:
      HVM64: ami-064cc455f8a1ef504
      HVMG2: NOT_SUPPORTED
    ap-east-1:
      HVM64: ami-f85b1989
      HVMG2: NOT_SUPPORTED
    ap-northeast-1:
      HVM64: ami-0b2c2a754d5b4da22
      HVMG2: ami-09d0e0e099ecabba2
    ap-northeast-2:
      HVM64: ami-0493ab99920f410fc
      HVMG2: NOT_SUPPORTED
    ap-northeast-3:
      HVM64: ami-01344f6f63a4decc1
      HVMG2: NOT_SUPPORTED
    ap-south-1:
      HVM64: ami-03cfb5e1fb4fac428
      HVMG2: ami-0244c1d42815af84a
    ap-southeast-1:
      HVM64: ami-0ba35dc9caf73d1c7
      HVMG2: ami-0e46ce0d6a87dc979
    ap-southeast-2:
      HVM64: ami-0ae99b503e8694028
      HVMG2: ami-0c0ab057a101d8ff2
    ca-central-1:
      HVM64: ami-0803e21a2ec22f953
      HVMG2: NOT_SUPPORTED
    cn-north-1:
      HVM64: ami-07a3f215cc90c889c
      HVMG2: NOT_SUPPORTED
    cn-northwest-1:
      HVM64: ami-0a3b3b10f714a0ff4
      HVMG2: NOT_SUPPORTED
    eu-central-1:
      HVM64: ami-0474863011a7d1541
      HVMG2: ami-0aa1822e3eb913a11
    eu-north-1:
      HVM64: ami-0de4b8910494dba0f
      HVMG2: ami-32d55b4c
    eu-south-1:
      HVM64: ami-08427144fe9ebdef6
      HVMG2: NOT_SUPPORTED
    eu-west-1:
      HVM64: ami-015232c01a82b847b
      HVMG2: ami-0d5299b1c6112c3c7
    eu-west-2:
      HVM64: ami-0765d48d7e15beb93
      HVMG2: NOT_SUPPORTED
    eu-west-3:
      HVM64: ami-0caf07637eda19d9c
      HVMG2: NOT_SUPPORTED
    me-south-1:
      HVM64: ami-0744743d80915b497
      HVMG2: NOT_SUPPORTED
    sa-east-1:
      HVM64: ami-0a52e8a6018e92bb0
      HVMG2: NOT_SUPPORTED
    us-east-1:
      HVM64: ami-032930428bf1abbff
      HVMG2: ami-0aeb704d503081ea6
    us-east-2:
      HVM64: ami-027cab9a7bf0155df
      HVMG2: NOT_SUPPORTED
    us-west-1:
      HVM64: ami-088c153f74339f34c
      HVMG2: ami-0a7fc72dc0e51aa77
    us-west-2:
      HVM64: ami-01fee56b22f308154
      HVMG2: ami-0fe84a5b4563d8f27
Resources:
  WebServerInstance:
    Type: 'AWS::EC2::Instance'
    Metadata:
      'AWS::CloudFormation::Init':
        configSets:
          InstallAndRun:
            - Install
            - Configure
        Install:
          packages:
            yum:
              mysql: []
              mysql-server: []
              mysql-libs: []
              httpd: []
              php: []
              php-mysql: []
          files:
            /var/www/html/index.php:
              content: !Join 
                - ''
                - - |
                    <html>
                  - |2
                      <head>
                  - |2
                        <title>AWS CloudFormation PHP Sample</title>
                  - |2
                        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
                  - |2
                      </head>
                  - |2
                      <body>
                  - |2
                        <h1>Welcome to the AWS CloudFormation PHP Sample</h1>
                  - |2
                        <p/>
                  - |2
                        <?php
                  - |2
                          // Print out the current data and time
                  - |2
                          print "The Current Date and Time is: <br/>";
                  - |2
                          print date("g:i A l, F j Y.");
                  - |2
                        ?>
                  - |2
                        <p/>
                  - |2
                        <?php
                  - |2
                          // Setup a handle for CURL
                  - |2
                          $curl_handle=curl_init();
                  - |2
                          curl_setopt($curl_handle,CURLOPT_CONNECTTIMEOUT,2);
                  - |2
                          curl_setopt($curl_handle,CURLOPT_RETURNTRANSFER,1);
                  - |2
                          // Get the hostname of the intance from the instance metadata
                  - |2
                          curl_setopt($curl_handle,CURLOPT_URL,'http://169.254.169.254/latest/meta-data/public-hostname');
                  - |2
                          $hostname = curl_exec($curl_handle);
                  - |2
                          if (empty($hostname))
                  - |2
                          {
                  - |2
                            print "Sorry, for some reason, we got no hostname back <br />";
                  - |2
                          }
                  - |2
                          else
                  - |2
                          {
                  - |2
                            print "Server = " . $hostname . "<br />";
                  - |2
                          }
                  - |2
                          // Get the instance-id of the intance from the instance metadata
                  - |2
                          curl_setopt($curl_handle,CURLOPT_URL,'http://169.254.169.254/latest/meta-data/instance-id');
                  - |2
                          $instanceid = curl_exec($curl_handle);
                  - |2
                          if (empty($instanceid))
                  - |2
                          {
                  - |2
                            print "Sorry, for some reason, we got no instance id back <br />";
                  - |2
                          }
                  - |2
                          else
                  - |2
                          {
                  - |2
                            print "EC2 instance-id = " . $instanceid . "<br />";
                  - |2
                          }
                  - |2
                          $Database   = "localhost";
                  - '      $DBUser     = "'
                  - !Ref DBUser
                  - |
                    ";
                  - '      $DBPassword = "'
                  - !Ref DBPassword
                  - |
                    ";
                  - |2
                          print "Database = " . $Database . "<br />";
                  - |2
                          $dbconnection = mysql_connect($Database, $DBUser, $DBPassword)
                  - |2
                                          or die("Could not connect: " . mysql_error());
                  - |2
                          print ("Connected to $Database successfully");
                  - |2
                          mysql_close($dbconnection);
                  - |2
                        ?>
                  - |2
                        <h2>PHP Information</h2>
                  - |2
                        <p/>
                  - |2
                        <?php
                  - |2
                          phpinfo();
                  - |2
                        ?>
                  - |2
                      </body>
                  - |
                    </html>
              mode: '000600'
              owner: apache
              group: apache
            /tmp/setup.mysql:
              content: !Join 
                - ''
                - - 'CREATE DATABASE '
                  - !Ref DBName
                  - |
                    ;
                  - 'GRANT ALL ON '
                  - !Ref DBName
                  - .* TO '
                  - !Ref DBUser
                  - '''@localhost IDENTIFIED BY '''
                  - !Ref DBPassword
                  - |
                    ';
              mode: '000400'
              owner: root
              group: root
            /etc/cfn/cfn-hup.conf:
              content: !Join 
                - ''
                - - |
                    [main]
                  - stack=
                  - !Ref 'AWS::StackId'
                  - |+

                  - region=
                  - !Ref 'AWS::Region'
                  - |+

              mode: '000400'
              owner: root
              group: root
            /etc/cfn/hooks.d/cfn-auto-reloader.conf:
              content: !Join 
                - ''
                - - |
                    [cfn-auto-reloader-hook]
                  - |
                    triggers=post.update
                  - >
                    path=Resources.WebServerInstance.Metadata.AWS::CloudFormation::Init
                  - 'action=/opt/aws/bin/cfn-init -v '
                  - '         --stack '
                  - !Ref 'AWS::StackName'
                  - '         --resource WebServerInstance '
                  - '         --configsets InstallAndRun '
                  - '         --region '
                  - !Ref 'AWS::Region'
                  - |+

                  - |
                    runas=root
              mode: '000400'
              owner: root
              group: root
          services:
            sysvinit:
              mysqld:
                enabled: 'true'
                ensureRunning: 'true'
              httpd:
                enabled: 'true'
                ensureRunning: 'true'
              cfn-hup:
                enabled: 'true'
                ensureRunning: 'true'
                files:
                  - /etc/cfn/cfn-hup.conf
                  - /etc/cfn/hooks.d/cfn-auto-reloader.conf
        Configure:
          commands:
            01_set_mysql_root_password:
              command: !Join 
                - ''
                - - mysqladmin -u root password '
                  - !Ref DBRootPassword
                  - ''''
              test: !Join 
                - ''
                - - '$(mysql '
                  - !Ref DBName
                  - ' -u root --password='''
                  - !Ref DBRootPassword
                  - ''' >/dev/null 2>&1 </dev/null); (( $? != 0 ))'
            02_create_database:
              command: !Join 
                - ''
                - - mysql -u root --password='
                  - !Ref DBRootPassword
                  - ''' < /tmp/setup.mysql'
              test: !Join 
                - ''
                - - '$(mysql '
                  - !Ref DBName
                  - ' -u root --password='''
                  - !Ref DBRootPassword
                  - ''' >/dev/null 2>&1 </dev/null); (( $? != 0 ))'
    Properties:
      ImageId: !FindInMap 
        - AWSRegionArch2AMI
        - !Ref 'AWS::Region'
        - !FindInMap 
          - AWSInstanceType2Arch
          - !Ref InstanceType
          - Arch
      InstanceType: !Ref InstanceType
      SecurityGroups:
        - !Ref WebServerSecurityGroup
      KeyName: !Ref KeyName
      UserData: !Base64 
        'Fn::Join':
          - ''
          - - |
              #!/bin/bash -xe
            - |
              yum update -y aws-cfn-bootstrap
            - |
              # Install the files and packages from the metadata
            - '/opt/aws/bin/cfn-init -v '
            - '         --stack '
            - !Ref 'AWS::StackName'
            - '         --resource WebServerInstance '
            - '         --configsets InstallAndRun '
            - '         --region '
            - !Ref 'AWS::Region'
            - |+

            - |
              # Signal the status from cfn-init
            - '/opt/aws/bin/cfn-signal -e $? '
            - '         --stack '
            - !Ref 'AWS::StackName'
            - '         --resource WebServerInstance '
            - '         --region '
            - !Ref 'AWS::Region'
            - |+

    CreationPolicy:
      ResourceSignal:
        Timeout: PT5M
  WebServerSecurityGroup:
    Type: 'AWS::EC2::SecurityGroup'
    Properties:
      GroupDescription: Enable HTTP access via port 80
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: '80'
          ToPort: '80'
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: '22'
          ToPort: '22'
          CidrIp: !Ref SSHLocation
Outputs:
  WebsiteURL:
    Description: URL for newly created LAMP stack
    Value: !Join 
      - ''
      - - 'http://'
        - !GetAtt 
          - WebServerInstance
          - PublicDnsName

En este template lo que hacen es desplegar un server Linux Apache MySQL PHP, en una instancia EC2, sin embargo mapea varios tipos de instancias por lo que se hace un poco largo. La razón por la que lo he puesto ahí completo es para que vayas y lo despliegues en una cuenta de AWS.

Hasta aquí la introducción a CF, cabe mencionar lo siguiente:

  • Una misma plantilla puede ser desplegada en diferentes ambientes. Piensa por ejemplo, que el developer, teter o QA deban hacer revisiones y aprobaciones de cambios.
  • Se estandariza el proceso de despliegue de infraestructura.
  • Se automatiza el paso a producción.
  • Los componentes de la plantilla o template son reutilizables, ¡por si los necesitas en un proyecto completamente nuevo!

En conclusión, CF nos hace la vida más sencilla, pero tal vez no todo sea color de rosa …

Happy Coding

Ruído e interferencia ocultos en las señales analógicas

Mi interés con este post es discriminar las fuentes de interferencia y sus características así como las del ruído en un canal de transmisión y sus mediciones.

El problema de conseguir señales libres de estos ‘fantasmas’ sigue siendo un aspecto de interés mundial.

¿Ruído o interferencia?

una ojeada desde la física

Para no asumir que son lo mismo, voy a empezar por diferencias relevantes entre una señal y otra. Sí, porque físicamente hablando son eso, señales. En el primer caso, llámese señal de interferencia a aquella señal analógica externa al sistema de comunicaciones que representa una perturbación de campo por procesos naturales o artificiales. El ruído por su parte es inherente a las propiedades eléctricas de los conductores (elementos de transmisión, buses, etc…) como también lo es a los semiconductores con que estan fabricados los elementos de filtrado activo. Así pues, el ruido es un proceso aleatorio que se da en el sistema eléctrico con que se modela el sistema de comunicación.

Si ya no te es indiferente el tema, ¿ te parece que es sencillo no?

Bueno, si el ruido llega a ser lo suficientemente grande este puede propagarse fuera del sistema e interferir con otros sistemas o componentes electrónicos La diferencia entre ambos procesos es debida a la forma en que se generan, pero el tratamiento a darles es esencialmente el mismo. ¡Son señales indeseables!

Lastimosamente, esto no es posible, porque los diseños van a estar basados en características de la señal de entrada, la cual es una señal de la que no se conoce su pasado y por ende el sistema de comunicaciones solamente puede responder y jamás anticiparse a la distorsión generada por la fuente de interferencia.

Entonces ¿Qué se puede hacer para diseñar un sistema robusto?

Lo que tenemos que saber y medir de una señal analógica ruidosa o interferente

Para responder a esta pregunta necesitaremos tener en cuenta los componentes y pasos dados en un sistema de comunicaciones en especial los bloques de interferencia y canal con ruído

1. Relación señal a ruído o SNR en el canal de transmisión

La SNR, no es realmente una razón matemática sino una diferencia en decibeles entre la señal recibida y el nivel de ruido de fondo. Por ejemplo si un dispositivo que usa ondas de radio recibe una señal de -75 dBm y el nivel de ruído de fondo es medido a -90 dBm, la SNR da 15 dB. La corrupción de datos se da si la señal recivida es muy cerca a la señal de ruído. En redes 802.11, esto afecta el throughput y latencia.

Figura 1. Comparación entre la potencia de la señal recibida y el nivel de ruído de fondo, conocido como ruído de piso. Cuanto mayor sea la SNR mejor será la calidad de la señal recibida.

Uno siempre debe tener una medida en la cabeza como referente Para dar un ejemplo que aporte a la claridad diremos que la SNR es un parámetro relativo (Figura 1) y que es la mejor forma de juzgar la calidad de una señal dado que toma en cuenta el ruído del ambiente en el que se propagan las ondas de radio frecuencia, es decir si la señal recibida de -65 dBm puede ser considerada buena en un lugar con un ruido de fondo de -90 dBm (SNR 25 dB) pero no es tan buena en un lugar en el que el ruido de fondo es de -80 dBm (SNR 15 dB).

Un paréntesis (Ganancia neta)

Durante la transmisión la ganancia es medida aplicando una señal TEST a un nivel de potencia apropiado en el puerto de entrada del circuito y midiendo la potencia en la señal del puero de salida. La ganancia neta en decibeles (dB) se calcula tomando el diez veces el logaritmo de la razón entre las dos potencias, de salida respecto a la entrada.

3. Interferencia

CATEGORÍAS

Empecemos por mencionar las dos grandes categorías, a saber; de banda estrecha y de banda ancha. (Figura 2).


Figura 2. Un ejemplo de gràfica de espectro desde los 9 kHz a 200 MHz de armónicos de banda estrecha (picos verticales) montados encima de interferencia de banda ancha (area amplia de ruído de piso en color fucsia) la traza amarilla es la linea base de ruído del sistema.

Interferencia de Banda Estrecha –este podría incluír ondas contínuas o moduladas en período. Ejemplos de este tipo digamos que se presentan con dispositivos que poseen un reloj que genera armónicos así como también la fuente de este tipo podría incluír canales de transmisión adyacentes que no poseen un blindaje adecuado, etc. En un analizador de espectro, esto podría aparecer como lineas verticales estrechas con frecuencias específicas.

Interferencia de Banda Ancha – Esto podría incluír primariamente modos o armónicos de fuentes de poder, ruído de lineas de voltaje, sistemas wireless modulados digitalmente (tal como Wi-Fi o Bluetooth) o incluso nuestra amada televisión digital. ¿Cómo se vería en un analizador de espectro?aPodría aparecer como rangos amplis de señal o como un incremento en el nivel de ruido base (ruído de piso). Como lo comenté, las líneas de transmisión de voltaje o las fuentes de poder tipo switch son las fuentes mas comunes.

AHORA SI… LOS TIPOS DE INTERFERENCIA

Entre los tipos mas comunes de interferencia podemos describir:

Interferencia de Canal – Cuando se tiene mas de un armónico sobre el mismo canal de recepción. Podríamos mencionar la interferencia de canal adyacente – un transmisor operando en una frecuencia adyacente cuya energía se desborda sobre el canal de recepción deseado.

Interferencia basada en intermodulación: se produce cuando la energía de dos o más transmisores se mezclan para producir frecuencias espurias que aterrizan en el canal de recepción deseado.

Sobrecarga fundamental del receptor: normalmente es causada por un transmisor fuerte y cercano que simplemente sobrecarga el extremo frontal del receptor u otro circuito, causando interferencia o incluso supresión de la señal normal recibida.

Ruido de la línea de alimentación: este es un problema de interferencia de banda ancha relativamente común que generalmente es causado por la formación de arcos eléctricos en las líneas de energía eléctrica y el hardware asociado. Suena como un zumbido áspero y áspero en un receptor de AM. La interferencia puede extenderse desde frecuencias muy bajas por debajo de la banda de transmisión de AM, y dependiendo de la proximidad a la fuente, en el espectro de HF. Si está lo suficientemente cerca de la fuente, puede extenderse hasta el espectro UHF.

Fuentes de alimentación de modo conmutado: las fuentes de alimentación de modo conmutado son muy comunes y se utilizan para una variedad de productos comerciales o de consumo y son una fuente común de interferencia de banda ancha. Los dispositivos de iluminación, como las nuevas luces basadas en LED o las luces comerciales de “crecimiento” agrícolas, son otra fuente importante de interferencias.

Para finalizar, hay varios tipos de transmisores que comúnmente causan Interferencia de Radiofrecuencia:

Radio móvil bidireccional o terrestre: las señales de FM con interferencias fuertes pueden generar un “efecto de captura” o anular la señal recibida.
Transmisores de localización: los transmisores de localización generalmente son transmisiones de FM o moduladas digitalmente muy potentes que pueden sobrecargar al receptor. La localización digital suena muy ronca, como una sierra eléctrica o un zumbido, y puede interferir con una amplia gama de frecuencias de recepción. Afortunadamente, la mayoría de los transmisores de VHF se movieron a los pares de frecuencia de 929/931 MHz.

Televisión por cable: la pérdida de señal de los sistemas de televisión por cable generalmente ocurrirá porque muchos de estos canales se superponen a los canales de comunicaciones de radio por aire existentes. Si la señal de fuga es un canal digital, la interferencia será similar al ruido de banda ancha (un canal de cable digital tiene casi 6 MHz de ancho de banda).

Interferencia de red inalámbrica: la interferencia a redes inalámbricas (Wi-Fi, Bluetooth, etc.) es cada vez más común, sobre todo con la proliferación de dispositivos móviles, domótica e internet de las cosas (IoT-por sus siglas en inglés) además de los dispositivos médicos que incorporan Wi-Fi así como otros módulos inalámbricos (véase ZIGBEE), este problema es probable que tienda a empeorar.

Una conclusión parcial


Una vez que sabes que van a afectar tu sistema, uno se pregunta por qué no hay manera de anticipar la interferencia y el ruído para filtrar una señal lo mas limpia posible y ademas aislarla de la interferencia. La verdad es que las señales fantasma como la interferencia o el ruído en la mayoría no se pueden anticipar, dependen de los equipos de medida, de su acoplamiento electromagnético y de los elementos con que se realicen estas medidas(como las puntas del osciloscopio, o del generador de señales, los cables de prueba, etc…). Mientras van pasando los años y uno va practicando comprende, que son demasiadas las fuentes de señales parásitas como también se les conoce.

Si necesitas o quieres charlar sobre el tema, déjame un comentario.

Design a site like this with WordPress.com
Get started