Como unir AngularJS y Cordova para generar aplicaciones móviles (parte 2)

Y aquí seguimos… dos entradas seguidas… guau…

Venimos de Como unir AngularJS y Cordova para generar aplicaciones móviles (parte 1) y vamos a continuar donde lo dejamos.

Hasta el momento hemos creado los dos proyectos y unido los archivos base package.json.

Ahora es el momento de continuar.

Para que todo funcione, hay que hacer un par de modificaciones en unos archivos de angular.

En el archivo main.ts del proyecto de angular, hay que modificarlo de tal forma que quede similar al siguiente:

Con esto le indicamos que Angular estara atento al evento onDeviceReady que se generará en la aplicación móvil. Y le indicamos que fije un vigilante (listener) al evento “deviceready”.

Despues, deberemos ir al index.html y efectuar un par de cambios. El primero es cambiar la etiqueta “base” para que la ruta haga referencia al directorio actual donde se encuentre la aplicación (esto tiene sentido ya que utilizará la carpeta donde se instale la aplicación en el dispositivo). Así que hay que hacer que quede así:

Despues debemos añadir la referencia al archivo “cordova.js” que será el encargado de proporcionar la interfaz con todos los plugins de Cordova y al dispositivo.

Con estos pasos ya estaríamos en condiciones de compilar y probar la aplicación, por lo que será necesario instalar todas las dependencias de node, compilar angular, añadir las plataformas a probar en cordova y compilar o correr el proyecto. Los pasos básicamente con los siguientes comandos (1 linea por comando)

Si queremos probar en modo local, se puede ejecutar un servidor local que correrá en el puerto 8000 con

Si tenemos un dispositivo (Android por ejemplo) conectado al pc y con la depuración y demás requisitos instalados, y queremos ejecutar la aplicación sobre el, se puede ejecutar el siguiente comando.

A partir de este punto entramos en las consideraciones para el desarrollo, aquí es donde probablemente haya quien lo haga de forma diferente y mejor. Yo por mi parte para ir haciendo los cambios y poderlos observar lo que hago es situar a angular en modo compilación continua cada vez que detecta cambios en el código fuente con:

Despues arranco el servidor Cordova con el comando anterior serve, y lo que hago es que cada vez que hago algún cambio relevante y quiero probarlo en cordova, ejecuto el comando

O bien si solo voy a colocar una plataforma (Android por ejemplo)

Y después, según la plataforma, o bien ya puedo comprobarlo directamente (en el navegador) o vuelvo a ejecutar el run del dispositivo.

Nota: Un último apunte. Si teneis instalado el sdk de android y teneis algún android virtual, el siguiente comando arranca ese dispositivo virtual para poder efectuar el desarrollo si no teneis uno físico disponible.

En otra entrada continuaré con este desarrollo, y escribiré sobre cómo he conseguido hacer una integración continua con este proyecto, Visual Studio Team Services y HockeyApp, para poder tener Integración continua con el repositorio y poder distribuir las apps que se hagan por los betatesters antes de subirlo a las tiendas. Ese paso también lo abordaré… cuando aprenda a hacerlo jeje…

¡Muchos saludos y gracias por leerme!

Como unir AngularJS y Cordova para generar aplicaciones móviles (parte 1)

Si que hace tiempo que no escribía…

Bueno, hoy vuelvo con un pequeño tutorial en castellano sobre como conseguir un proyecto Cordova (https://cordova.apache.org/) que podamos utilizar con los componentes de angular. Se que hay tutoriales muy buenos por ahi (de hecho así lo conseguí yo) pero os voy a contar mi experiencia. La mayoría de los tutoriales que encontraba son para frameworks como Ionic, React, NativeScript… pero no encontraba una formula sencilla de como conseguir lograrlo solo con Cordova y Angular. Así que aquí os cuento mi pequeña peripecia.

Basándome en éste artículo (https://medium.com/@nacojohn/convert-your-angular-project-to-mobile-app-using-cordova-f0384a7711a6) conseguí hacerlo funcionar. Os voy contando los pasos.

Creación de los proyectos.

Lo primero es tener Angular, Cordova y las herramientas necesarias. No me extenderé, pero básicamente es seguir los pasos de aqui, aqui y aqui.
Como siempre, os voy a contar mi experiencia, puede que a alguno los pasos que sigo no le parezcan lógicos o los haga de otra manera.

Bien, vamos a partir del caso de que queremos crear una aplicación nueva (después abordaré el caso de una migración)

Lo primero será crear los dos proyectos (uno para cordova y otro para angular), así que en una carpeta que vamos a utilizar temporalmente como mezclador creamos los dos proyectos.

Con este comando creamos el proyecto de cordova. Sus particularidades son:
El primer parámetro “proyecto” es el nombre de la carpeta donde se creara el proyecto de Cordova.
El segundo parámetro “com.example.hello” es el identificador de nuestra app (un identificador para distinguirla en los dispositivos y stores)
El tercer parámetro “NombreProyecto” es el nombre que se le dará internamente a la aplicación.

ng new PROYECTO_ANGULAR

Con este comando generamos el proyecto de Angular, unicamente le damos el nombre de la carpeta donde se va a crear.

Uniendo Angular y Cordova.

Bien, ahora es cuando comenzamos la magia.

Lo primero será unir los dos proyectos en una carpeta. Para ello, al menos en mi caso, lo más sencillo es coger todos los archivos del proyecto de angular, salvo las carpetas node_module, dist, y los archivos package.json y package.json.lock. Estos últimos efectuaremos una unión “manual”.

Así que, en la carpeta del proyecto cordova, que tendrá un aspecto parecido a este:

Copiamos todos los archivos del proyecto angular menos los comentados (los marco los que no hay que copiar):

Y acabaremos con algo así:

Vale, ahora continuemos.
Cordova utiliza la carpeta “www” para obtener los archivos html, javascript, css, etc… que después traspasa a las diferentes plataformas (android, ios…). Así que nuestra misión es hacer que cuando Angular compile los archivos los haga en esta carpeta. Por defecto genera una carpeta “dist”, pero esa configuración está en el archivo “angular.json”, así que entramos a editarlo y debería quedar algo parecido a lo siguiente:

Como podeis ver, hemos referenciado todo lo que antes dijera “PROYECTO_ANGULAR” por “proyecto” (el nombre de la carpeta donde está cordova)

Ahora es el momento de combinar los dos package.json. El de Cordova es como el siguiente:

Y el de Angular es como este:

Al final debería quedar algo similar a lo siguiente:

Y con esto ya tendriamos unidos los dos frameworks para poder trabajar.

Como me está quedando un poco largo, voy a divir el artículo en dos. En la siguiente parte efectuaremos la instalación de todas las dependencias y las pequeñas modificaciones que hay que hacer para que Angular acepte los eventos de Cordova.

Hasta pronto!

Laravel: error stream_socket_enable_crypto(): al tratar de usar certificados autofirmados

Buenas a todos.

Continuando con el desarrollo con Laravel 5.4, me encontre en la tesitura de usar desde la máquina de desarrollo el poder enviar correos electrónicos con el protocolo smtp.

Buceando por la red un buen rato, la solución la encontré aquí.

Y básicamente consiste en añadir las siguientes opciones al archivo “config/mail.php” de Laravel.

Con esto, conseguiremos que no se haga la comprobación completa del certificado (especialmente para certificados auto-firmados), pero si que se efectue la negociación de la conexión cifrada.

Espero que os sirva de ayuda.

Angular. Consumiendo la API para el login

Seguimos en liza. En las entradas anteriores vimos como configurar las rutas para poder separar nuestro proyecto en la parte “frontend” o la que vera el usuario, y la parte “backend” o zona de administración de los contenidos. También configuramos nuestra app para poder tener las variables de entorno separadas en desarrollo y producción.

Hasta este momento, a la hora de buscar un usuario correcto, utilizabamos dos direcciones de correo y sus contraseñas “hardcodeadas” en el archivo de login.

Esto, evidentemente, es mala idea, lo que necesitamos es que nuestros usuarios puedan entrar con las credenciales que tengan en la base de datos. Y para ello vamos a consumir nuestra api Laravel que hemos ido desarrollando.

Una vez tenemos configurados los entornos, es hora de comenzar a consumir nuestra API de Laravel, comenzando con la llamada de login de usuario.

Para ello, realizaremos algunos cambios.

Servicios.

Primero crearemos un nuevo servicio llamado “user.service.ts”, que contendrá la clase para los datos del login. Dicho archivo quedará así:

Despues, en login.service.ts, realizaremos algunos cambios. Comenzaremos por adecuar los imports:

Despues la clase y el constructor, donde añadiremos el objeto http para poderlo utilizar en la llamada a la api:

Ahora, y por no cambiar de momento el orden de las funciones con respecto al momento anterior del login, para no perdernos, adecuamos la función logout, de tal manera que borre los datos que se recogieron al conseguir un login correcto.

Y ahora viene el login. Hay varios cambios con respecto al anterior. Donde antes unicamente se comprobaba si los datos estaban en el array de usuarios que teniamos hardcodeado, ahora es necesario realizar una petición http a la api para que nos devuelva los datos adecuados del usuario o bien un error de existir algún problema.

Para ello, en la funcion, conformamos las cabeceras (headers), el cuerpo (body) y las opciones de la petición (request) que vamos a efectuar, y esperaremos que nos devuelva una respuesta (response) que será la que trataremos.

Hasta aquí es sencillo, ¿no?. Bueno, el cambio mayor en esta funcion es que la función login(user) pasa a ser una promesa (promise) de angular. Y esto es así porque necesitamos que se efectue el login y que según el resultado la aplicación efectue una acción u otra. En otros momento que se necesiten cargas asincronas de datos, será posible usar los Observables de Angular, pero, en mi humilde opinión, en este caso que se necesita disponer de la respuesta a la petición para poder tomar una decisión sobre si dejar actuar al usuario o no, es mejor utilizar una Promise, que nos permite esperar la respuesta de una forma más sencilla, ya que tiene dos eventos (reject y resolve) para las situaciones de error y satisfactorias, que nos permitiran tomar las decisiones adecuadas para el caso.

Para ello, al declarar la función login(user) le añadimos que sera de parametro Promise<any>.

La función queda así (ahora sigo desgranandola):

Cómo se puede observar, se genera el usuario a realizar el login (usertologin), se generan las cabeceras, cuerpo y opciones para la petición (headers, body y options), y se efectua la petición http, y su respuesta es la que se devuelve como resultado de la función. Si se observa la implementación, se utiliza la petición http también como una promesa al ponerla el modificador .toPromise(), y se utilizan los bifurcadores .then() y .catch() para recibir el resultado, bien satisfactorio o bien de error, y se envían a dos funciones auxiliares que trataran los datos.

Y las funciones auxiliares quedan como sigue:

Esta función ya la utilizabamos para decidir si volviamos al login porque el usuario no estuviera guardado en memoria, y de momento no se ha cambiado.

En esta funcion resolvemos el error que nos haya podido dar la petición. En este caso lo que hacemos es escribir en la consola el error (recomiendo comentar esta línea antes del paso a producción), y devolvemos el rechazo de la promesa y devolvemos el error, que ya viene personalizado de la api para los casos adecuados.

Y esta es la función de login satisfactorio. Como veis es similar a la anterior, pero esta vez resolviendo la promesa satisfactoriamente y devolviendo los datos de usuario para que sean tratados.

Componente.

Ahora, en el componente de nuestro formulario de login, que controla su funcionamiento, es donde le diremos que debe hacer con estos nuevos datos, y lo adecuaremos a la nueva situación.

Como se puede observar, lo que se ha hecho es utilizar la llamada al servicio para generar una respuesta, y en función de los datos obtenidos, bien redirigir al usuario al inicio de la administración, o bien presentarle un mensaje de error en el formulario, para que pueda observar que está mal introducido o si ha habido algún otro error.

Y con esto estaremos en disposición de continuar.

Nota: Es posible que os encontreis con problemas de CORS (recursos remotos) cuándo trateis de hacer el login y lo esteis viendo en las consolas de los navegadores. Vereis que los clientes REST que utiliceis funcionan correctamente, pero el login de nuestro servidor de desarrollo angular (localhost:4200, el creado con npm start) no hay forma de hacerlo andar. De forma rápida, aunque no es lo adecuado en sitios de producción, lo que debeis hacer es que en el servidor que este sirviendo la api (iis, apache, nginx, etc) hagais que para la api siempre mande la cabecera “Access-Control-Allow-Origin” con el valor “*”. y que os instaleis una extensión en el navegador que os permita activar o desactivar el CORS a voluntad.

 

Angularjs: Añadiendo Jquery y Bootstrap.

Vamos a empezar a ver el desarrollo de nuestra webapp para el frontend del proyecto.

En la sección anterior instalamos las herramientas necesarias, y ahora vamos a empezar a modificar para ir viendo los cambios.

Os recomiendo seguir este curso: https://www.udemy.com/curso-de-angular-4-desde-cero-hasta-profesional/. Yo únicamente iré comentando aquí las cosas que sean específicas para el proyecto que estoy desarrollando en estas entradas.

El primer paso para nuestro proyecto, es asegurarnos de que todas las dependencias están colocadas correctamente. Por si acaso no estuvieran, instalamos jquery y bootstrap en nuestro proyecto, de esta forma:

Despues modificaremos nuestro archivo “angular-cli.json” y añadiremos las siguiente dependencias de css en la sección styles:

En este momento, si ejecutamos un “npm start” el proyecto ya tendrá las dependencias colocadas.

Para comenzar, vamos a implementar una plantilla base de boostrap, para ver que todo está correcto. Así que modificaremos el archivo “app.component.html” para que tenga el siguiente contenido:

Y cambiaremos el archivo “styles.css” que incluye con el siguiente contenido:

Con esto habremos personalizado la base, pero ahora vamos a incluir la barra de navegación de bootstrap. Para ello crearemos un nuevo componente con el comando  ng generate component frontend/nav (la parte “frontend” no es necesario incluirlo para que nos genere el componente, pero yo lo incluyo porque voy a diferenciar los componentes que pertencen a la parte “frontend” o “pública” de la app, y a los componentes de una sección “backend” o de “administración”.

Una vez creado el componente nav, lo incluiremos en la web, modificando el archivo “app.component.html” e incluyendo en el  <app-nav></app-nav> antes de la apertura del div “container”, quedando el archivo de esta forma:

Una vez hecho esto, veremos una frase “nav works!” por encima del contenido que teniamos antes.

En este momento modificaremos el archivo “nav.component.html” para que tenga el siguiente contenido:

Y con esto en el navegador podremos comprobar que se ha añadido la barra de navegación con los estilos de bootstrap.

¡Estamos listos para continuar! y empezar a definir los componentes de la parte pública.

Laravel 5.4: Securizando la API

Bueno, de las entradas anteriores ya tenemos listo el CRUD de usuarios y las rutas para las llamadas.

Ahora voy a seguir las indicaciones de https://styde.net/api-rest-con-laravel-5-1-proteccion-con-access-key/ para poder securizar la API.

Una vez seguidos los pasos de este tutorial para generar la access key de toda la aplicación y securizarla de manera que nadie que no tenga esa clave la pueda utilizar, es el momento de generar la llamada de login para que un usuario pueda loguearse en la aplicacion con una llamada y recibir un access token que le sirva para poder utilizarla.

Cuándo se creó la tabla de usuarios, se añadió un campo de “api_token” que se autogeneraba cuando se guardaba el usuario por primera vez, así que ahora es el momento de generar la llamada de login. Si recordais del paso anterior, en el archivo “routes/web.php” ya incluimos la ruta de login, para estas llamadas.

También os puede pasar que, despues de seguir los pasos del tutorial de styde.net, os esteis encontrando que las llamadas os devuelven un 401 not authorized si intentais las llamadas sin incluir el access token que ahí está generado.

Pero vamos por pasos. Lo primero es generar el controlador y el modelo que usaremos para el login

E incluir la función login() en la clase del controlador, y el modelo, por lo que quedaría así:

Si estamos siguiendo los pasos, ahora mismo al probar la url de login nos pueden pasar dos cosas: o bien nos de el ok sin contenido, o bien nos de un 401 not authorized. Esto ultimo se debe a la comprobación que hace la clase “VerifyAccessKey” que generamos para securizar la API. Lo que tenemos que conseguir es que no haga esta comprobación si las rutas de uso son “/” o “/v1/login”.

Para ello, tendremos que modificar lo siguiente (o al menos lo que a mi me ha funcionado):

En App\Http\Kernel.php, ha quedado así:

En App\routes\web.php, modifcar el grupo para el prefijo “v1”, ha quedado así:

En App\Http\Middleware\VerisyCsrfToken.php, añadir al array $except la ruta de login:

Ya tenemos la api segura para las llamadas que no sean la raíz y el login. Ahora es el momento de que ese login haga algo. Únicamente va a tener una funcion login para hacer la petición, y devolverá 3 datos para que sean guardados en la sesión del usuario.

LoginController.php

Models/Login.php

Con esto ya tenemos hecho el login y el usuario recibe un token para poder interactuar después con el resto de la API.

En este punto, hemos de cambiar el verificador de token. Al final queda de esta forma:

Y tras esto habra que modificar y probar adecuadamente el controlador de usuarios para ver que todas las llamadas se producen correctamente y ver que si no está el token no funciona y no autoriza a efectuar la operación.

Por hoy es suficiente…

Laravel 5.4: Comenzando API. CRUD Usuarios

Continuamos con este “cursillo – aprendizaje” sobre crear una aplicación con Laravel y Angular.

Lo primero con lo que vamos a comenzar es con las operaciones CRUD básicas para los usuarios de la aplicación.

Lo primero será crear el controlador que usaremos para estas funciones, para lo que será necesario ejecutar el siguiente comando:

Con el modificador  –resource conseguiremos que nos cree el controlador con un esqueleto basico de todas las funciones básicas para el manejo de los usuarios (aparte de las CRUD, las necesarias para manejar las vistas y formularios relacionados con la creación, update, etc).

Una vez conseguido esto, editaremos el archivo routes\web.php y añadiremos lo siguiente:

(si, de momento lo vamos a meter en la ruta web, para irlo probando, más adelante lo ingresaremos en una api con autenticación).

Con este código conseguimos que se reconozcan las rutas necesarias para las operaciones. Como en este caso estamos creando una api que no tendrá “vistas” (formularios o webs que ver) podemos obviar rutas y decirle que únicamente utilice las relativas al CRUD.

También hemos de crear el modelo. En este momento voy a ir creando modelos (aunque se pueden usar factorías y demás opciones, eso ya lo dejo de momento a la investigación de cada uno, o para más adelante). Para ello el comando es

Nota: un apunte, si ejecutamos directamente el comando de crear modelo con el modificador resource, como en el controlador, ya nos creara el modelo y el controlador enlazados (lo cual nos agilizará un poco estos pasos)

Y ahora hay que meterse en harina.

Con el siguiente comando podemos ver una lista de las rutas que están incluidas en este momento. Así veremos los métodos y opciones que se van a utilizar para las operaciones.

Y ahora se tratará de ir modificando las funciones en el controlador y o el modelo para ir adaptando el control de usuarios.

Dejo por ejemplo el código (sin finalizar) de la función de guardar un usuario

Tras modificar todas las funciones, estaremos listos para el siguiente paso Smile

Error con Git: “Cannot access URL return code 22”

Una de las cosas que os pueden ocurrir al trabajar con git es que os salga este bonito error “Cannot access URL return code 22” .

Antecedentes:

  • El repositorio no está en GitHub, sino en un repositorio personal.
  • El repositorio fue creado con Virtualmin, con la sección de “Git Repositories” de un dominio.
  • Tratais de hacer un push para subir los cambios.

Tratando de buscar la solución, la he encontrado con StackOverFlow: http://stackoverflow.com/questions/5264949/cannot-push-git-to-remote-repository-with-http-https

La solución es editar el archivo config que está dentro de la carpeta .git del repositorio local.

Y donde pone:

Cambiarlo a:

Es decir, añadir el usuario y la contraseña que se van a usar para acceder al repositorio.

Entonces ya si que funciona un  git push origin master.

 

PHP 7 y MySQL

Apunte rápido.

Si se hace una migración de versión a PHP 7, hay una cosa que se ha de tener en cuenta en los desarrollos.

Hasta ahora había 3 formas principales de acceso a los datos de MySQL, el driver mysql, el más moderno mysqli, y a través de PDO.

Si os encontrais con desarrollos que utilicen el viejo driver mysql, dejarán de funcionar muy probablemente todos esos maravillosos objetos y funciones que obtengan los datos de MySQL.

La solución pasa por cambiar el código para usar alguno de los más modernos. Si no quereis complicaros mucho la solución sencilla (al menos para mí) consiste en cambiar en el código la el texto “mysql” por “mysqli”.

Sin embargo, no funcionará solo con ese cambio. Hay que tener en cuenta que para las funciones de selección de juego de caracteres y recuperación de datos necesitarán que se les incluya la conexión.

También, para mejorar el proceso, en PHP7 deja de permitirse el generar el constructor de un objeto utilizando como nombre de funcion el nombre de la clase, pasando a tener que utilizar un metodo “__construct”.

Aquí os dejo un pequeño ejemplo:

class bd{
var $host;
var $conexion;
var $bd;
var $usuario;
var $clave;
var $tipo;

/*metodo contructor que carga los datos de la conexion. Este ya NO ES VALIDO*/
/*
function bd(){
global $bdhost;
global $bdnombre;
global $bdusuario;
global $bdclave;
$this->host=$bdhost;
$this->bd=$bdnombre;
$this->usuario=$bdusuario;
$this->clave=$bdclave;
$this->tipo=”mysqli”;
$this->conexion=mysqli_connect($this->host, $this->usuario, $this->clave) or die (mysqli_error());
mysqli_set_charset($this->conexion, ‘utf8’);
mysqli_select_db($this->bd, $this->conexion) or die(“Error en la selecci�n de la base de datos”);
}//contructor
*
*/

function __construct(){
global $bdhost;
global $bdnombre;
global $bdusuario;
global $bdclave;
$this->host=$bdhost;
$this->bd=$bdnombre;
$this->usuario=$bdusuario;
$this->clave=$bdclave;
$this->tipo=”mysqli”;
$this->conexion=mysqli_connect($this->host, $this->usuario, $this->clave) or die (mysqli_error());
mysqli_set_charset($this->conexion, ‘utf8’);
mysqli_select_db($this->conexion, $this->bd ) or die(“Error en la selección de la base de datos”);
}//contructor

/*funcion que ejecuta una sentencia sql sobre la base de dato y devuelve la consulta a dicha base*/
function query($sql){
$query=mysqli_query($this->conexion,$sql) or die(“Error MySql: “.mysqli_error().” “.$sql);
return $query;
}//query

/*funcion que devuelve el numero de filas cuando se le pasa una consulta generada por sql*/
function num_rows($query){
$num_rows=mysqli_num_rows($query);
return $num_rows;
}//num_rows

/*funcion que va sacando los datos con formato de array asociativo de una consulta generada por sql
la cual se le pasa, cada vez que se le llama avanza una fila*/
function fetch_array($query){
$fila=mysqli_fetch_array($query);
return $fila;
}//fetch_array

/*funcion que va sacando los datos con formato de objeto de una consulta generada por sql
la cual se le pasa, cada vez que se le llama avanza una fila*/
function fetch_object($query){
$fila=mysqli_fetch_object($query);
return $fila;
}//fetch_object

/*funcion que libera el buffer de la consulta generada por sql que se le pasa*/
function free_result($query){
mysqli_free_result($query);
}//free_result

/*funcion que cierra la conexion de la base de datos*/
function cerrar(){
mysqli_close();
}//cerrar conexion
}//class bdwd
?>

Virtualmin mod_fcgid error: No se ejecuta el código php.

Hoy volvemos con una nota rápida.

Para aquellos que uséis Virtualmin para configurar vuestros servidores, si os ocurre como a mi, que tras instalarlo en un servidor y recuperar una copia de seguridad anterior cuando intentáis acceder a los sitios que teníais configurados os da para descargar el archivo php en vez de ejecutarlo, os puede suceder por lo siguiente:

Comprobad que:
En la parte de “Opciones del website”, dentro de “Configuración del servidor” dentro del dominio…

image

Estan las opciones como os muestro:image

Después, y esto es lo que me dio guerra, y al final he encontrado la solución en https://www.virtualmin.com/node/25521, y aquí os muestro los pasos:

  1. imageDirigiros a “Configurar Website” dentro de “Servicios”, en el dominio.
  2. Entráis a “Editar Directivas”, que se muestra con este icono.image
  3. Comprobad si en el archivo del dominio se encuentran las siguientes líneas:
    RemoveHandler .php
    RemoveHandler .php5
    php_admin_value engine Off
    y si es así, eliminadlas.
  4. Recargad el servidor Apache y a correr.

Colaborando con Freddy Varó.

Viejos amigos, nuevos proyectos.

Desde hace unas semanas vengo colaborando con el mago profesional Freddy Varó,

Principalmente es sobre todo ayuda técnica, orientada a las necesidades tecnológicas y cotidianas que le pueden surgir a cualquier profesional, tanto de la rama de espectáculos como de cualquier otra.

Toda compañia es buena si sirve para crecer e ir aprendiendo, y la verdad es que con Freddy he ido descubriendo algunas cuestiones que interesan a la hora de crecer y plantear nuevos retos.

Y desde luego, en el plano profesional, es un auténtico “crack”. Todas sus actuaciones estan preparadas a conciencia y consigue algo complicado, que niños y mayores estén pendientes de su actuación hasta el final. Siempre sorprendente y siempre agradable.

Os invito a visitar su página o a seguirle en Facebook o Twitter y enteraros de todas sus novedades.

Vladimir-Magic-Portada

Windows 8 Release Preview

Bueno, pues después ya de unos días usando el nuevo retoño de Microsoft, puedo empezar a dar opiniones sobre lo que me va surgiendo…

De momento iré desgranando los pasos que me he ido encontrando desde que empecé a instalarlo.

Lo primero comentar el equipo en el que esta instalado:

QuadCore Q6600, 4 GB Ram en módulos de 1 GB, Placa base Asus P5K Pro, Nvidia 8800 GT, Discos duros SATA y Grabadora DVD SATA (en los discos diré que hay ahora imagemismo 1 de 250 gigas y 3 de 80, todos SATA, Controladora de placa en modo normal, ni AHCI ni RAID). Para las configuraciones actuales, un equipo normalito tirando a modesto.

Instalación.

No presentare pantallazos al haber ya demasiados desperdigados por la red. Baste decir que es virtualmente idéntico al de Windows 7. Eso si, mi impresión es que fue considerablemente más rápido, en apenas 20 minutos estaba ya en la pantalla de encendido de usuario.

Integración a un dominio existente: fluida igual que Windows 7, y con el manejo debido al mismo, es decir, excelente. Huelga decir que no lo he probado sobre un Windows Server 2012, sino sobre un W2008 R2 Foundation.

Drivers, etc… El único que me esta chirriando es el de la impresora, una Epson SX110, el driver de digitalización lo ha cogido correctamente, pero el de impresión no puedo utilizar el de la marca, que utilizaba en Windows 7 porque todo el rato me dice que no es un controlador firmado y no me deja instalarlo… Tendré que investigar un poco mas como conseguirlo. Ya he intentado varias soluciones y nada, no se deja. Huelga decir que el mismo controlador, en un ordenador W7 unido al dominio si me dejaba instalarlo.

Interfaz.

Antes de ir diciendo lo que me gusta y lo que no me gusta de todo esto, os recomiendo leer este artículo de genbetadev. Lo suscribo prácticamente en su totalidad, por lo que escribir dos veces lo mismo no sería productivo.

Pero si voy a comentar varios detalles.

Uno de ellos el que podéis ver en la imagen, el gestor de copia de archivos… ya no salen chorrocientas ventanitas por todas las tareas de copiado del sistema, sino que salen todas organizadas y con una vista de datos, archivo y velocidad muy curiosa y visual, así como herramientas para poner esas copias de archivos en PAUSA (parecerá una tontería, pero tener que utilizar herramientas de terceros para algo tan simple chirriaba un poco la verdad).

Otro detalle que me ha gustado al menos de momento es el asunto de las “Charms" laterales. De momento el mayor uso que le he visto es poder tener el Messenger abierto (con la aplicación Mensajes) pero era algo que echaba de menos alguna vez, el hecho de poder estar atento a una conversación mientras sigo en el resto de la pantalla usando el resto de aplicaciones.

Ribbon en el explorador: se han escrito ríos de tinta ya sobre este tema, que si gusta, que si no gusta. ¿Mi opinión? Me gusta. Permite hacer cosas con mayor rapidez, y aun estoy en el proceso de adaptación (aun hago muchas cosas que permite Ribbon con el botón derecho del ratón, cuestión de costumbre…)

Fluidez, estabilidad, de momento la misma que tenia Windows 7, si que es verdad que, al menos con mi configuración hardware, parece que le sienta bien el cambio, es más estable y fluido (incluso siendo una beta).

Problemas.

No todo iba a ser jauja… y si, me he encontrado con algunos problemas, aunque más que del propio Windows, de algunas aplicaciones, y sobre todo hay una que chirria mucho que falle de esa forma en Windows 8 dada la alianza y compra de su empresa matriz por Microsoft.

Y el ganador es… SKYPE. Veamos señores de Skype, su aplicación falla mas que una escopeta de feria, consume los recursos a punta pala, y deja el sistema tonto la verdad. Si, es la ultimísima versión instalada y descargada desde sus servidores y me deja el uso de CPU para el proceso skype.exe a un 25% todo el rato (y a picos de más, es decir, que se coge uno de mis 4 núcleos para el solito) y eso sin conseguir hacer un login correcto.

Y no lo digo de broma, mirad, versión de Skype 5.9.0.115:

image

Conclusión.

Todo lo que voy a decir aquí esta basado en los días de uso que llevo, por lo que podrá haber opiniones a favor y en contra… Aún así, es bueno escucharlas todas y al que pueda le rebatiré y al que no le daré la razón.

– Fluidez del sistema: Si siguen por este camino muy buena.

– Posibilidades: cuando saquen los tablets arm con Windows 8, si funciona como debe funcionar y se integra como debe en la estructura de una empresa (Active Directory y demás) y viendo el ecosistema Windows Phone, incluso ahora con la versión 7, Microsoft se ha decidido a apostar por una plataforma total, mucho mas integrada y personalizable que otras soluciones, y perdónenme los “appleboys” ya que hablo sin haber tocado ni macs ni iphones ni ipads. Con la plataforma de Microsoft se podrá tener todo absolutamente conectado y la política de utilizar las cuentas de hotmail para poder entrar a los sistemas es una buena idea, integrándolo con todas las utilidades de Microsoft (Office Web Apps, Skydrive, etc…)

– Metro: Para el uso que le estoy dando yo (un menú de inicio a pantalla completa, básicamente), genial, tengo los accesos directos colocaditos en una sola pantalla y todos ordenados, mas información y programas en un sitio central. En cuanto a las aplicaciones Metro… a la Windows Store le falta rodaje, y sobre todo que vayan apareciendo las aplicaciones “estilo Metro” más importantes, Facebook, Twitter, no estaría mal poder usar Whatshapp o Viber o similares.

-Aplicaciones: Ahora mismo ninguna de las que utilizaba en Windows 7 no funciona en Windows 8, por lo que la transición al nuevo sistema ha sido como un formateo más.

– Antivirus: Windows 8 ya trae integrado un antivirus con Windows Defender. Para mi de momento y en lo que lo pruebo esta bien y me es suficiente, antes utilizaba soluciones gratuitas (Avira, Avast, AVG…) por lo que la diferencia es poca, aunque eso de tener las actualizaciones centralizadas en Windows Update Services mola… Guiño