Instalar windows en un disco externo para usarlo en un Mac con UEFI

Os dejo tres buenas ofertas de discos USB externos para instalar windows, dos SSD que es la mejor opción si tenéis USB 3 o superior y uno con disco normal para los que queráis ahorrar o no tengáis USB 3.

Ayer se me presentó la necesidad de instalar Windows en un disco externo SSD para usarlo con Bootcamp y así no perder ni un mega de los preciados 512 que tiene el nuevo MacBook Pro 2016.

Probé muchas soluciones que hay por ahí, pero ninguna llegó a solucionarme el problema por si solo. Tras 4 horas de intentos la suma de pasos de varios sitios me solucionó el problema y por eso os los pongo aquí, para que os solucione el problema y para que no se me olvide a mi mismo.

En mi caso parto con un macbook que tiene vmware instalado con Windows 10 virtualizado para hacer la parte de windows. Necesitaras un ratón y teclado externo porque el trackpad y el teclado del nuevo MacBook Pro 2016 no funcionan hasta que no se instalan los drivers.

  • En el Mac
    1- Formatea el disco donde vas a instalar windows como Fat32 con la tabla de particiones GUID.
    2- Abre Boot Camp y en el menu superior, en acciones descarga los archivos de drivers para windows, los necesitarás una vez se haya instalado windows para que todo funcione correctamente.

  • En windows:
    1- Instalar en windows el paquete de instalación automático de windows 7 (no pasa nada que vayas a instalar un windows posterior) que puedes descargar desde aquí: https://www.microsoft.com/en-us/download/details.aspx?id=5753
    2- Abre la consola de windows pulsando el botón de inicio y escribiendo CMD, pero en lugar de hacerle clic con el botón izquierdo, hazlo con el derecho para poder seleccionar ejecutar como administrador.
    3- ejecuta ‘diskpart’ para entrar en este programa tipo MS-DOS y preparar el disco. Luego escribe ‘list disk’ para ver todos los discos que hay conectados. Verás que aparece uno o ninguno.
    4- Ahora es el momento de conectar el disco donde vamos a instalar windows a la máquina virtual. Una vez hecho esto vuelve a ejecutar ‘list disk’ y verás que aparece uno nuevo. En mi caso era ‘disco 1’
    5- Escribe ‘select disk 1’ (si tu disco es el disco 1),luego escribe ‘clean’ para limpiar el disco y dejarlo listo.
    6- Con la orden ‘convert gpt’ haremos que el disco tenga la tabla de particiones adecuada.
    7- Creamos la partición de arranque con ‘create partition EFI size=100’ (tendrá 100mb) y la formaremos en fat32 con ‘format quick fs=fat32 label=EFI’ y una vez haya terminado le asignamos la letra S con el comando ‘assign letter=S’
    8- Escribe ‘create partition primary’ para crear la partición de windows y la formatearemos en ntfs ‘format fs=ntfs quick label=W2G’ escribiendo ‘assign letter=E’
    9- Una vez hayamos terminado escribiremos ‘exit’ y ya tendremos el disco y sus particiones preparadas.

  • Preparamos los archivos de la instalación
    1- Ve a la carpeta ‘C:\program files\Windows AIK\Tools\Amd64\’ con el explorador de windows y copia el archivo imagex.exe a ‘C:’
    2- Carga la imagen de disco de windows 10 en la máquina virtual desde el menú Maquina Virtual – CD/DVD
    3- En la ventana de comandos escribe: ‘C:\IMAGEX.EXE /APPLY D:\sources\install.wim 1 E:\’ Este proceso tardó en mi caso 20 minutos. Lo que hace es copiar los archivos de la instalación al disco que hemos creado. Cuando acabe vamos al paso 4.
    4- Ejecuta ‘E:\Windows\System32\bcdboot E:\Windows /s S: /f UEFI’ con esto copiaras los archivos necesarios para que el disco sea capaz de arrancar.
    5- Ahora cerramos todo, reinciamos el Mac con la tecla OPCIÓN (Alt) pulsada y si todo ha ido bien podrás seleccionar el disco amarillo titulado EFI para que acabe la instalación de windows.

Espero que te haya servido. Cualquier cosa, a los comentarios y si puedo contestarla lo haré.

Testimonio de anulación

Hoy he asistido a un testimonio no buscado de muchas mujeres, en tantos pueblos perdidos. A través de sus palabras exentas de rencor o de odio describía su día a día con su marido. Ella lo contaba con la naturalidad de una vida marcada por muchos surcos que ahora forman pliegues en su cara.

Cosas que ocurren de puertas adentro, donde no hay nadie más que ella, su marido y la sombra de una dignidad que se esconde cuando aparece él. Falsa hombría desgraciada que lo arruina a él y a ella, quienes un día se dieron un sí con la ilusión de una juventud ingenua.

¿Dónde ha quedado aquella ilusión? Se ha transformado en entrega de vida abnegada que por fuerza del espíritu no pierde la alegría ni la ilusión por un nuevo día.

Duchas con ropa para no gastar en lavadora. Ropa vieja para ahorrar. Cabezonería inútil de hombre sin hombría. Reproches de “no tienes nada si no es lo mío” que no hacen más que poner de manifiesto la pobreza de espíritu de ese ser que, a base de sus carencias, ha forjado una mujer de hierro. Buscando sólo el bien de su marido lo engaña en cosas pequeñas para que vaya bien vestido y aseado, para que lleve una digna y apropiada que ella no se merece. Que guarda en sus ojos cansados la mugre de su casa para que nadie pueda decir jamás, “mira, ese hombre, un bandido”.

Lección de vida que marca la mía, y que sin conocerla, solo por sus palabras, que contaban con cariño escenas de sufrimiento, despiertan en mi nada más que admiración e incluso amor.

Empezar con la Domótica II

Definición

La primera pregunta que debemos respondernos es ¿Qué es la Domótica?

Segun la escueta definición de la RAE:

Conjunto de sistemas que automatizan las diferentes instalaciones de una vivienda.

A esta definición que es correcta en parte le falta una puntualización muy importante: la información y la monitorización, por lo que yo la definiría así:

Conjunto de sistemas que informan, monitorizan y automatizan las diferentes instalaciones de una vivienda.

Desgranando la definición

Informan

Diferentes tipos de sensores se encargan de recoger toda la información que nos es de interés sobre nuestra vivienda para almacenarla para su posterior uso.

Los sensores más habituales son: luminosidad, presencia, inundación, temperatura, gas, humo,…

Al al mismo tiempo, la información instantánea de estos sensores pueden lanzar determinadas acciones sobre la instalación. Por ejemplo: si el detector de humo alcanza un valor determinado de presencia de humo en una instancia puede iniciar el sonido de una alarma y el envío de un mensaje al cliente.

Monitorizan

La información procedente de estos sensores que es almacenada constantemente puede analizarse de manera que nos ayude a entender cómo funciona nuestra vivienda y como un cambio en un sistema provoca una reacción en otra.

Por ejemplo, abrir una ventana porque es necesario ventilar según nuestro sensor de contaminación provoca un cambio de temperatura que activará ciertos sistemas de climatización que tienen una repercusión directa en el consumo de electricidad.

Esta es una de las partes de la Domótica menos explotada y que sin embargo es la más importante porque si se presentan los datos de la forma adecuada los usuarios podemos entender mejor cómo funcionan nuestras casas y actuar de manera más eficiente dejando de lado falsas creencias.

Automatizan

Es la parte más evidente, la Domótica nos permite automatizar cosas, pero esto no tiene nada que ver con encender luces con el móvil. Tiene que ver con que se enciendan ellas solas cuando tú las encenderías para que no tengas que hacerlo, suena a ciencia ficción, lo sé. Pero si no conseguimos esto no estamos haciendo nada.

Repercusiones

Al invertir en una instalación Domótica ya sea completa o parcial se inicia un proceso que acabara provocando varias cosas: conocerás mejor el funcionamiento de tu casa, mejoraras la seguridad de la misma, optimizaras el uso de la energía y ahorrarás esfuerzo dejando que determinadas cosas ocurran por sí solas.

¿Qué es HomeKit?

Desde hace un par de años varias marcas estaban preparando sus propios sistemas domóticos, cada uno de ellos con su propio protocolo y su propia App. Si tenias dos enchufes de distintas marcas tenias que manejarlos con apps distintas.

Ante este panorama Apple desarrollo HomeKit, un sistema de unificación que permite que todos los dispositivos sean usados con cualquier App que use HomeKit independientemente del fabricante y además que Siri pueda interactuar con todos los dispositivos.

Dispositivos que son compatibles y que pueden adquirirse en España a día de hoy: Philips Hue, Elgato Eve, Netatmo,…

Alternativas

Hay otras iniciativas para conseguir esta integración: Samsung Smarthing y Amazon Echo son los más importantes. Aunque poco os puedo contar de estos porque uso iPhone y mi plataforma es HomeKit.

Ademas, Amazon es muy dura cuando apuesta por algo y lo mantiene mucho tiempo, pero Samsung es muy dada a no poner toda la carne en el asador y dejar tirado al personal si no es rentable para ellos. Así que, si no cambia nada, HomeKit tiene muchas papeletas para ser apuesta ganadora.

Por otro gro lado los dispositivos compatibles con HomeKit suelen ser compatibles con otros sistemas android así que no hay mucho problema si cambiáis de plataforma en el futuro.

Empezar con la Domótica

¿Quién no ha oído hablar de Domótica a día de hoy? Lo normal es pensar que es algo que tiene buena pinta porque puedes automatizar luces, enchufes, … Pero que es algo de casas nuevas o de gente con mucho dinero.

Os voy a ir contando como lo he ido haciendo yo para ir introduciéndome en el mundo de la Domótica a bajo costo pero con un funcionamiento impecable.

Para seguir mi guía necesitarás lo siguiente:
– Un iPhone, porque todo está basado en la plataforma HomeKit de Apple.
– (opcional) Un AppleTV, que hará de enlace entre la casa e Internet. Es necesario si queremos poder controlar el sistema desde el exterior: comprobar si nos hemos dejado algo encendido, encender algo antes de llegar o apagar todo si nos vamos de casa. Por supuesto el nuevo Apple TV es genial para muchas cosas más: ver pelis, series, vídeo consola…
– Nuestro primer accesorio domótico: un enchufe que podemos programar, encender/apagar a distancia y que además nos permite conocer el consumo instantáneo e histórico de lo que haya enchufado, muy útil para estufas y otros aparatos que pueden hacer que se nos vaya de las manos la factura de la luz.

Yo lo tengo desde octubre de 2015 y no tengo ninguna queja. Podéis comprarlo haciendo clic en el siguiente enlace:

http://www.amazon.es/dp/B016IOFQPA/?tag=rafarq-21

En el próximo artículo os explico cómo configurar la casa, así os doy tiempo para ir comprando el enchufe como mínimo.

Mis mejores compras

De vez en cuando os pondré unos cuantos enlaces con lo que considero que son mis mejores compras, como no, de tecnología.

Hoy os traigo tres productos:

Una bateria externa para el iPhone que se carga con el cable lightning del iPhone, por lo que no tienes que llevar mas cables encima. Además tiene para casi cuatro cargas enteras:

Y mi querido NAS. Este es el mejor regalo que me han hecho. El verano pasado me lo compró mi mujer por mi cumpleaños. Es el NAS mas barato que hay pero en funcionalidad esta a la altura de los mas caros.

Le tengo puesto un disco duro de 3TB y el se encarga de hacer descargas de torrents, además de que tiene una app tipo dropbox con la que tener tu nube gratis sin limite de almacenamiento ni cuotas mensuales.

Este enlace es para un disco de 3TB especial para NAS, por poco mas de 200€ podéis tener un NAS y un disco de 3TB para crearos fácilmente vuestra propia nube. Además no hay que saber nada de informática, os va guiando en la configuración.

Espero que os haya gustado la selección.

[GC] Seleccionar todos los elementos que dependen de un nodo

Esta semana me he encontrado con un problema común que voy a simplificar para explicarlo aquí de manera más sencilla. Suponemos que tenemos una línea sobre la que queremos poner puntos, esos puntos serán el centro de una serie de círculos. Algo así:

circ1

Este es el código correspondiente para generar el círculo:

node User.Objects.circle01 Bentley.GC.Features.Circle
{
    Technique                 = 'ByCenterRadius';
    CenterPoint               = {point02, point03, point04, point05};
    Radius                    = 3;
    Support                   = baseCS.XYPlane;
    GraphLocation             = <auto> {1080.0, 40.0};
}

El problema es que si los puntos los dibujamos manualmente luego debemos seleccionarlos uno a uno para hacer los círculos de manera replicable. Esto esta bien cuando hay pocos puntos, o cuando se saben cuantos se van a hacer desde el principio.

Si quiero añadir más puntos ahora debería añadirlos manualmente, y luego editar la lista anterior para que el nodo círculo lo tenga en cuenta. De nuevo, esto está bien si tengo que agregar pocos puntos.

Hay otra manera más “inteligente” y rápida de hacerlo: Seleccionar los puntos cuya dependencia cuelga de la línea o lo que es lo mismo seleccionar los sucesores de la recta.

Seleccionar los sucesores de una recta

Esto se hace accediendo a la propiedad ‘GetSuccessors’ que tienen todos los nodos de la siguiente manera:

line01.GetSuccessors(false)

El resultado será este:

{circle01, point05, point04, point03, point02}

El problema es que el círculo que estamos creando es también un sucesor de nuestra línea, por lo que debemos deshacernos de el y sacarlo de la lista para que el nodo círculo pueda funcionar, ya que busca puntos sobre los que hacer las circunferencias. La funcion ‘RemoveAt’ que es la que usaremos para borrar el elemento de la lista necesita saber el índice del elemento que queremos quitar, por tanto usaremos la funcion ‘IndexOf’.

Por pasos, con la funcion ‘indexOf’ obtenemos el índice del círculo en la lista:

IndexOf(lista, elemento)
IndexOf(line01.GetSuccessors(false),circle01)

En este caso el índice que arroja es ‘0’.

Ahora usamos la funcion ‘RemoveAt’ para eliminar el elemento de la lista, para que sea dinámico, en lugar de usar el 0, se usará la funcion ‘IndexOf’ completa:

RemoveAt(lista, índice)
RemoveAt(line01.GetSuccessors(false),IndexOf(line01.GetSuccessors(false),circle01))

El resultado es, por tanto:

{point05, point04, point03, point02}

El nodo quedará definido por:

node User.Objects.circle01 Bentley.GC.Features.Circle
{
    Technique                 = 'ByCenterRadius';
    CenterPoint               = RemoveAt(line01.GetSuccessors(false),IndexOf(line01.GetSuccessors(false),circle01));
    Radius                    = 3;
    Support                   = baseCS.XYPlane;
    GraphLocation             = <auto> {1080.0, 40.0};
}

Descargar el ejemplo en GCT

La portada del PFG

Esta es la imagen de fondo de la portada de mi proyecto fin de grado:
Model

Variables

  • altura: altura del modelo en el eje Y.
    • Inicio: 0 mm
    • Final: 100 mm
    • Paso: 0 mm
  • giro: giro de los cuadrados
    • Inicio: 0 mm
    • Final: 100 mm
    • Paso: 0 mm
  • apertura: tamaño de los cuadrados
    • Inicio: 0 mm
    • Final: 100 mm
    • Paso: 0 mm

Y esta es la animación de cómo se mueven los cuadrados cambiando los parámetros que dejé libres:

Desarrollo del modelo generativo

En primer lugar se hace una matriz de puntos de 20×10 puntos a partir de una serie de puntos en diagonal al que se le aplica una replicación.

transaction modelChange 'Add point01'
{
    node User.Objects.point01 Bentley.GC.Features.Point
    {
        Technique                 = 'ByCartesianCoordinates';
        CoordinateSystem          = baseCS;
        XTranslation              = Series(0,80,4);
        YTranslation              = Series(0,40,4);
        ZTranslation              = 0;
        Origin                    = null;
        Replication               = ReplicationOption.AllCombinations;
        GraphLocation             = <auto> {300.0, 40.0};
    }
}

A partir de esta matriz de puntos se crea un conjunto de polígonos que usa los puntos como vértices.

transaction modelChange 'Add polygon01'
{
    node User.Objects.polygon01 Bentley.GC.Features.Polygon
    {
        Technique                 = 'ByPointGrid';
        Points                    = point01;
        Fill                      = false;
        SkipAlternates            = false;
        FacetOption               = FacetOption.Quads;
        PlaneIndex                = 1;
        TextStyle                 = null;
        UClosed                   = false;
        VClosed                   = false;
        GraphLocation             = <auto> {560.0, 40.0};
    }
}

Se calcula el centroide de cada polígono y usandolo como comienzo se traza una línea en la dirección del eje Z cuya longitud depende de la distancia a otro punto que se usará como atractor que se llama “point02”, es la línea “line01”.

transaction modelChange 'Add point02'
{
    node User.Objects.point02 Bentley.GC.Features.Point
    {
        Technique                 = 'CentroidOfSet';
        SetToFindCentroidFrom     = polygon01.Vertices;
        GraphLocation             = <auto> {820.0, 40.0};
    }
}

transaction modelChange 'Add point03'
{
    node User.Objects.point03 Bentley.GC.Features.Point
    {
        Technique                 = 'ByCartesianCoordinates';
        CoordinateSystem          = baseCS;
        XTranslation              = <free> 12.0569421656741;
        YTranslation              = <free> 16.1699104640786;
        ZTranslation              = <free> -9.03728241466236;
        Origin                    = null;
        GraphLocation             = <auto> {820.0, 180.59};
    }
}

transaction modelChange 'Add altura'
{
    node User.Objects.altura Bentley.GC.Features.GraphVariable
    {
        Technique                 = 'EvaluateExpression';
        Value                     = 25;
        LimitValueToRange         = true;
        RangeMinimum              = 0.0;
        RangeMaximum              = 100.0;
        RangeStepSize             = 0.0;
        GraphLocation             = <auto> {1080.0, 40.0};
    }
}

transaction modelChange 'Add line01'
{
    node User.Objects.line01 Bentley.GC.Features.Line
    {
        Technique                 = 'ByStartPointDirectionLength';
        StartPoint                = point02;
        Direction                 = baseCS.ZDirection;
        Length                    = Distance(point02,point03)/4-altura;
        GraphLocation             = <auto> {1080.0, 40.0};
    }
}

En cada centroide se coloca, además, un sistema de coordenadas que toma como base el sistema de coordenadas principal y le aplica un giro definido con la fórmula:

transaction modelChange 'Add coordinateSystem01, giro'
{
    node User.Objects.giro Bentley.GC.Features.GraphVariable
    {
        Technique                 = 'EvaluateExpression';
        Value                     = 27.0;
        LimitValueToRange         = true;
        RangeMinimum              = 0.0;
        RangeMaximum              = 100.0;
        RangeStepSize             = 0.0;
        GraphLocation             = <auto> {1340.0, 40.0};
    }
    node User.Objects.coordinateSystem01 Bentley.GC.Features.CoordinateSystem
    {
        Technique                 = 'ByOriginRotationAboutCoordinateSystem';
        Origin                    = point02;
        CoordinateSystem          = baseCS;
        RotationAngle             = line01.Length*giro;
        Axis                      = AxisOption.Z;
        GuideRadius               = 1.0;
        GraphLocation             = <auto> {1600.0, 40.0};
    }
}


line01.Length*giro

Por lo que el giro dependerá, además de la variable giro, de la longitud de la línea 01.

Se trazan cuatro puntos a partir del centroide basados en el sistema de coordenadas girado que formarán los vértices de un nuevo polígono. La distancia entre estos puntos está determinada por la variable apertura que divide a la longitud de la línea 01:

line01.Length/apertura

node User.Objects.point04 Bentley.GC.Features.Point
    {
        Technique                 = 'ByDirectionAndDistanceFromOrigin';
        Origin                    = point02;
        Direction                 = coordinateSystem01.XDirection;
        DistanceFromOrigin        = line01.Length/apertura;
        GraphLocation             = <auto> {1860.0, 40.0};
    }
    node User.Objects.apertura Bentley.GC.Features.GraphVariable
    {
        Technique                 = 'EvaluateExpression';
        Value                     = 5;
        LimitValueToRange         = true;
        RangeMinimum              = 0.0;
        RangeMaximum              = 100.0;
        RangeStepSize             = 0.0;
        GraphLocation             = <auto> {2120.0, 40.0};
    }
    node User.Objects.point05 Bentley.GC.Features.Point
    {
        Technique                 = 'ByDirectionAndDistanceFromOrigin';
        Origin                    = point02;
        Direction                 = coordinateSystem01.YDirection;
        DistanceFromOrigin        = line01.Length/apertura;
        GraphLocation             = <auto> {2380.0, 40.0};
    }
    node User.Objects.point06 Bentley.GC.Features.Point
    {
        Technique                 = 'ByDirectionAndDistanceFromOrigin';
        Origin                    = point02;
        Direction                 = coordinateSystem01.XDirection;
        DistanceFromOrigin        = -line01.Length/apertura;
        GraphLocation             = <auto> {2380.0, 40.0};
    }
    node User.Objects.point07 Bentley.GC.Features.Point
    {
        Technique                 = 'ByDirectionAndDistanceFromOrigin';
        Origin                    = point02;
        Direction                 = coordinateSystem01.YDirection;
        DistanceFromOrigin        = -line01.Length/apertura;
        GraphLocation             = <auto> {2380.0, 40.0};
    }
}

transaction modelChange 'Add polygon02'
{
    node User.Objects.polygon02 Bentley.GC.Features.Polygon
    {
        Technique                 = 'ByVertices';
        VertexPoints              = { point06, point07,point04, point05};
        Fill                      = false;
        ForcePlanar               = false;
        PlaneIndex                = 1;
        TextStyle                 = null;
        Key                       = "";
        GraphLocation             = <auto> {2640.0, 40.0};
    }
}

Mi primer repositorio en github

Aunque es un proyecto sencillo, resuelve para mi un problema que tenia en casa: Saber cual es la ip externa de mi conexión y sobre todo, si esta cambia, recibir una notificación con la nueva IP.

Para ello hago uso de la raspberry Pi que tengo en casa con un sencillo script que podéis encontrar en https://github.com/rafarq/pushIP

Os dejo la explicación completa del script que he escrito para GitHUB.

pushIP

Get a push notification via PushOver when your computer changes its public IP.

1. Why?

Because I have a Raspbery Pi in my home where I have some tools. I want them to be accesible from the internet. I can’t use ddns, so, I want to be notified when it changes in my phone.

2. What do you need?

  • An account on PushOver.net
  • A linux/mac computer
  • An android/iOS device with pushover App.

3. How to make it work

Put all the files on your home directory, in my case it was /home/pi/. This is going to be yours if you use a raspberry pi like me.

Make the script executable and the file currentIP.txtaccesible with the command:

chmod 777 currentIP.txt script.sh

3.1 Edit the script

First of all you have to edit the script file in te repository to match your personal data:

3.1.1 Paths

You have to give the script the path to the currentIP.txt file on lines #14 and #35 Note that the user that runs the script must give write access to the file.

3.1.2 PushOver

Make an account on pushOver and create a new application to hold all the push notifications. You have to write in the script these:

  • token: line #31. Write here the app token
  • user: line #32.

Customize the message that you will reicive with the notification on line #33 changing the string la nueva IP esfor your text.

--form-string "message=la nueva IP es $IP" \

Now if you fire it with sh script.shit will send you the current IP but we want this to be done by itself when we are not at home so we are going to use crontab.

4. Automating the script

To make your linux box to check IP changes you can use crontab. crontab -e

You get the file where you cron jobs are listed. Add a new line at the end of the file like this: */30 * * * * sh /home/pi/script.sh

It will run the script.shat hour:30 minutes and at o’clock hours: 12:00-12:30-13:00-13:30—–and so on.

If the IP changes you will reicive the notification with the new IP, if not it will wait for another 30 minutes.

If you want to know more about crontab to setup another configuration, please refer to:

5. Me

I’m @rafarq on twitter. I would appreciate to know about you If you find this script useful for you.