Tecnologias de la Información y la Comunicación

El verdadero progreso es el que pone la tecnología al alcance de todos". (Henry Ford)

Software

"Si piensas que los usuarios de tus programas son idiotas, sólo los idiotas usarán tus programas". Linus Torvalds - "padre" de Linux

Hardware

El hardware es para el informático como la barita mágica del mago, pero un poco más caro. "El ordenador elige al dueño..."

Seguridad informática

El único sistema seguro es aquél que está apagado en el interior de un bloque de hormigón protegido en una habitación sellada rodeada por guardias armados.

Realidad virtual

Desde tiempos inmemorables nos empeñamos más en crear mundos que vivir el nuestro.

jueves, 16 de febrero de 2017

Nos mudamos

Qué ganas tenía de dar esta noticia algún día! Si eres asiduo en este sitio sabrás los planes a futuro que tenía de mudar este sitio a un hosting y dominio propios. Pues bien, YA ESTÁ!

Todo lo bueno tiene partes malas y esque, si estás leyendo esto, no escribiré más artículos en este sitio y, cuando haya mudado a la audiencia al nuevo sitio, seguramente lo borraré o lo marcaré como privado para que no sea visible.

El nuevo sitio es elfreneticoinformatico.com y puedes visitarlo haciendo click aquí. Espero que te guste. Por última vez (en blogger) os digo lo de siempre: sed buenos (si se puede).

jueves, 9 de febrero de 2017

Sobre los artículos de Toptal

Esta semana seré muy breve. Tengo pendientes varios artícuos por publicar y no me gustaba atrasarlos (tengo entradas programadas ya hasta abril) pero la noticia merece la pena.

Si eres lector asiduo de este sitio habrás notado que la semana pasada escribí dos días: jueves y viernes (que raro, ¿verdad?) y además, si te has leído el inicio del artículo del viernes, habrás visto que no es un artículo mío, sino que pertenece a la web Toptal.com.



Pues bien, la buena noticia es que han contactado conmigo para un acuerdo y he aceptado. Tengo mucha ilusión. Toptal es una web de freelances desarrolladores y, teniendo en cuenta lo que estudio y lo que espero de mi futura carrera profesional, creo que puede venirme muy bien tener contacto con semejante empresa. Os invito, si os interesa el tema, a que pinchéis aquí y visiteis su sitio web

Básicamente, lo que yo haré será escribir sobre temas que ellos me digan y, en algunas ocasiones (como el viernes pasado), publicar un artículo propio suyo. A cambio, su equipo de marketing promocionará mi blog en sus campañas SEO. En principio espero recibir contenido todas las semanas, así que a partir de ahora espero escribir dos días a la semana: los martes (para Toptal) y los jueves, como hasta ahora, en mi espacio propio. Tengo mucho interés en dedicarme especialmente a mudar el blog a un dominio y hosting propios para aprovechar este apoyo, ya que con blogger me he quedado atascado en las 400 visitas diarias.

Desde hoy lo dejo claro: no se si durará mucho este acuerdo y si realmente será fructífero para ambos, pero tengo ilusión y espero crecer un poquito más. Una de mis normas básicas de vida es aprovechar todas las oportunidades que nos aparecen, y desde luego que con ellos no voy a hacer una excepción. Así que, a partir de ahora, nos vemos los martes, con Toptal, y los jueves, conmigo como siempre. No olvides nunca ser bueno, si se puede.

martes, 7 de febrero de 2017

Angular JS: qué es y cómo crear tu primera aplicación

Artículo original de Toptal. Click aquí para verlo y aquí para leer la versión original en inglés.

¿Qué es AngularJS?

AngularJS es un marco de JavaScript MVC desarrollado por Google, el cual permite construir aplicaciones front-end bien estructuradas y fáciles de comprobar y mantener.

¿Y Por Qué Debo Utilizarlo?

Si no has probado AngularJS todavía, es una lástima. El marco consiste en un conjunto de herramientas bien integradas que te ayudará a construir aplicaciones del lado del cliente, bien estructuradas en un sistema modular, con menos código y más flexibilidad.
AngularJS extiende HTML, proporcionando directrices que añaden funcionalidad a tu margen de beneficio y te permite crear plantillas dinámicas poderosas. También puedes crear tus propias directrices, elaborando componentes reusables que completan tus necesidades y abstrayendo toda la lógica de manipulación del DOM.
También implementa binding de datos de dos vías, conectando tu HTML (vistas) a los objetos de JavaScript (modelos) sin problemas. En términos simples, esto significa que cualquier actualización de tu modelo se reflejará inmediatamente en tu vista, sin necesidad de ningún tipo de manipulación DOM o el control de eventos (por ejemplo, con jQuery).
Angular presta servicios en la parte superior de XHR que simplifican considerablemente tu código y permite abstraer llamadas API en servicios reusables. Con esto, puedes mover tu modelo y lógica de negocio para el front-end y construir aplicaciones web back-end independientes (agnostic).
Por último, me encanta Angular debido a su flexibilidad en cuanto a la comunicación del servidor. Como la mayoría de los marcos de JavaScript MVC, Angular te permite trabajar con cualquier tecnología de servidor, siempre que puede servir a tu aplicación a través de una API REST Web. Pero Angular también proporciona servicios aparte de XHR, los cuales simplifican considerablemente tu código y te permite abstraer llamadas API en servicios reusables. Como resultado, se puede mover el modelo y la lógica de negocio para el front-end y construir aplicaciones web back-end independientes. En este post vamos a hacer precisamente eso: un paso a la vez.

Así que, ¿Por Dónde Empezamos?

En primer lugar, vamos a decidir la naturaleza de la aplicación que queremos construir. En esta guía, preferimos no pasar demasiado tiempo en el back-end, por lo que vamos a escribir algo sobre la base de datos que es fácil de obtener en internet, ¡como una aplicación de noticias deportiva!
Ya que soy un gran fan del automovilismo y la Fórmula 1, voy a utilizar un servicio API Autosport como nuestro back-end. Por suerte, los chicos de Ergast son lo suficientemente amables para proporcionar una API de automovilismo gratis, la cual es perfecta para nosotros.
Como adelanto de lo que vamos a construir, echa un vistazo al demo en vivo. Para embellecer el demo y mostrar algunas plantillas Angular, apliqué un tema Bootstrap de WrapBootstrap, pero ya que éste artículo no es acerca de CSS, lo voy a abstraer de los ejemplos y dejarlo fuera por completo.

Tutorial para Comenzar

Vamos a iniciar nuestra aplicación de ejemplo con un poco de Boilerplate. Recomiendo el proyecto angular-seed, ya que no sólo proporciona un gran esqueleto para bootstrapping, sino que también establece las bases para las pruebas de unidad con Karma y Jasmine(no vamos a hacer ninguna prueba en éste demo, así que vamos dejar eso de lado por ahora; ve la Parte 2 de éste tutorial para obtener más información sobre la configuración de tu proyecto, para pruebas unitarias y de extremo a extremo).

EDITADO (Mayo de 2014): Desde que escribí éste tutorial, el proyecto angular-seed ha pasado por algunos cambios importantes (incluyendo la adición de Bower como gestor de paquetes). Si tienes alguna duda acerca de cómo implementar el proyecto, echa un vistazo rápido a la primera sección de su guía de referencia. En la parte 2 del tutorial, Bower, entre otras herramientas, es explicado en mayor detalle.

Bien, ahora que hemos clonado el repositorio e instalado las dependencias, el esqueleto de nuestra aplicación va a tener este aspecto:
Ahora podemos empezar a codificar. Como estamos tratando de construir aplicación de noticias de deporte para un campeonato de carreras, vamos a empezar con la vista más relevante: la tabla del campeonato.
Teniendo en cuenta que ya tenemos una lista de los conductores definida dentro de nuestro alcance (Quédate conmigo – Llegaremos ahí), y haciendo caso omiso de cualquier CSS (para facilitar la lectura), nuestra HTML podría ser:
<body ng-app="F1FeederApp" ng-controller="driversController">
  <table>
    <thead>
      <tr><th colspan="4">Drivers Championship Standings</th></tr>
    </thead>
    <tbody>
      <tr ng-repeat="driver in driversList">
        <td>{{$index + 1}}</td>
        <td>
          <img src="img/flags/{{driver.Driver.nationality}}.png" />
          {{driver.Driver.givenName}}&nbsp;{{driver.Driver.familyName}}
        </td>
        <td>{{driver.Constructors[0].name}}</td>
        <td>{{driver.points}}</td>
      </tr>
    </tbody>
  </table>
</body>
La primera cosa que notarás en esta plantilla es el uso de expresiones (“{{“ y “}}”) para regresar valores de las variables. En AngularJS, las expresiones permiten ejecutar algunos cálculos, con el fin de regresar un valor deseado. Algunas expresiones válidas serían:
  • {{ 1 + 1 }}
  • {{ 946757880 | date }}
  • {{ user.name }}
Efectivamente, las expresiones son fragmentos parecidos a JavaScript. A pesar de ser muy potente, no deberías utilizar expresiones para implementar cualquier lógica de nivel superior. Para ello, utilizamos directrices.

La Comprensión de las Directrices Básicas

La segunda cosa que notarás es la presencia de ng-attributes, que no verías en el marcado típico. Esas son las directrices.
En un nivel alto, las directrices son marcadores (como atributos, etiquetas y nombres genéricos) que le ordenan a AngularJS adjuntar un comportamiento dado a un elemento DOM (o transformarlo, reemplazarlo, etc.). Vamos a echar un vistazo a los que ya hemos visto:
  • La directriz ng-app es responsable de hacer bootstrapping a tu aplicación, para definir el ámbito de ésta. En AngularJS, puedes tener múltiples aplicaciones dentro de la misma página, por lo que esta directriz define el lugar donde comienza y termina cada aplicación.
  • La directriz ng-controller define qué controlador estará a cargo de tu vista. En este caso, la denotamos driversController, la cual proporcionará nuestra lista de conductores (driversList).
  • La directriz ng-repeat es una de las más utilizadas, y sirve para definir tu alcance de plantilla al pasar a través de colecciones. En el ejemplo anterior, repite una línea en la tabla por cada conductor en driversList.

Añadir Controladores

Por supuesto, nuestra vista no sirve de nada, sin un controlador. Vamos a añadir driversController a nuestros controllers.js:
angular.module('F1FeederApp.controllers', []).
controller('driversController', function($scope) {
    $scope.driversList = [
      {
          Driver: {
              givenName: 'Sebastian',
              familyName: 'Vettel'
          },
          points: 322,
          nationality: "German",
          Constructors: [
              {name: "Red Bull"}
          ]
      },
      {
          Driver: {
          givenName: 'Fernando',
              familyName: 'Alonso'
          },
          points: 207,
          nationality: "Spanish",
          Constructors: [
              {name: "Ferrari"}
          ]
      }
    ];
});
Seguro notaste la variable $scope que estamos pasando como parámetro al controlador. La variable $scope se supone que debe enlazar tu controlador y vistas. En particular, lleva todos los datos que se utilizarán dentro de la plantilla. Todo lo que se agrega a ella (como la driversList del ejemplo anterior) será directamente accesible en tus vistas. Por ahora, vamos a trabajar con una matriz de datos ficticios (estática), que vamos a sustituir más tarde con nuestro servicio API.
Ahora, añade esto a app.js:
angular.module('F1FeederApp', [
  'F1FeederApp.controllers'
]);
Con esta línea de código inicializamos nuestra aplicación y registramos los módulos de los cuales depende. Volveremos a ese archivo (app.js) más adelante.
Ahora, vamos a poner todo junto en index.html:
<!DOCTYPE html>
<html>
<head>
  <title>F-1 Feeder</title>
</head>

<body ng-app="F1FeederApp" ng-controller="driversController">
  <table>
    <thead>
      <tr><th colspan="4">Drivers Championship Standings</th></tr>
    </thead>
    <tbody>
      <tr ng-repeat="driver in driversList">
        <td>{{$index + 1}}</td>
        <td>
          <img src="img/flags/{{driver.Driver.nationality}}.png" />
          {{driver.Driver.givenName}}&nbsp;{{driver.Driver.familyName}}
        </td>
        <td>{{driver.Constructors[0].name}}</td>
        <td>{{driver.points}}</td>
      </tr>
    </tbody>
  </table>
  <script src="bower_components/angular/angular.js"></script>
  <script src="bower_components/angular-route/angular-route.js"></script>
  <script src="js/app.js"></script>
  <script src="js/services.js"></script>
  <script src="js/controllers.js"></script>
</body>
</html>
Moduló errores menores, ahora puedes iniciar tu aplicación y comprobar tu lista (estática) de los conductores.

Nota: Si necesitas ayuda para la depuración de la aplicación y la visualización de tus modelos y con el alcance dentro del navegador, recomiendo echar un vistazo a la impresionante batarang; complemento para Chrome.

Cargando Datos del Servidor

Como ya sabemos cómo mostrar los datos de nuestro controlador en nuestra vista, es momento de traer datos en vivo desde un servidor RESTful.
Para facilitar la comunicación con los servidores HTTP, AngularJS proporciona los servicios $http y $resource. El primero es una capa en la parte superior de XMLHttpRequest o JSONP, mientras que el último proporciona un mayor nivel de abstracción. Vamos a utilizar $http.
Para abstraer nuestras llamadas a la API del servidor desde el controlador vamos a crear nuestro propio servicio personalizado, el cual va a capturar los datos y actuará como una envoltura alrededor de $http al añadirlo a nuestro services.js:
angular.module('F1FeederApp.services', []).
  factory('ergastAPIservice', function($http) {

    var ergastAPI = {};

    ergastAPI.getDrivers = function() {
      return $http({
        method: 'JSONP', 
        url: 'http://ergast.com/api/f1/2013/driverStandings.json?callback=JSON_CALLBACK'
      });
    }

    return ergastAPI;
  });
Con las dos primeras líneas, creamos un nuevo módulo (F1FeederApp.services) y registramos un servicio dentro de ese módulo (F1FeederApp.services). Nótese que pasamos $http como parámetro a ese servicio. Esto le dice al motor de inyección de dependenciade Angular, que nuestro nuevo servicio requiere (o depende) del servicio $http.
De una manera similar, tenemos que decirle a Angular que incluya nuestro nuevo módulo en nuestra aplicación. Vamos a registrarlo con app.js, reemplazando nuestro código existente con:
angular.module('F1FeederApp', [
  'F1FeederApp.controllers',
  'F1FeederApp.services'
]);
Ahora, lo único que tenemos que hacer es ajustar nuestra controller.js un poco, integrar ergastAPIservice como una dependencia, y estaremos listos para continuar:
angular.module('F1FeederApp.controllers', []).
  controller('driversController', function($scope, ergastAPIservice) {
    $scope.nameFilter = null;
    $scope.driversList = [];

    ergastAPIservice.getDrivers().success(function (response) {
        //Dig into the responde to get the relevant data
        $scope.driversList = response.MRData.StandingsTable.StandingsLists[0].DriverStandings;
    });
  });
Ahora, recarga la aplicación y revisa el resultado. Observa que no hicimos ningún cambio en nuestra plantilla, pero añadimos una variable nameFilter a nuestro alcance. Vamos a poner esta variable en uso.

Filtros

¡Estupendo! Tenemos un controlador funcional. Pero sólo muestra una lista de conductores. Vamos a añadir algunas funciones mediante una simple entrada de búsqueda de texto, que filtrará la lista. Vamos a añadir la siguiente línea a nuestro index.html, justo debajo de la etiqueta <body>:
<input type="text" ng-model="nameFilter" placeholder="Search..."/>
Ahora estamos haciendo uso de la directriz ng-model. Esta directriz une nuestro campo de texto a la variable $scope.nameFilter y se asegura de que su valor esté siempre al día con el valor de entrada. Ahora, vamos a visitar index.html una vez más y hagamos un pequeño ajuste en la línea que contiene la directriz ng-repeat:
<tr ng-repeat="driver in driversList | filter: nameFilter">
Esta línea le dice a ng-repeat que, antes de dar salida a los datos, la matriz driversList debe ser filtrada por el valor almacenado en nameFilter.
En este punto, entran los datos bidireccionales binding: cada vez que un valor se introduce en el campo de búsqueda, Angular asegura inmediatamente que el $scope.nameFilter que asociamos a él se actualice con el nuevo valor. Dado que binding funciona en ambos sentidos, el momento en el que el valor nameFilter se actualiza, la segunda directriz asociada a la misma (es decir, ng-repeat) también recibe el nuevo valor y la vista se actualiza inmediatamente.
Actualiza la aplicación y observa la barra de búsqueda.
Observa que éste filtro buscará la palabra clave en todos los atributos del modelo, incluyendo los que no estamos usando. Digamos que sólo queremos filtrar Driver.givenName y Driver.familyName: En primer lugar, añadimos a driversController, justo por debajo de la línea $scope.driversList =[];:
$scope.searchFilter = function (driver) {
    var keyword = new RegExp($scope.nameFilter, 'i');
    return !$scope.nameFilter || keyword.test(driver.Driver.givenName) || keyword.test(driver.Driver.familyName);
};
Ahora, de vuelta a index.html, actualizamos la línea que contiene la directriz ng-repeat:
<tr ng-repeat="driver in driversList | filter: searchFilter">
Actualiza la aplicación una vez más y ahora tenemos una búsqueda por nombre.

Rutas

Nuestro próximo objetivo es crear una página de datos del conductor, la cual nos permitirá hacer clic en cada conductor y ver los detalles de su carrera.
En primer lugar, vamos a incluir el servicio $routeProvider (en app.js) lo que nos ayudará a lidiar con estas variadas rutas de aplicación. A continuación, añadiremos dos de estas rutas: una para la tabla del campeonato y otro para los datos del conductor. Aquí está nuestra nueva app.js:
angular.module('F1FeederApp', [
  'F1FeederApp.services',
  'F1FeederApp.controllers',
  'ngRoute'
]).
config(['$routeProvider', function($routeProvider) {
  $routeProvider.
 when("/drivers", {templateUrl: "partials/drivers.html", controller: "driversController"}).
 when("/drivers/:id", {templateUrl: "partials/driver.html", controller: "driverController"}).
 otherwise({redirectTo: '/drivers'});
}]);
Con éste cambio, la navegación hacia http://domain/#/drivers cargará el driversController y buscará la vista parcial que se va a renderizar en partials/drivers.html. ¡Pero espera! No tenemos ninguna vista parcial todavía, ¿verdad? Vamos a tener que crearlas también.

Vistas Parciales

AngularJS te permitirá unir tus rutas a los controladores y vistas específicas.
Pero primero, tenemos que decirle a Angular dónde renderizar estas vistas parciales. Para ello, usaremos la directriz ng-view, modificando nuestra index.html para reflejar lo siguiente:
<!DOCTYPE html>
<html>
<head>
  <title>F-1 Feeder</title>
</head>

<body ng-app="F1FeederApp">
  <ng-view></ng-view>
  <script src="bower_components/angular/angular.js"></script>
  <script src="bower_components/angular-route/angular-route.js"></script>
  <script src="js/app.js"></script>
  <script src="js/services.js"></script>
  <script src="js/controllers.js"></script>
</body>
</html>
Ahora, cada vez que naveguemos a través de nuestras rutas de aplicaciones, Angular cargará la vista asociada y la renderizará en lugar de la etiqueta <ng-view>. Lo único que tenemos que hacer es crear un archivo con el nombre partials/drivers.html, y poner nuestra tabla de campeonato HTML allí. También vamos a utilizar esta oportunidad para vincular el nombre del conductor a nuestra ruta de los detalles del conductor:
<input type="text" ng-model="nameFilter" placeholder="Search..."/>
<table>
<thead>
  <tr><th colspan="4">Drivers Championship Standings</th></tr>
</thead>
<tbody>
  <tr ng-repeat="driver in driversList | filter: searchFilter">
 <td>{{$index + 1}}</td>
 <td>
   <img src="img/flags/{{driver.Driver.nationality}}.png" />
    <a href="#/drivers/{{driver.Driver.driverId}}">
         {{driver.Driver.givenName}}&nbsp;{{driver.Driver.familyName}}
      </a>
    </td>
   <td>{{driver.Constructors[0].name}}</td>
   <td>{{driver.points}}</td>
  </tr>
</tbody>
</table>
Por último, vamos a decidir lo que queremos mostrar en la página de detalles. ¿Qué tal un resumen de todos los hechos relevantes sobre el conductor (por ejemplo, fecha de nacimiento, nacionalidad), junto con una tabla que contiene sus resultados recientes? Para hacer eso, añadimos a services.js, lo siguiente:
angular.module('F1FeederApp.services', [])
  .factory('ergastAPIservice', function($http) {

    var ergastAPI = {};

    ergastAPI.getDrivers = function() {
      return $http({
        method: 'JSONP', 
        url: 'http://ergast.com/api/f1/2013/driverStandings.json?callback=JSON_CALLBACK'
      });
    }

    ergastAPI.getDriverDetails = function(id) {
      return $http({
        method: 'JSONP', 
        url: 'http://ergast.com/api/f1/2013/drivers/'+ id +'/driverStandings.json?callback=JSON_CALLBACK'
      });
    }

    ergastAPI.getDriverRaces = function(id) {
      return $http({
        method: 'JSONP', 
        url: 'http://ergast.com/api/f1/2013/drivers/'+ id +'/results.json?callback=JSON_CALLBACK'
      });
    }

    return ergastAPI;
  });
Esta vez, proporcionamos la identificación del conductor al servicio para que podamos recuperar la información relevante de un conductor específico. Ahora, modificamos controllers.js:
angular.module('F1FeederApp.controllers', []).

  /* Drivers controller */
  controller('driversController', function($scope, ergastAPIservice) {
    $scope.nameFilter = null;
    $scope.driversList = [];
    $scope.searchFilter = function (driver) {
        var re = new RegExp($scope.nameFilter, 'i');
        return !$scope.nameFilter || re.test(driver.Driver.givenName) || re.test(driver.Driver.familyName);
    };

    ergastAPIservice.getDrivers().success(function (response) {
        //Digging into the response to get the relevant data
        $scope.driversList = response.MRData.StandingsTable.StandingsLists[0].DriverStandings;
    });
  }).

  /* Driver controller */
  controller('driverController', function($scope, $routeParams, ergastAPIservice) {
    $scope.id = $routeParams.id;
    $scope.races = [];
    $scope.driver = null;

    ergastAPIservice.getDriverDetails($scope.id).success(function (response) {
        $scope.driver = response.MRData.StandingsTable.StandingsLists[0].DriverStandings[0]; 
    });

    ergastAPIservice.getDriverRaces($scope.id).success(function (response) {
        $scope.races = response.MRData.RaceTable.Races; 
    }); 
  });
Lo importante a notar aquí es que solo inyectamos el servicio $routeParams en el controlador del conductor. Este servicio nos permitirá acceder a nuestros parámetros de URL (para el :id, en este caso) utilizando $routeParams.id.
Ahora que tenemos nuestros datos en el alcance, sólo necesitamos la vista parcial restante. Vamos a crear un archivo con el nombre partials/driver.html y agregamos:
<section id="main">
  <a href="./#/drivers"><- Back to drivers list</a>
  <nav id="secondary" class="main-nav">
    <div class="driver-picture">
      <div class="avatar">
        <img ng-show="driver" src="img/drivers/{{driver.Driver.driverId}}.png" />
        <img ng-show="driver" src="img/flags/{{driver.Driver.nationality}}.png" /><br/>
        {{driver.Driver.givenName}} {{driver.Driver.familyName}}
      </div>
    </div>
    <div class="driver-status">
      Country: {{driver.Driver.nationality}}   <br/>
      Team: {{driver.Constructors[0].name}}<br/>
      Birth: {{driver.Driver.dateOfBirth}}<br/>
      <a href="{{driver.Driver.url}}" target="_blank">Biography</a>
    </div>
  </nav>

  <div class="main-content">
    <table class="result-table">
      <thead>
        <tr><th colspan="5">Formula 1 2013 Results</th></tr>
      </thead>
      <tbody>
        <tr>
          <td>Round</td> <td>Grand Prix</td> <td>Team</td> <td>Grid</td> <td>Race</td>
        </tr>
        <tr ng-repeat="race in races">
          <td>{{race.round}}</td>
          <td><img  src="img/flags/{{race.Circuit.Location.country}}.png" />{{race.raceName}}</td>
          <td>{{race.Results[0].Constructor.name}}</td>
          <td>{{race.Results[0].grid}}</td>
          <td>{{race.Results[0].position}}</td>
        </tr>
      </tbody>
    </table>
  </div>

</section>
Observa que ahora estamos dándole buen uso a la directriz ng-show. Esta directriz sólo mostrará el elemento HTML si la expresión proporcionada es true (es decir, ni false, ni null). En este caso, el avatar sólo aparecerá una vez que el objeto conductor ha sido cargado en el alcance, por el controlador.

Últimos Toques

Añade un montón de CSS y renderiza tu página. Deberías terminar con algo como esto:
Ahora estás listo para iniciar tu aplicación y asegúrate de que ambas rutas están funcionando como deseas. También puedes añadir un menú estático a index.html, para mejorar las capacidades de navegación del usuario. Las posibilidades son infinitas.

EDITADO (mayo de 2014): He recibido muchas peticiones para una versión descargable del código que construimos en este tutorial. Por lo tanto, he decidido hacerlo disponible aquí (despojado de cualquier CSS). Sin embargo, la verdad es que no recomiendo descargarlo, ya que ésta guía contiene cada paso que necesitas para generar la misma aplicación con tus propias manos, que será un ejercicio de aprendizaje mucho más útil y eficaz.

Conclusión

En este punto del tutorial, hemos cubierto todo lo que necesitarías para escribir una aplicación sencilla (como un informador de Fórmula 1). Cada una de las páginas restantes en el demo en vivo (por ejemplo, tabla del campeonato de constructores, detalles del equipo, calendario) comparten la misma estructura y conceptos básicos que hemos revisado.
Por último, ten en cuenta que Angular es un marco muy potente y que apenas hemos tocado la superficie, en términos de todo lo que tiene que ofrecer. En la parte 2 de éste tutorial, vamos a dar ejemplos de por qué Angular se destaca entre sus semejantes en marcos MVC front-end: capacidad de prueba. Vamos a revisar el proceso de escribir y ejecutar pruebas unitarias con Karma, lograr la integración continua con Yeomen, Grunt, y Bower y otros puntos fuertes de éste fantástico marco front-end.

Artículo original de Toptal.com

jueves, 2 de febrero de 2017

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

El artículo que vais a leer a continuación es original de toptal. Pincha aquí para visitar el artículo original y aquí para ver el original en inglés.

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.

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.

Artículo original de Toptal.

Newskill Shiuni, unas (casi) buenas gafas de realidad virtual.

Hoy os traigo una review de algo que me han traído los reyes. He de deciros que también se lo han llevado de vuelta, pero no por ello deja de ser un buen producto. Os contaré por qué a mi no me sirvieron y qué cosas me gusta más y menos de las gafas NewsKill Shiuni de realidad virtual.

Como ya no tengo el producto conmigo no os puedo poner fotos, pero espero que eso no impida comunicaros mis experiencias.

En general, la expereincia no ha sido mala. Las gafas son muy ergonómicas y todos los cierres son mediante imán, lo que se supone las dota de mayor durabilidad. Además, puedes ajustar la distancia entre ojos y tambíen el enfoque con varias ruedecitas que tiene en diferentes sitios. Considero que en ese aspecto están muy curradas. Alrededor de la zona donde se pone la cara están muy bien acolchadas y eso va de maravilla. No ves luz por fuera de las gafas ya que al estar acolchadas tapan completamente y, además, no dejan marcas y son muy cómodas y ergonómicas.

También permite retirar la solapa frontal para poder ver lo que tienes delante si necesidad de retirar las gafas de tu cabeza, aunque solo es verdaderamente útil cuando tiene un móvil pequeño.

Además, tiene a los laterales dos aperturas que están bien pensadas sobretodo para pasar alguna clase de cable como los auriculares y poder aumentar así la sensación de inmersión.

Incluyen un mando por bluetooth que (si funcionara bien) sería una gran maravilla. Teóricamente, puedes manejar tu dispositivo sin ningún problema con el mando, por lo que te ahorras quitarte las gafas cada vez que tienes que tocar la pantallita.

Los materiales de construcción son bastante buenos. Es plástico, por supuesto, pero no se notan para nada débiles y el sistema de agarre a tu cabeza es bueno. no se cae ni tiene apenas juego. Y, por supuesto, es ajustable.

Ahora bien, ¿por qué las he devuelto? Pues por varios motivos:

Ya os conté la semana pasada un poquito sobre mi difunto UMI, ahora tengo un Huawei Nova Plus y ojo, estoy contentísimo con él, pero tiene un gran defecto: carece de giróscopo. Esto no lo hace incompatible con la realidad virtual al 100 por 100, pero lo que pasa es que yo giro la cabeza y la imagen no gira, por lo que reduce en gran cantidad la sensación de inmersión.

Dejando aparte problemas de mi propio dispositivo móvil, las gafas tienen un error de diseño que me parece increíblemente nefasto. Se trata de la pinza que agarra el móvil. Dicha pinza hace presión para sostener el móvil en los dos laterales, y la mayoría de móviles tienen los botones de volumen y bloqueo/apagado en uno de los laterales. En mi caso lo he probado con el Umi Super, el Huawei Nova Plus que tengo ahora y el Aquaris E5 de mi cuñado y en todos pasa lo mismo: se queda presionado el botón de bloqueo y esto causa que el móvil se reinicie en modo seguro. Es una tontería, pero eso provoca que las gafas sean inutilizables a menos que tengas un dispositivo tipo LG k8 como el de mi hermana con los botones en la tapa trasera.

Además, otra tontería que se suma al resto, y es sobre el mando que traen estas gafas. No se si es que no se configurarlo, pero funcionaban solo dos botones y las funcionalidades que trae eran escasas para poder tener un dominio total del terminal con él metido en las gafas.

En fin, no es un producto que no recomiende por lo que he contado al principio: está bien construido, es ergonómico y en general es un producto de calidad, lo considero de los mejores en su función ya que puedes ajustar un montón de cosas que en otras gafas VR de menor precio o incluso del mismo rango resulta imposible. No obstante, al tener un dispositivo sin giróscopo (cosa que desconocía) y sumando el problema de la pinza que hace presión de los botones me vi obligado a devolverlas y, por desgracia, pasará un tiempecito hasta que siga teniendo experiencias con la realidad virtual, aunque espero que caigan las Oculus.

Nos vemos el próximo jueves. Hasta entonces, sed buenos (si se puede).

jueves, 26 de enero de 2017

Review tras 4 meses de mi (difunto) UMI Super

En septiembre de 2016 me compré mi primer móvil en china: el UMI Súper. Lo compré por Igogo y lo cierto es que estoy bastante contento. Bueno, debo decir que estaba, porque el 5 de enero de 2017 pasó a mejor vida tras un trágico accidente que ya os contaré más adelante.

Características:

Lo primero que debeis saber acerca de este termina.

Procesador: Helio P10. Octacore. 2 GHZ y arquitectura x64.
Ram: 4GB.
Almacenamiento: 32GB.
Pantalla: 5.5 pulgadas amoled. Es lo que más me gustaba de este móvil, y lo que más se rompió en el trágico accidente. Cristal 2.5D. Resolución Full HD (1920x1080)
Conectividad: 4G con banda 800. Bluetooth 4.0, wifi 802.11n. NO tiene NFC.
Batería: 4000 mAh.
GPU: Mali T860 MP2.

Apariencia exterior:

Es uno de los apartados en los que más destaca este terminal. Chasis unibody de metal (color dorado en mi caso). No es especialmente fino, pero es muy bonito. Tiene los botones de bloqueo y volumen en el lado derecho y en el izquierdo un botón que podemos configurar para abrir cualquier app y, sino, nos conmutará el modo de sonido/vibración (función que me gustó mucho y me resultó especialmente útil).

Si bien es cierto que a primera vista la pantalla es muy bonita y se aprecia el cristal 2.5D, os aseguro que no podeis esperar una calidad de 2.5D como la podeis esperar del Iphone. Se nota que es chino. Además, la pantalla se manchaba demasiado fácil, aspecto que me disgustó bastante (hasta que te acostumbras).

Apartado multimedia:

Si bien la pantalla es muy buena, no puedo decir lo mismo del audio. En cuanto a imagen puedo decir que es lo que más contento me tiene del móvil: una pantalla grande Full HD con buenos colores y brillo decente. Pero el audio se queda bastante corto. Es suficiente para ver tus vídeos en tu habitación, pero como salgas al exterior te quedas a dos velas. Y lo mismo le pasa al audio en las llamadas: se oía muy bajo, prácticamente era imposible hablar con algo de ruido alrededor típico de la ciudad.

Cámara:

Sin darle muchas vueltas puedo decir claramente que la cámara es lo peor que tiene este terminal. No es solamente que sea lo peor del movil, porque puede seguir siendo buena, sino esque es MALA MALA Y REMALA. No es que el sensor sea malo (que también), pero sobretodo el enfoque: como no estes totalmente quieto no saca una foto decente, sobre todo si es desde muy cerca. No me decepcionó mucho porque no es lo que buscaba, pero creo que por 200 euros puedes encontrar algo mejor si buscas cámara.

Rendimiento:

El punto fuerte de este terminal. Con tanta ram y el Helio P10 no esperaba que rindiera poco, pero si he de reconocer que rendía menos de lo que esperaba, sobretodo por la mala optimización. En fin, por un móvil de menos de 200 euros no está nada mal, pero todavía me estoy haciendo una pregunta: ¿para qué tanta ram? En serio, el Helio P10 no es un mal procesador para nada, pero sigue siendo un gama media. ¿Quien se monta un ordenador con un i5 y 32 gb de ram? A menos que vayas a darle un uso muy muy concreto no creo que sea una buena configuración, mejor meterle un i7 y 16gb de ram, ¿verdad?. Pues lo mismo, mejor habría sido tirar con 3gb de ram y por ejemplo, mejorar la cámara, que tener esta configuración. Pero no por ello estoy menos contento con el terminal.

 Batería:

Aquí tenemos varios temas curiosos. Con 4000 MAh tenemos para bastante. Pero he observado un problema que se da mucho en terminales chinos: consume muchísimo en IDLE. Dejo el teléfono por la noche bloqueado sin apagar al 60 por ciento y amanece al 40 por ciento... o menos. Hace no mucho leí que se había descubierto en terminales chinos un chip que enviaba información del usuario. Creo que atando cabos sin ser demasiado experto podemos llegar a la conclusión de que estos terminales están captando información y cuando lleva horas en reposo es cuando más envía para no afectar al rendimiento del terminal. No obstante, si apago el móvil por las noches, me aguantaba dos días sin problemas. De hecho, con el problema de la mala optimización en IDLE me daba la sensación de que cuanto más usara el móvil más duraba la batería, porque en serio, consumía muchísimo bloqueado.

 Sensor de huellas:

Es el primer terminal que me compro con sensor de huellas. El primer dispositivo que probé con esta tecnología fue el LG V10 y, desde entonces, no quiero otra cosa. Funciona muy bien: es rápido. Pero a veces se volvía loco. No se si fue por algún golpe que le hubiera podido dar pero muchas veces empezaba a detectar como si le estuvieras poniendo un dedo erróneo solo con tenerlo en el panatalon. Y claro, si le pones más de 5 veces (creo) un dedo incorrecto entonces lo inhabilita y solo te deja desbloquear mediante patrón o pin, lo que hacía que muchas veces me encontrara con que no respondía el sensor por esta situación. En definitva, no me parece un sensor malo, pero creo que todavía tienen bastatne que mejorar. Además de que no incorporaba gestos ni nada, que siempre va bien.

Conclusión y nota final:

¿Estoy contento? Sí, y mucho: nunca pensé estar tan bien con un móvil de menos de 200 euros. Además, el andoid puro le sienta que ni pintado. Nada de bloatware y va perfectísimo. Lo que me ha tirado mucho para atrás es la baja calidad que se nota en el terminal. Que si el lector de huellas da algunos problemas, que si hay algunas apps que a veces tenías que forzarlas a que se cerraran porque se pillaban, la mala optimización del terminal que tira toda la gran batería que tiene, el modo de transferencia de archivos que funciona cuando quiere... en fin, se nota que es un movil CHINO con todas las letras.

A continuación os expongo mis notas:

Nota general subjetiva: 6.5
Nota general objetiva: 5.5
Nota general sin evaluar precio: 5
Nota general con precio: 7
Nota media final: 6

¿Volvería a comparlo o lo recomendaría? sobre volver a comprarlo, pues seguramente no. No es que no sea recomendable, pero nunca me compraré dos veces el mismo móvil (salvo casos excepcionales) Ya que gastas dinero, creo que mejor es probar algo diferente. Pero la respuesta NO LO COMPRARÍA OTRA VEZ es genérica en mi caso para todos los móviles. Ahora bien, sobre recomendarlo, a 160 euros, pues claro que sí. Prefiero mil veces cualquier móvil chino por muchas chapuzas chinas que tenga a 160 euros que cualquier movil europeo que no te dan nada por 160 euros.

Y esta ha sido mi experiencia con mi difuntu UMI SUPER durante 4 meses, hasta que un coche decidió aplastarlo. Ya os contaré algún día cómo fue todo esto y también os anuncio que analizaré mi actual móvil: el HUAWEI NOVA PLUS. Más del doble de caro que el UMI y estoy encantado con él. Gracias a los Reyes Magos por traerme el móvil nuevo cuando se me rompió el UMI y gracias a tí por leerme. Espero verte en otro artículo y, hasta entonces, se bueno (si se puede).

jueves, 19 de enero de 2017

Chromecast: qué es, cómo se usa y cómo sacarle partido

Muchos de vosotros puede que tengáis un chromecast en vuetra casa (o varios, como yo). Otros no lo tendréis y alguno incluso no ha oído hablar todavía de este magnífico invento.


¿Qué es Google Chromecast?

De forma rápida: es un aparato que permite ver contenido por streaming en tu televisión, ya sea desde Youtube o cualquier url y también de contenido local desde un ordenador, Tablet o Smartphone.

Este chisme se conecta vía hdmi a tu televisor y se alimenta mediante un cable microusb. Se conecta a tu router y reproduce lo que tú le digas. “Pero esque yo tengo una Smart tv con la app de youtube” dirán algunos. Ya, pero este dispositivo te permite, por ejemplo, conectarte a streamcloud o powvideo y otros muchos tipos de servidores para ver tus series favoritas sin necesidad de aplicación para smartv y con conexión directa. Y lo manejas desde tu dispositivo móvil.
 
“Ah, entonces lo que haces es hacer un mirroring desde el móvil”. No. Bueno, puedes hacerlo, pero lo que más me gusta de este pequeñín es que se conecta directamente al servidor. Me explico: tú le dices que vídeo quieres ver de youtube y el chromecast se conecta a youtube y te muestra el vídeo. 

Desde el móvil puedes adelantarlo, atrasarlo, cambiar la calidad y todo lo que youtube siempre nos permite, pero no, no es un simple streaming de la pantalla de tu móvil. Esto significa que puedes dejarle a tus hijos la película de los Minions mientras tú estás en la cocina preparando una receta leyéndola en tu móvil porque, repito, NO ES UN STREAMING O MIRRORING DE LA PANTALLA DE TU MÓVIL.

¿Cómo se usa?

Para usar un chromecast primero debes conectarlo. ¿Cómo? A una entrada HDMI de tu televisor. 

Para alimentarlo trae un cable microusb como el de cualquier móvil. Mucha gente lo conecta al enchufe, pero mi recomendación es que lo conectes a un puerto usb de tu televisor (si lo tiene) ¿Por qué? Muy simple: porque si lo tienes enchufado en una regleta va a estar encendido 24 horas al día 365 días al año, a menos que lo desenchufes o sea una regleta con interruptor. Pero si lo conectas al usb del televisor se apagará cuando la televisión se apague y, cuando enciendas el televisor, se encenderá automáticamente. Creo que es la mejor forma.
 
Cuando tengas el aparato en tu televisor lo que debes hacer es cambiar el input al hdmi en el que hayas conectado el dispositivo y ya verás como aparece su fondo de pantalla. Pero todavía no puede conectarse a nada.

A continuación debes bajarte la aplicación Google Home. Al principio dicha app se llamaba Google Chromecast, después pasó a llamarse Google Cast y ahora se llama Google Home. Esta aplicación conectará tu Smartphone de forma directa con el chromecast recién estrenado. Es importante que sepas que este proceso solo se realiza la primera vez que se enciende el chromecast, por tanto, cuando termines de configurarlo, podrás desinstalar la aplicación de tu móvil. La primera conexión entre el Smartphone y el chromecast es directa mediante wifi, lo que significa que, mientras dure esta primera configuración, perderás la conexión a tu router wifi y no tendrás acceso a internet. Lo que harás a continuación será indicarle cuál es tu red wifi y la contraseña de conexión y, cuando termines, tu chromecast se conectará automáticamente a tu punto de acceso cada vez que se encienda para acceder a internet. Cuando termine este proceso de configuración tendrás acceso al chromecast desde TODO aquello que tengas conectado al router en tu casa.
 
IMPORTANTE: solo funciona en red local, por lo que si estás usando los datos del móvil y no lo tienes conectado al router no podrá encontrar el dispositivo.
 
¿Y ahora qué?

Ahora toca usarlo. Mi recomendación es que para ver cómo funciona pruebes primero con YouTube. Es la aplicación por excelencia para este aparatito. No es nada complicado: abres youtube, eliges el vídeo que quieres ver en tu televisión y buscar arriba a la derecha este logotipo:


Y te saldrá un cuadro de diálogo en el que puedes elegir a qué dispositivo enviarlo. Si solo tienes un chromecast parecerá un poco inútil, pero cuando tienes varios te recomiendo que les des nombres identificativos desde la aplicación de Google Home. Así, puedes enviar diferentes contenidos a diferentes chromecasts desde el mismo móvil.

Además, pueden enviar al mismo aparato varias personas. Por ejemplo: yo mando un vídeo de youtube y mientras se está viendo en la tele mi madre encuentra uno que nos quiere enseñar. Lo añade a la cola de reproducción y se van a ir reproduciendo ordenadamente. Simple, pero funcional, ¿verdad?
 
Bueno, después de trastear un poquito con youtube ya has conocido el famoso botón para compartir con chromecast, ¿verdad? Pues es muy fácil: toda aplicación que tenga ese botón te va a permitir “Chromecastear” sin ningún problema.

Aplicaciones para sacarle partido:

Hay muchísimas y no puedo ponerlas todas, pero haré una pequeña recopilación de las más famosas y más molonas para mí.
 
Ver contenido de canales con chromecast: la app de RTVE, Atresmedia, RedBullTV y muchos canales más tienen app que permite enviar contenido a chromecast. Se acabó tener que ir a por el portátil y conectarlo con un largo HDMI.
 
Netflix: por supuesto que no podía faltar esta aplicación. Si tienes cuenta de Netflix y no tienes una smartTv sería un poco complicado conseguir ver Netflix en el televisor, ¿verdad? Ahora ya no. Abres Netflix en tu Android, eliges el capítulo que quieres ver y pulsas el mismo botón que os enseñe en youtube… ¡y a viciarse se ha dicho! Si eres más de ver series y películas gratis tienes otras opciones que también te permiten chromecastear desde servidores gratuitos como Streamcloud, Powvideo y similares. Una de ellas es la aplicación de la web que más tiempo pasa caída del mundo: Pordede. También tienes otras como PelisDroid y SeriesDroid, aunque estas no puedes instalarlas desde el play store. En fin, cuentas con un sinfín de posibilidades.
 
Autodesk Pixlr: sí, la famosa herramienta para editar fotografías tiene aplicación en Android que te permite usar grandes pantallas gracias al Chromecast.
 
AllCast: ¿Quieres enviar contenido local de tu Smartphone y no sabes cómo? Esta app es la que buscas. Y esto es lo que hace: es un reproductor de contenido que lo envía a chromecast. Así de simple y exactamente igual que Youtube o Netflix, pero con las fotos y vídeos de tu propio dispositivo.
 
Spotify: diría yo que esta app es más para Chromecast Audio, pero esque tener un chromecast que solo permite reproducir audio no termina de convencerme. Muchos de nosotros tenemos nuestra TV con un buen home cinema y en los sábados de limpieza nos gusta poner musicote, ¿verdad? Ahora es superfacil: seleccionas las canciones o listas de tu spotify como si fueras a escucharlas en el móvil pero… se reproduce en la tele. Si la tienes con el home cinema conectado lo vas a petar y puedes seguir trasteando todo lo que quieras. Tienes un mundo completamente abierto.
 
Just Dance Now: si, ahora no hace falta tener la Wii para jugar con tu cuñada en nochevieja al justdance, si es que quieres bailar algo con ella. Simplemente bajaros la app y tenedla en la mando durante el baile y que uno de ellos conecte a chromecast: la diversión está asegurada. Aplicación oficial de Ubisoft en el playstore.
 
Educakids: para los más pequeños. Esta compañía proporciona un sinfín de juegos infantiles que además permiten jugarse en multijugador con varios dispositivos. Otras como Castpad convierten nuestra TV en una enorme pizarra para dibujar.
 
Y hasta aquí es suficiente. Has aprendido cómo conectar tu chromecast, como usarlo y cómo sacarle partido. Espero que te haya servido de ayuda. Nos vemos en otro artículo y, hasta entonces, sed buenos (si se puede).

jueves, 12 de enero de 2017

Perdonad el retraso, pero FELIZ 2017

Sí, se que llevo varios jueves sin escribir, pero es lo que hay. Lo siento, lo siento y LO SIENTO. Pero decidí (sin aviso) tomarme una pausa. ¿Por qué? Por muchas cosas. Primero porque el final del cuatrimestre ha sido duro y además hemos estado hasta arriba en el trabajo, y todas las cosas que, junto con las obligaciones familiares y personales, me han llevado a parar de escribir un tiempecito para dos cosas principales: dedicarme a lo realmente importante y, además, pensar un poquito sobre el camino que lleva este blog.

Antes de nada quisiera daros las gracias porque ya llevamos más de 40 mil visitas en el blog. Hace no mucho os agradecí las 20 000 y ¡ya hemos duplicado!

Lo que no se han duplicado han sido los beneficios, y esque solo llevo 5 euros ganados, pero esto me gusta y creo que vale la pena, sobretodo viendo el ritmo que lleva.

A principios de temporada os escribí contandoos qué objetivos había marcado. Por ahora pocos se cumplen, yo ya sabía de antes que seguramente gran parte de ellos los iba a arrastrar para la temporada 2017 - 2018. Ya estoy empezando la recta final en la universidad y, si bien espero que el año que viene sea mucho más liviano, este año está siendo algo duro, ya que cogí todo lo bestia para quitármelo ya de encima, y sin tener todavía en cuenta que ya tengo además trabajo estable.

Pues bueno, la falta de tiempo (y tambíen de ideas en muchas ocasiones) me ha llevado a tener abandonado el canal de youtube que tanto ahínco puse para arrancarlo. Los dos primeros vídeos fueron bastante bien recibidos: respondí comentarios y ayudé a alguna persona. Pero los vídeos representan 2 problemas principales para mí: el primero es el gran tiempo que consumen y el segundo, pero no por ello menos importante, la dificultad de hacer buenos vídeos con una cámara que tiene bastantes años en una habitación muy muy pequeña y sin ni siquiera un trípode para sostener la cámara. En fin, lo quiera o no, creo que 2017 no va a ser mi año en youtube. No sé como haré pero seguramente tenga que renovar parte de mi equipo y, teniendo en cuenta lo poco que espero sacar, todavía no he decido si me renta renovar cámara y gastar en accesorios como trípode, luces y todo eso.

Además, otro objetivo era trasladar la web a un hosting privado y con dominio propio, y aquí no es por dinero, sino por tiempo: instalar todo y preparar la plantilla supone mucho trabajo y, por lo menos hasta casi verano, no creo que me ponga a ello seriamente. Lo que sí os quiero dejar claro es que, aunque no se cumplan, sí van a seguir en pie estos objetivos. No sé que me va a traer la vida este año pero intentaré sacarlos como buenamente se pueda.

Y si algo me ha enseñado la vida es que no todo son malas noticias. He tenido una nueva idea que no estaba en los primeros objetivos y creo que la voy a aplicar: los podcast. Llevo poco tiempo escuchándolos y creo que me gustan. Además, son mucho más sencillos de editar y producir que un vídeo, y también requieren de una inversión mucho menor. Eso sí, debo tener en cuenta que no cualquier contenido es el más apropiado para los podcasts, pero estoy animado. Ya me he creado cuenta en Ivoox y espero empezar a subir podcasts durante las próximas semanas.

Por hoy no tengo mucho más que contaros. Simplemente comunicaros mis mejores deseos para este año que acabamos de empezar y daros las gracias por el año que hemos abandonado. Espero seguir al pie del cañón y que esto siga creciendo, por lo menos, como lo ha hecho hasta ahora. Nos vemos el próximo jueves. Hasta entonces, sed buenos (si se puede).