Acerca de Jose Antonio

Yo soy el que manda aqui... ¿Que pasa?

Mac os en mi Ubuntu

Llevo varios años desarrollando aplicaciones móviles, la última nomorepass, y me encuentro siempre en la tesitura de tener que compilar la aplicación en un mac nativo. Supongo que eso es un peaje que Apple pide por «dejarte» usar ios, pero es que gastarse unos cuantos miles de euros solo para compilar una aplicación es bastante aberrante.

CREATOR: gd-jpeg v1.0 (using IJG JPEG v80), quality = 82

Hace unos años me compré un macbook pro de 15″ que me ha dado buen servicio hasta hace cosa de tres años en que falló el chip gráfico de nvidia y el servicio técnico me cambió la placa entera (700 Euros) y me querían cobrar otros 400 si se me ocurría reclamar mi placa vieja… Negociazo redondo para apple cuando cambie un chip y le endose la misma placa a otro ingenuo… En fin, que se me han quitado las ganas de comprar un apple y el que tenemos en la oficina es un poco «lento» y tarda una eternidad en compilar un simple proyecto (más con cada actualización del sistema operativo). Por esto he estado intentando de todas las maneras posibles poder hacer esa compilación en una máquina profesional de verdad que corriese linux.. He intentado hackintosh, he intentado virtualbox, etc… Hasta que hace poco encontré que se puede instalar una versión de mac en qemu… Una versión genuina, sin modificar… Y dicho y hecho…

Forma sencilla

La forma más sencilla de instalar mac os (Catalina) en un Ubuntu es instalar el paquete snap sosumi. Os recomiendo mucho que echéis un vistazo a este video, ya que explica todo con cierta profundidad. Básicamente esto es lo que necesité hacer:

sudo snap install sosumi

Una vez instalado (es rápido), se puede ejecutar incluso desde el lanzador de aplicaciones buscando sosumi. La primera vez que se lanza te mostrará la pantalla de recuperación y deberás abrir el programa Disk Utility para dar formato al disco virtual (inicialmente le da una capacidad limitada, pero puedes ampliarlo antes de hacer este paso):

En Disk Utility selecciona el primer disco y dale formato con la opción Erase… Ponle el nombre que quieras (por ejemplo MacHD) y debería quedar algo así:

Luego, cierra la aplicación y ves a la opción de Reinstalar macOS… Y listo para instalar

Aceptas la licencia y seleccionas el disco para instalar y eso es todo… Tendrás una máquina con macOS catalina lista para ejecutar.

Hay algunas cosillas interesantes a hacer como cambiar la resolución de la pantalla, para eso os recomiendo que sigáis este procedimiento, o aumentar la memoria o los cores que se hace editando el archivo ~/snap/sosumi/common/launch y teniendo cuidado en no poner cosas disparatadas.

El mayor problema que me he encontrado con este método es que no he conseguido actualizarlo a la nueva versión Big Sur, por lo que su utilidad queda un poco limitada. Sin embargo, he encontrado un método (un poco rebuscado, eso si) para instalar BigSur en qemu y poder utilizar mi máquina linux para compilar con xcode… Pero eso si, os lo contaré cuando lo tenga un poco más pulido

Chrome, proxys y formularios inseguros

El título de esta entrada se parece «curiosamente» al título de una película de miedo… Y al principio eso es lo que es, ya que desde el lunes estoy recibiendo esta pantalla en mi chrome cada vez que meto una incidencia en mi redmine:

El caso es que luego le dabas al botón de enviarlo de todas formas y la cosa funcionaba normalmente… Eso si, era sumamente molesto y tenía clientes que accedían a poner sus incidencias y no era plan tener que explicarles a todos que no es que ahora fuésemos menos seguros que antes, sino que chrome había activado una funcionalidad nueva.

Esa funcionalidad, que estaba prevista para chrome 86, pero que se activó con chrome 87 hace que cuando los datos de un formulario se envíen a una página que no tiene https activado se de la advertencia de que cualquiera podría interceptar los datos… Me parece muy buena advertencia, pero ¡Espera! todo el tráfico de mis webs ya va por https, ¿cómo es que recibo esa advertencia?

Según la especificación de chrome esto solo debía pasar si el formulario llevaba a una página no segura, así que revisé las etiquetas form y vi que eran rutas relativas (y si es relativa dentro de una página https debería llevar a una página https), así que decidí revisar el camino completo usando el inspector de chrome donde, efectivamente, vi que la petición se realizaba a una página https pero descubrí que el campo Location que aparecía en los headers de la petición venía como http y no https, ¿cómo podía ser?

Pues resulta, después de mucho buscar, que la gestión del https la estaba haciendo mediante un proxy inverso en apache y, parece ser, que la directiva ProxyPassReverse modifica el host del Location, pero no el protocolo. Por suerte esto tiene fácil solución y basta con incluir esto en el VirtualHost:

RequestHeader set X-Forwarded-Proto "https"

Antes de hacerlo no os olvidéis de añadir el módulo:

sudo a2enmod headers

Con esto ya conseguiremos que el proxy no confunda a chrome y que desaparezca el molesto mensaje…

Medio siglo

Hoy (ayer para cuando salga este post) cumplo 50 años, no es que quiera que me felicitéis ni nada, la verdad a mi los cumpleaños solo me sirven para medir el tiempo… Y resulta que llevo medio siglo ya en este mundo. Si miramos un poco atrás, a finales del siglo XIX la esperanza media de vida era de 48 años y menos si nos echamos un poco más para atrás. Así que si yo fuese un habitante de la tierra de hace doscientos años estaría ya al final de mi vida útil.

Esto da que pensar, aunque considero que todavía me quedan muchísimas cosas que hacer y mucho que aportar todavía, quizá este pequeño hito (y el hecho de que Google se haya caído a nivel mundial) me sirvan para recordar un poco cómo han cambiado las cosas desde hace medio siglo hasta ahora. De hecho, simplemente viendo cómo han cambiado mis hábitos ya se puede uno hacer una idea de lo mucho que ha cambiado nuestro entorno en unas pocas décadas.

Lo más importante, para mi, es el hecho de contar con internet. Si, cuando yo estudiaba no había internet, de hecho yo fui uno de los pioneros en tener correo electrónico ya en 1988 (estaba en un grupo de investigación de la facultad) y pasé gran parte de mis estudios en la facultad de informática asistiendo al despliegue cada vez mayor de la red de redes. Hasta la llegada de la web (no confundir con internet, que se tardaron unos añitos en inventar el http, html y los navegadores) cuando querías estar informado de algo tenías que recurrir a la biblioteca (si, con sus fichitas en cartulina y eso), a los documentales de la tele (si, alguno se veía entonces también) o a las revistas especializadas. Tengo que decir que yo no era un gran fan de la biblioteca y sin embargo devoraba las revistas de informática (y hasta conseguí ser el editor de la revista del club de informática de mi facultad.

El problema con internet ha sido que la información que se encuentra se ha vuelto demasiado abundante y muy poco contrastada. Las fake news y el dar pábulo a cualquier cantamañanas ha convertido la mayor y mejor tecnología que el ser humano haya desarrollado hasta el momento en un arma de destrucción masiva. Una pena.

Otra cosa que ha cambiado, y mucho, mis hábitos y los de todo el mundo es la llegada del teléfono móvil. Tuve que esperar a 1996 para tener mi primer teléfono móvil y eso me cambió la vida. Nunca más quedarse tirado en la carretera sin poder avisar a nadie, nunca más no saber dónde esta alguien a quien esperas, etc… Todo ventajas, eso si, el precio de la época no era de lo mejor que te podías encontrar y el GPRS que era lo mejor que podías conseguir en datos tampoco es que fuese demasiado útil para transferir datos, pero nada que un SMS no pudiese arreglar. Después ya vinieron los smartphones, el 3G, el 4G y ahora el 5G… Y todo el mundo con su móvil en el bolsillo enganchado a internet.

Los ordenadores, que me deslumbraron desde que mi padre se compró su primer VIC-20, que él usaba para jugar al ajedrez y que yo programaba con sus 3KB de memoria, se han convertido actualmente en una commodity. No hay evolución real en su arquitectura sino que seguimos la ley de moore, frenada por la avaricia empresarial o la oportunidad comercial. He tenido un commodore VIC20, un amstrad cpc 64, un PC compatible con un NECV20 y todos los siguientes procesadores intel y amd (incluso cyrix), pero al final ya todo se resume en una arquitectura fija donde cambia lo comprimidos que están los elementos y el coste de lo que queramos gastarnos. El formato: portatil, sobremesa, da igual, quien no tiene hoy en día un ordenador se queda sin poder hacer muchas cosas… Pero todo cambiará con la computación cuántica, ¿o no?

En estos años he vivido momentos históricos: la llegada de la democracia, la caída del muro de Berlín, crisis importantes: la burbuja .com, las subprime y ahora la covid-19 (entre otras), donde parece que siempre se avanza para encontrarse un obstáculo mayor. No me puedo quejar de cómo he superado estas crisis, pero lo que si me han ayudado es a averiguar un poco mejor quienes son buenas personas y quienes simplemente están por el interés… Aunque últimamente casi empiezo a pensar que merecemos la extinción como especie por nuestra cerrazón.

He sido aficionado a pocas cosas, una de ellas – la fotografía – ha cambiado demasiado para mi gusto. Estuve muchos años con una cámara reflex completamente manual (una Zenit 12) con un objetivo de 45mm aprovechando cada foto (revelarlas era caro de narices), cuando tuve un poco de dinero me compré una DSLR Nikon D15 que me dió muchísimas satisfacciones hasta que me cargué la película reflectante del visor intentando limpiarla; pero con el advenimiento de las cámaras mejores y el almacenamiento casi ilimitado de fotografías digitales ya no me merece la pena sacar la D90 por la que la sustituí y me tengo que conformar con hacer los miles de fotos que todo el mundo saca con su móvil en la mano. Ahora parece que solo usan cámaras «profesionales» los youtubers o instragrammers que, aunque no tienen ni idea de hacer fotografía, a base de captar adeptos han conseguido un material que saca las mejores imágenes por ellos.

En fin, no sabemos lo que nos deparará el futuro y solo nos queda aferrarnos a las cosas que nos ofrecen algo, un sentimiento, una evocación, una posibilidad de desarrollo y no soltarla hasta que encontremos otra que lo supere… Así que, ¡vamos a por el otro medio siglo!

Añadir https y let’s encrypt a tu aplicación con docker

Una vez que hemos empezado a «dockerizar» aplicaciones, y antes de saltar al siguiente nivel (kubernetes por ejemplo) nos encontramos con la necesidad de pasar a produccion las aplicaciones que vamos desarrollando y, quizá, utilizar un gestor como Kubernetes nos haga más complicado utilizar https. Hay dos soluciones principales que he utilizado para distintos servicios y que os voy a comentar muy brevemente aquí: usar apache como proxy inverso instalado en la máquina host o utilizar un docker con el proxy inverso en nginx.

Para los dos casos vamos a suponer que tenemos un contenedor docker con una aplicación web que tenemos expuesto en el puerto 8080 (por ejemplo).

Método 1: Apache Nativo

Empecemos por el primer sistema, el que primero se me ocurrió y que tiene sus ventajas y sus inconvenientes. Básicamente consiste en instalar de manera nativa el servidor apache, el módulo mod_proxy y hacer que actúe como un proxy inverso para los dominios que necesitemos. Os explico los pasos suponiendo que estáis instalando en una máquina ubuntu recien provisionada:

sudo apt-get install -y apache2 libapache2-mpm-itk
sudo a2enmod rewrite
sudo ufw allow in "Apache Full"
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install -y python-certbot-apache
sudo service apache2 restart

Llegados a este paso debemos crear un archivo de configuración para la aplicación web y dejarlo en /etc/apache2/sites-available/misitio.conf algo como esto:

<VirtualHost *:80>
	ServerName www.misitio.com
	AssignUserId miusuario miusuario

	ServerAdmin info@la-demo.com
	DocumentRoot /home/miusuario/web

	<Directory /home/miusuario/web>
                Options FollowSymLinks
                AllowOverride All
                Require all granted
        </Directory>
</VirtualHost>

Lo relevante es el nombre del sitio y un directorio para las páginas, que no vamos a utilizar, pero que tiene que existir para las validaciones posteriores. En este caso estoy usando también el módulo itk para que se ejecute con un usuario sin privilegos. Posteriormente a esto ejecutamos:

sudo a2ensite misitio
sudo service apache2 restart

Con esto ya tendremos el servicio apache levantado y respondiendo a peticiones, por lo que podemos solicitar el certificado (recuerda que el dns del servicio debe apuntar a la dirección IP del servidor).

sudo certbot

Esto nos preguntará qué dominios queremos proteger y si todo ha ido bien nos generará un archivo midominio-le-ssl.conf que contendrá ya los enlaces a los certificados y configuración asociada. Con lo que ya podrías acceder a https://www.midominio.com

Ahora queda la parte en la que «conectamos» este servidor con nuestro docker que, recordemos, está corriendo en el puerto 8080, para ello modificaremos el archivo de configuración que nos ha creado certbot añadiendo estas líneas:

ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/

Reiniciamos apache y ya tenemos enganchado nuestro docker a https.

Método 2: docker que nos lo hace todo

Si el método anterior nos parece un poco pesado o no queremos tener que guardar la configuración particular de una máquina, podemos optar por añadir esto a nuestro archivo docker-compose (teniendo en cuenta que hemos llamado miservicio al servicio que tenemos en el 8080):

    https-portal:
        image: steveltn/https-portal:1
        depends_on:
            - miservicio
        ports:
            - 80:80
            - 443:443
        restart: always
        volumes:
            - ./ssl_certs:/var/lib/https-portal
        environment:
            DOMAINS: 'www.midonio.com -> http://miservicio:8080 #production' 

Y eso es todo, el servidor al levantarse se encarga de pedir los certificados y guardarlos en el directorio ssl_certs que será el único que tenemos que persistir para evitar tener que pedirlos cada vez que arranque el servidor.

Cada uno de los dos métodos tiene sus pros y sus contras (hacerlo en kubernetes es otra historia y no aplica ninguno de estos métodos), pero básicamente si queremos exponer más de un contenedor (en distintos docker-compose) la única manera es usar el proxy inverso nativo, si todo lo que queréis servir por https está en un solo docker-compose el segundo método es mucho más cómodo.